From 25ba263c7098fbb69fba4ac99349b21277ac63b6 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Mon, 1 Jun 2026 11:23:04 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[Feature]=20ScriptCat=20=E5=BA=94=E8=83=BD?= =?UTF-8?q?=E6=B3=A8=E5=85=A5=20``?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/content/utils.ts | 4 ++++ src/app/service/service_worker/utils.ts | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/src/app/service/content/utils.ts b/src/app/service/content/utils.ts index bc7905a0b..cb78ab1ec 100644 --- a/src/app/service/content/utils.ts +++ b/src/app/service/content/utils.ts @@ -281,6 +281,10 @@ export function isScriptletUnwrap(metadata: SCMetadata): boolean { return metadataBlankOrTrue(metadata, "unwrap"); } +export function isScriptModule(metadata: SCMetadata): boolean { + return metadataBlankOrTrue(metadata, "script-module") && !isInjectIntoContent(metadata); +} + export function isInjectIntoContent(metadata: SCMetadata): boolean { return metadata["inject-into"]?.[0] === "content"; } diff --git a/src/app/service/service_worker/utils.ts b/src/app/service/service_worker/utils.ts index 2f141befb..0f3596ac1 100644 --- a/src/app/service/service_worker/utils.ts +++ b/src/app/service/service_worker/utils.ts @@ -11,6 +11,7 @@ import { isEarlyStartScript, isInjectIntoContent, isScriptletUnwrap, + isScriptModule, } from "../content/utils"; import { extractUrlPatterns, @@ -195,6 +196,19 @@ export function compileInjectionCode( if (isScriptletUnwrap(scriptRes.metadata)) { scriptInjectCode = compileScriptletCode(scriptRes, scriptCode, scriptUrlPatterns); } else { + if (isScriptModule(scriptRes.metadata)) { + const wId = `__${Date.now().toString(36)}_${(Math.random() + 1).toString(36).substring(2)}`; + const st = JSON.stringify( + `const {GM, top, parent, window, unsafeWindow, globalThis} = document.${wId}; delete document.${wId};\n${scriptCode}` + ); + const p = (c: string) => { + const jsScript = document.createElement("script"); + jsScript.type = "module"; + jsScript.textContent = c; + (document.body || document.head || document.documentElement).appendChild(jsScript); + }; + scriptCode = `document.${wId} = {GM, top, parent, window, globalThis: window, unsafeWindow: typeof unsafeWindow !== "undefined" ? unsafeWindow : undefined};(${p})(${st});`; + } scriptCode = compileScriptCode(scriptRes, scriptCode); if (isEarlyStartScript(scriptRes.metadata)) { scriptInjectCode = compilePreInjectScript(parseScriptLoadInfo(scriptRes, scriptUrlPatterns), scriptCode); From 67f31668da19742bceceb3579e3a4da9c4ac8675 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Fri, 17 Jul 2026 21:46:38 +0900 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=E8=A1=A5=E5=85=85=20@script-module?= =?UTF-8?q?=20=E5=8A=9F=E8=83=BD=E7=9A=84=20vitest=20=E4=B8=8E=20e2e=20?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 单元测试覆盖 isScriptModule 判断逻辑(含与 @inject-into content 互斥) 及 compileInjectionCode 对 script-module 脚本的编译路径(含 early-start 组合场景);新增 e2e 用例通过实际浏览器验证注入的确是真正的