Skip to content

Commit 0866918

Browse files
committed
优化EarlyStart注入代码
1 parent 498cd96 commit 0866918

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

src/app/service/content/script_executor.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,11 @@ export class ScriptExecutor {
7575
// 监听 脚本加载
7676
// 适用于此「通知环境加载完成」代码执行后的脚本加载
7777
window.addEventListener(`${eventNamePrefix}${messageFlags.scriptLoadComplete}`, (ev) => {
78-
const scriptFlag = (ev as CustomEvent).detail?.scriptFlag;
78+
const detail = (ev as CustomEvent).detail;
79+
const scriptFlag = detail?.scriptFlag;
7980
if (typeof scriptFlag === "string") {
8081
ev.preventDefault(); // dispatchEvent 会回传 false -> 分离环境也能得知环境加载代码已执行
81-
this.execEarlyScript(scriptFlag);
82+
this.execEarlyScript(scriptFlag, detail.scriptInfo);
8283
}
8384
});
8485
// 通知 环境 加载完成
@@ -87,11 +88,11 @@ export class ScriptExecutor {
8788
window.dispatchEvent(ev);
8889
}
8990

90-
execEarlyScript(flag: string) {
91+
execEarlyScript(flag: string, scriptInfo: ScriptLoadInfo) {
9192
const scriptFunc = (window as any)[flag] as PreScriptFunc;
9293
this.execScriptEntry({
93-
scriptLoadInfo: scriptFunc.scriptInfo,
94-
scriptFunc: scriptFunc.func,
94+
scriptLoadInfo: scriptInfo,
95+
scriptFunc: scriptFunc,
9596
scriptFlag: flag,
9697
envInfo: {},
9798
});

src/app/service/content/utils.ts

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -105,22 +105,21 @@ export function compilePreInjectScript(
105105
autoDeleteMountFunction: boolean = false
106106
): string {
107107
const eventNamePrefix = isInjectIntoContent(script.metadata) ? messageFlags.contentFlag : messageFlags.injectFlag;
108-
const autoDeleteMountCode = autoDeleteMountFunction ? `try{delete window['${script.flag}']}catch(e){}` : "";
109-
return `window['${script.flag}'] = {
110-
scriptInfo: ${JSON.stringify(script)},
111-
func: function(){${autoDeleteMountCode}${scriptCode}}
112-
};
113-
(() => {
114-
const f = () => {
115-
const ev = new CustomEvent('${eventNamePrefix}${messageFlags.scriptLoadComplete}',
116-
{ cancelable: true, detail: { scriptFlag: '${script.flag}' } });
117-
return window.dispatchEvent(ev);
118-
};
119-
const noCbHooked = f();
120-
if (noCbHooked) {
121-
window.addEventListener('${eventNamePrefix}${messageFlags.envLoadComplete}', f, { once: true });
122-
}
123-
})();
108+
const flag = `${script.flag}`;
109+
const scriptInfo = { ...script }; // clone
110+
// 不需要 code
111+
scriptInfo.code = "";
112+
const scriptInfoJSON = `${JSON.stringify(scriptInfo)}`;
113+
const autoDeleteMountCode = autoDeleteMountFunction ? `try{delete window['${flag}']}catch(e){}` : "";
114+
const evScriptLoad = `${eventNamePrefix}${messageFlags.scriptLoadComplete}`;
115+
const evEnvLoad = `${eventNamePrefix}${messageFlags.envLoadComplete}`;
116+
return `window['${flag}'] = function(){${autoDeleteMountCode}${scriptCode}};
117+
{
118+
let o = { cancelable: true, { scriptFlag: '${flag}', scriptInfo: ${scriptInfoJSON} } },
119+
f = () => window.dispatchEvent(new CustomEvent('${evScriptLoad}', o)),
120+
needWait = f();
121+
if (needWait) window.addEventListener('${evEnvLoad}', f, { once: true });
122+
}
124123
`;
125124
}
126125

src/app/service/service_worker/runtime.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ import type { CompiledResource, ResourceType } from "@App/app/repo/resource";
4343
import { CompiledResourceDAO } from "@App/app/repo/resource";
4444
import { setOnTabURLChanged } from "./url_monitor";
4545

46+
// 避免使用版本号控制导致代码理解混乱
47+
// 用来清除UserScript API里的旧缓存
48+
const USERSCRIPTS_REGISTER_CONTROL = "0f5b5b01-eef8-4505-9a8e-b2fc416b2f62";
49+
4650
const ORIGINAL_URLMATCH_SUFFIX = "{ORIGINAL}"; // 用于标记原始URLPatterns的后缀
4751

4852
const runtimeGlobal = {
@@ -241,12 +245,21 @@ export class RuntimeService {
241245
}
242246

243247
async waitInit() {
244-
const [cRuntimeStartFlag, compiledResources, allScripts] = await Promise.all([
248+
const [registerControl, cRuntimeStartFlag, compiledResources, allScripts] = await Promise.all([
249+
chrome.storage.local.get("userscripts_register_control"),
245250
cacheInstance.get<boolean>("runtimeStartFlag"),
246251
this.compiledResourceDAO.all(),
247252
this.scriptDAO.all(),
248253
]);
249254

255+
if (registerControl?.userscripts_register_control !== USERSCRIPTS_REGISTER_CONTROL) {
256+
await Promise.allSettled([
257+
chrome.userScripts.unregister(),
258+
chrome.scripting.unregisterContentScripts(),
259+
chrome.storage.local.set({ userscripts_register_control: USERSCRIPTS_REGISTER_CONTROL }),
260+
]);
261+
}
262+
250263
const unregisterScriptIds = [] as string[];
251264
// 没有 CompiledResources 表示这是 没有启用脚本 或 代码有改变需要重新安装。
252265
// 这个情况会把所有有效脚本跟Inject&Content脚本先取消注册。后续载入时会重新以新代码注册。

0 commit comments

Comments
 (0)