From 3b2e72127f2aa57105645bde841561cf40437898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Mon, 14 Apr 2025 16:24:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=84=E7=90=86=20gm=20add=20element=20csp?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/message/extension_message.ts | 25 +++++++++++++++++++++++ src/app/service/content/content.ts | 7 ++++--- src/app/service/service_worker/runtime.ts | 24 ++++++++++++---------- src/service_worker.ts | 2 +- 4 files changed, 43 insertions(+), 15 deletions(-) diff --git a/packages/message/extension_message.ts b/packages/message/extension_message.ts index bb5d919..de29e66 100644 --- a/packages/message/extension_message.ts +++ b/packages/message/extension_message.ts @@ -1,4 +1,6 @@ +import Logger from "@App/app/logger/logger"; import { Message, MessageConnect, MessageSend, MessageSender } from "./server"; +import LoggerCore from "@App/app/logger/core"; export class ExtensionMessageSend implements MessageSend { constructor() {} @@ -44,6 +46,10 @@ export class ServiceWorkerMessage extends ExtensionMessageSend implements Messag } export class ExtensionMessage extends ExtensionMessageSend implements Message { + constructor(private onUserScript = false) { + super(); + } + onConnect(callback: (data: any, con: MessageConnect) => void) { chrome.runtime.onConnect.addListener((port) => { const handler = (msg: any) => { @@ -52,6 +58,16 @@ export class ExtensionMessage extends ExtensionMessageSend implements Message { }; port.onMessage.addListener(handler); }); + if (this.onUserScript) { + // 监听用户脚本的连接 + chrome.runtime.onUserScriptConnect.addListener((port) => { + const handler = (msg: any) => { + port.onMessage.removeListener(handler); + callback(msg, new ExtensionMessageConnect(port)); + }; + port.onMessage.addListener(handler); + }); + } } // 注意chrome.runtime.onMessage.addListener的回调函数需要返回true才能处理异步请求 @@ -62,6 +78,15 @@ export class ExtensionMessage extends ExtensionMessageSend implements Message { } return callback(msg, sendResponse, sender); }); + if (this.onUserScript) { + // 监听用户脚本的消息 + chrome.runtime.onUserScriptMessage.addListener((msg, sender, sendResponse) => { + if (msg.action === "messageQueue") { + return false; + } + return callback(msg, sendResponse, sender); + }); + } } } diff --git a/src/app/service/content/content.ts b/src/app/service/content/content.ts index fd7a408..9858821 100644 --- a/src/app/service/content/content.ts +++ b/src/app/service/content/content.ts @@ -60,9 +60,7 @@ export default class ContentRuntime { parentNode = (this.msg as CustomEventMessage).getAndDelRelatedTarget(parentNodeId); } const el = document.createElement(tagName); - Object.keys(attr).forEach((key) => { - el.setAttribute(key, attr[key]); - }); + let textContent = ""; if (attr) { if (attr.textContent) { @@ -72,6 +70,9 @@ export default class ContentRuntime { } else { attr = {}; } + Object.keys(attr).forEach((key) => { + el.setAttribute(key, attr[key]); + }); if (textContent) { el.innerHTML = textContent; } diff --git a/src/app/service/service_worker/runtime.ts b/src/app/service/service_worker/runtime.ts index fc338fd..43e8e1b 100644 --- a/src/app/service/service_worker/runtime.ts +++ b/src/app/service/service_worker/runtime.ts @@ -247,6 +247,10 @@ export class RuntimeService { registerInjectScript() { chrome.userScripts.getScripts({ ids: ["scriptcat-inject"] }).then((res) => { if (res.length == 0) { + chrome.userScripts.configureWorld({ + csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *", + messaging: true, + }); fetch("inject.js") .then((res) => res.text()) .then(async (injectJs) => { @@ -261,18 +265,17 @@ export class RuntimeService { world: "MAIN", runAt: "document_start", }, + // 注册content + { + id: "scriptcat-content", + js: [{ file: "src/content.js" }], + matches: [""], + allFrames: true, + runAt: "document_start", + world: "USER_SCRIPT", + }, ]); }); - chrome.scripting.registerContentScripts([ - { - id: "scriptcat-content", - js: ["src/content.js"], - matches: [""], - allFrames: true, - runAt: "document_start", - world: "ISOLATED", - }, - ]); } }); } @@ -426,7 +429,6 @@ export class RuntimeService { if (script.metadata["run-at"]) { registerScript.runAt = getRunAt(script.metadata["run-at"]); } - console.log("registerScript", script.name, registerScript, scriptMatchInfo); if (await Cache.getInstance().get("registryScript:" + script.uuid)) { await chrome.userScripts.update([registerScript]); } else { diff --git a/src/service_worker.ts b/src/service_worker.ts index 42f350f..5cdce06 100644 --- a/src/service_worker.ts +++ b/src/service_worker.ts @@ -56,7 +56,7 @@ async function main() { }); loggerCore.logger().debug("service worker start"); // 初始化管理器 - const message = new ExtensionMessage(); + const message = new ExtensionMessage(true); const server = new Server("serviceWorker", message); const manager = new ServiceWorkerManager(server, new MessageQueue(), new ServiceWorkerMessageSend()); manager.initManager();