Skip to content

Commit 34c5607

Browse files
committed
GM value 代码相关调整
1 parent bd35bdf commit 34c5607

File tree

15 files changed

+527
-296
lines changed

15 files changed

+527
-296
lines changed

src/app/repo/scripts.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,12 @@ export interface ScriptSite {
9393

9494
export type ScriptAndCode = Script & ScriptCode;
9595

96+
export type ValueStore = { [key: string]: any };
97+
9698
// 脚本运行时的资源,包含已经编译好的脚本与脚本需要的资源
9799
export interface ScriptRunResource extends Script {
98100
code: string; // 原始代码
99-
value: { [key: string]: any };
101+
value: ValueStore;
100102
flag: string;
101103
resource: { [key: string]: { base64?: string } & Omit<Resource, "base64"> }; // 资源列表,包含脚本需要的资源
102104
metadata: SCMetadata; // 经自定义覆盖的 Metadata

src/app/service/content/content.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export default class ContentRuntime {
7777
let parentNode: EventTarget | undefined;
7878
// 判断是不是content脚本发过来的
7979
let msg: CustomEventMessage;
80-
if (this.contentScriptSet.has(data.uuid) || this.scriptExecutor.execMap.has(data.uuid)) {
80+
if (this.contentScriptSet.has(data.uuid) || this.scriptExecutor.execScriptMap.has(data.uuid)) {
8181
msg = this.scriptExecutorMsg;
8282
} else {
8383
msg = this.senderToInject;

src/app/service/content/exec_script.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import type { Message } from "@Packages/message/types";
77
import type { ValueUpdateDataEncoded } from "./types";
88
import { evaluateGMInfo } from "./gm_api/gm_info";
99
import type { IGM_Base } from "./gm_api/gm_api";
10-
import type { TScriptInfo } from "@App/app/repo/scripts";
10+
import type { ScriptRunResource, TScriptInfo } from "@App/app/repo/scripts";
11+
import { getStorageName } from "@App/pkg/utils/utils";
1112

1213
// 执行脚本,控制脚本执行与停止
1314
export default class ExecScript {
@@ -64,8 +65,22 @@ export default class ExecScript {
6465
this.sandboxContext?.emitEvent(event, eventId, data);
6566
}
6667

67-
valueUpdate(data: ValueUpdateDataEncoded) {
68-
this.sandboxContext?.valueUpdate(data);
68+
valueUpdate(storageName: string, uuid: string, responses: ValueUpdateDataEncoded[]) {
69+
const scriptRes = this.scriptRes;
70+
if (scriptRes.uuid === uuid || getStorageName(scriptRes) === storageName) {
71+
const context = this.sandboxContext;
72+
if (context) {
73+
const contextScriptRes = context.scriptRes as ScriptRunResource | null | undefined;
74+
if (contextScriptRes) {
75+
if (uuid === contextScriptRes.uuid || storageName === getStorageName(contextScriptRes)) {
76+
contextScriptRes.value = context.extValueStoreCopy || contextScriptRes.value;
77+
const valueStore = contextScriptRes.value;
78+
context.valueStoreUpdate(valueStore, responses);
79+
context.extValueStoreCopy = { ...valueStore };
80+
}
81+
}
82+
}
83+
}
6984
}
7085

7186
execContext: any;

src/app/service/content/gm_api/gm_api.test.ts

Lines changed: 81 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { compileScript, compileScriptCode } from "../utils";
66
import type { Message } from "@Packages/message/types";
77
import { encodeRValue } from "@App/pkg/utils/message_value";
88
import { v4 as uuidv4 } from "uuid";
9+
import { getStorageName } from "@App/pkg/utils/utils";
910
const nilFn: ScriptFunc = () => {};
1011

1112
const scriptRes = {
@@ -123,10 +124,14 @@ describe.concurrent("GM Api", () => {
123124
script.value = { test: "ok" };
124125
script.metadata.grant = ["GM.getValue"];
125126
script.code = `return GM.getValue("test").then(v=>v+"!");`;
126-
// @ts-ignore
127-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
127+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
128+
const mockMessage = {
129+
sendMessage: mockSendMessage,
130+
} as unknown as Message;
131+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
128132
exec.scriptFunc = compileScript(compileScriptCode(script));
129-
const ret = await exec.exec();
133+
const retPromise = exec.exec();
134+
const ret = await retPromise;
130135
expect(ret).toEqual("ok!");
131136
});
132137

@@ -135,10 +140,14 @@ describe.concurrent("GM Api", () => {
135140
script.value = { test1: "23", test2: "45", test3: "67" };
136141
script.metadata.grant = ["GM_listValues"];
137142
script.code = `return GM_listValues().join("-");`;
138-
// @ts-ignore
139-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
143+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
144+
const mockMessage = {
145+
sendMessage: mockSendMessage,
146+
} as unknown as Message;
147+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
140148
exec.scriptFunc = compileScript(compileScriptCode(script));
141-
const ret = await exec.exec();
149+
const retPromise = exec.exec();
150+
const ret = await retPromise;
142151
expect(ret).toEqual("test1-test2-test3");
143152
});
144153

@@ -151,22 +160,30 @@ describe.concurrent("GM Api", () => {
151160
script.value.test1 = "40";
152161
script.metadata.grant = ["GM_listValues"];
153162
script.code = `return GM_listValues().join("-");`;
154-
// @ts-ignore
155-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
163+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
164+
const mockMessage = {
165+
sendMessage: mockSendMessage,
166+
} as unknown as Message;
167+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
156168
exec.scriptFunc = compileScript(compileScriptCode(script));
157-
const ret = await exec.exec();
158-
expect(ret).toEqual("test5-test2-test3-test1"); // TM也沒有sort
169+
const retPromise = exec.exec();
170+
const ret = await retPromise;
171+
expect(ret).toEqual("test5-test2-test3-test1"); // TM也没有sort
159172
});
160173

161174
it.concurrent("GM.listValues", async () => {
162175
const script = Object.assign({}, scriptRes) as ScriptLoadInfo;
163176
script.value = { test1: "23", test2: "45", test3: "67" };
164177
script.metadata.grant = ["GM.listValues"];
165178
script.code = `return GM.listValues().then(v=>v.join("-"));`;
166-
// @ts-ignore
167-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
179+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
180+
const mockMessage = {
181+
sendMessage: mockSendMessage,
182+
} as unknown as Message;
183+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
168184
exec.scriptFunc = compileScript(compileScriptCode(script));
169-
const ret = await exec.exec();
185+
const retPromise = exec.exec();
186+
const ret = await retPromise;
170187
expect(ret).toEqual("test1-test2-test3");
171188
});
172189

@@ -179,11 +196,15 @@ describe.concurrent("GM Api", () => {
179196
script.value.test1 = "40";
180197
script.metadata.grant = ["GM.listValues"];
181198
script.code = `return GM.listValues().then(v=>v.join("-"));`;
182-
// @ts-ignore
183-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
199+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
200+
const mockMessage = {
201+
sendMessage: mockSendMessage,
202+
} as unknown as Message;
203+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
184204
exec.scriptFunc = compileScript(compileScriptCode(script));
185-
const ret = await exec.exec();
186-
expect(ret).toEqual("test5-test2-test3-test1"); // TM也沒有sort
205+
const retPromise = exec.exec();
206+
const ret = await retPromise;
207+
expect(ret).toEqual("test5-test2-test3-test1"); // TM也没有sort
187208
});
188209

189210
it.concurrent("GM_getValues", async () => {
@@ -212,10 +233,14 @@ describe.concurrent("GM Api", () => {
212233
script.value = { test1: "23", test2: 45, test3: "67" };
213234
script.metadata.grant = ["GM.getValues"];
214235
script.code = `return GM.getValues(["test2", "test3", "test1"]).then(v=>v);`;
215-
// @ts-ignore
216-
const exec = new ExecScript(script, undefined, undefined, nilFn, envInfo);
236+
const mockSendMessage = vi.fn().mockResolvedValue({ code: 0 });
237+
const mockMessage = {
238+
sendMessage: mockSendMessage,
239+
} as unknown as Message;
240+
const exec = new ExecScript(script, "content", mockMessage, nilFn, envInfo);
217241
exec.scriptFunc = compileScript(compileScriptCode(script));
218-
const ret = await exec.exec();
242+
const retPromise = exec.exec();
243+
const ret = await retPromise;
219244
expect(ret.test1).toEqual("23");
220245
expect(ret.test2).toEqual(45);
221246
expect(ret.test3).toEqual("67");
@@ -499,7 +524,7 @@ describe.concurrent("GM_value", () => {
499524
api: "GM_setValues",
500525
params: [
501526
// event id
502-
expect.stringMatching(/^.+::\d$/),
527+
expect.stringMatching(/^.+::\d+$/),
503528
// the object payload
504529
keyValuePairs1,
505530
],
@@ -523,7 +548,7 @@ describe.concurrent("GM_value", () => {
523548
api: "GM_setValues",
524549
params: [
525550
// event id
526-
expect.stringMatching(/^.+::\d$/),
551+
expect.stringMatching(/^.+::\d+$/),
527552
// the object payload
528553
keyValuePairs2,
529554
],
@@ -573,7 +598,7 @@ describe.concurrent("GM_value", () => {
573598
api: "GM_setValues",
574599
params: [
575600
// event id
576-
expect.stringMatching(/^.+::\d$/),
601+
expect.stringMatching(/^.+::\d+$/),
577602
// the object payload
578603
keyValuePairs1,
579604
],
@@ -592,7 +617,7 @@ describe.concurrent("GM_value", () => {
592617
api: "GM_setValue",
593618
params: [
594619
// event id
595-
expect.stringMatching(/^.+::\d$/),
620+
expect.stringMatching(/^.+::\d+$/),
596621
// the string payload
597622
"b",
598623
],
@@ -643,7 +668,7 @@ describe.concurrent("GM_value", () => {
643668
api: "GM_setValues",
644669
params: [
645670
// event id
646-
expect.stringMatching(/^.+::\d$/),
671+
expect.stringMatching(/^.+::\d+$/),
647672
// the object payload
648673
keyValuePairs1,
649674
],
@@ -667,7 +692,7 @@ describe.concurrent("GM_value", () => {
667692
api: "GM_setValues",
668693
params: [
669694
// event id
670-
expect.stringMatching(/^.+::\d$/),
695+
expect.stringMatching(/^.+::\d+$/),
671696
// the string payload
672697
keyValuePairs2,
673698
],
@@ -702,14 +727,16 @@ describe.concurrent("GM_value", () => {
702727
const retPromise = exec.exec();
703728
expect(mockSendMessage).toHaveBeenCalledTimes(1);
704729
// 模拟值变化
705-
exec.valueUpdate({
706-
id: "id-1",
707-
entries: [["param1", encodeRValue(123), encodeRValue(undefined)]],
708-
uuid: script.uuid,
709-
storageName: script.uuid,
710-
sender: { runFlag: exec.sandboxContext!.runFlag, tabId: -2 },
711-
valueUpdated: true,
712-
});
730+
exec.valueUpdate(getStorageName(script), script.uuid, [
731+
{
732+
id: "id-1",
733+
valueChanges: [["param1", encodeRValue(123), encodeRValue(undefined)]],
734+
uuid: script.uuid,
735+
storageName: script.uuid,
736+
sender: { runFlag: exec.sandboxContext!.runFlag, tabId: -2 },
737+
updatetime: Date.now(),
738+
},
739+
]);
713740
const ret = await retPromise;
714741
expect(ret).toEqual({ name: "param1", oldValue: undefined, newValue: 123, remote: false });
715742
});
@@ -737,14 +764,16 @@ describe.concurrent("GM_value", () => {
737764
const retPromise = exec.exec();
738765
expect(mockSendMessage).toHaveBeenCalledTimes(1);
739766
// 模拟值变化
740-
exec.valueUpdate({
741-
id: "id-2",
742-
entries: [["param2", encodeRValue(456), encodeRValue(undefined)]],
743-
uuid: script.uuid,
744-
storageName: "testStorage",
745-
sender: { runFlag: "user", tabId: -2 },
746-
valueUpdated: true,
747-
});
767+
exec.valueUpdate(getStorageName(script), script.uuid, [
768+
{
769+
id: "id-2",
770+
valueChanges: [["param2", encodeRValue(456), encodeRValue(undefined)]],
771+
uuid: script.uuid,
772+
storageName: "testStorage",
773+
sender: { runFlag: "user", tabId: -2 },
774+
updatetime: Date.now(),
775+
},
776+
]);
748777
const ret2 = await retPromise;
749778
expect(ret2).toEqual({ name: "param2", oldValue: undefined, newValue: 456, remote: true });
750779
});
@@ -772,14 +801,16 @@ describe.concurrent("GM_value", () => {
772801
expect(id).toBeTypeOf("string");
773802
expect(id.length).greaterThan(0);
774803
// 触发valueUpdate
775-
exec.valueUpdate({
776-
id: id,
777-
entries: [["a", encodeRValue(123), encodeRValue(undefined)]],
778-
uuid: script.uuid,
779-
storageName: script.uuid,
780-
sender: { runFlag: exec.sandboxContext!.runFlag, tabId: -2 },
781-
valueUpdated: true,
782-
});
804+
exec.valueUpdate(getStorageName(script), script.uuid, [
805+
{
806+
id: id,
807+
valueChanges: [["a", encodeRValue(123), encodeRValue(undefined)]],
808+
uuid: script.uuid,
809+
storageName: script.uuid,
810+
sender: { runFlag: exec.sandboxContext!.runFlag, tabId: -2 },
811+
updatetime: Date.now(),
812+
},
813+
]);
783814

784815
const ret = await retPromise;
785816
expect(ret).toEqual(123);

0 commit comments

Comments
 (0)