处理value引用问题 #1141 by CodFrm · Pull Request #1147 · scriptscat/scriptcat
Pull request overview
此 PR 修复了 GM_getValue、GM_setValue 和 GM_getValues API 中的对象引用问题(#1141)。当存储和检索对象类型的值时,原实现会导致返回的对象与内部存储共享引用,使得对返回对象的修改会意外影响存储的数据。
Changes:
- 将
GM_setValue中的JSON.parse(JSON.stringify(value))替换为structuredClone(value)进行深拷贝 - 在
GM_getValue中添加了对象类型检查,返回前使用structuredClone创建副本 - 在
GM_getValues的数组参数分支中添加了对象深拷贝逻辑 - 添加了完整的测试用例验证引用隔离行为
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| src/app/service/content/gm_api/gm_api.ts | 在 GM_getValue、GM_setValue 和 GM_getValues 中实现对象深拷贝,防止引用泄漏 |
| src/app/service/content/gm_api/gm_api.test.ts | 添加测试用例验证对象值的引用隔离,确保修改返回值不影响存储的数据 |
Comments suppressed due to low confidence (1)
src/app/service/content/gm_api/gm_api.ts:373
- 当
keysOrDefaults为 null 或 undefined 时,直接返回this.scriptRes.value会暴露内部存储的引用。这与本 PR 修复的引用问题相同。应该对返回的对象进行深拷贝,或者遍历所有键并逐个克隆对象类型的值。
if (!keysOrDefaults) {
// Returns all values
return this.scriptRes.value;
}