From 3c238bcdc83f8a1ad05a3c9efd3228ece639a5a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E4=B8=80=E4=B9=8B?= Date: Wed, 12 Feb 2025 18:07:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8F=91=E9=80=81=E6=B6=88=E6=81=AF=E5=88=B0of?= =?UTF-8?q?fsreen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 1 + pnpm-lock.yaml | 8 ++++++ src/app/service/service_worker/gm_api.ts | 31 ++++++------------------ src/app/service/service_worker/index.ts | 24 ++++++++++++++++++ src/types/main.d.ts | 4 ++- 5 files changed, 44 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 7f3abfc..5ec77f2 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@types/react": "^18.2.48", "@types/react-dom": "^18.2.18", "@types/semver": "^7.5.8", + "@types/serviceworker": "^0.0.120", "@unocss/postcss": "0.65.0-beta.2", "@vitest/coverage-v8": "2.1.4", "autoprefixer": "^10.4.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c0a860..383f121 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -111,6 +111,9 @@ importers: '@types/semver': specifier: ^7.5.8 version: 7.5.8 + '@types/serviceworker': + specifier: ^0.0.120 + version: 0.0.120 '@unocss/postcss': specifier: 0.65.0-beta.2 version: 0.65.0-beta.2(postcss@8.4.49) @@ -1125,6 +1128,9 @@ packages: '@types/serve-static@1.15.7': resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serviceworker@0.0.120': + resolution: {integrity: sha512-pVe9ZC82J4uRw+v35TAydtsBAbX1V79uZ0H0rQNtx7oFPImuKY1FTEqSbjTMOtAmb5AWS6z2FFCShu6WMylNng==} + '@types/sockjs@0.3.36': resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} @@ -4722,6 +4728,8 @@ snapshots: '@types/node': 22.10.2 '@types/send': 0.17.4 + '@types/serviceworker@0.0.120': {} + '@types/sockjs@0.3.36': dependencies: '@types/node': 22.10.2 diff --git a/src/app/service/service_worker/gm_api.ts b/src/app/service/service_worker/gm_api.ts index 80ed9bd..c231f5e 100644 --- a/src/app/service/service_worker/gm_api.ts +++ b/src/app/service/service_worker/gm_api.ts @@ -79,7 +79,7 @@ export default class GMApi { console.log("xml request", request, con); // 先处理unsafe hearder // 再发送到offscreen, 处理请求 - sendMessageToOffsreen("offscreen/gmApi/requestXhr", request.params); + sendMessageToOffscreen("offscreen/gmApi/requestXhr", request.params); } start() { @@ -87,29 +87,14 @@ export default class GMApi { } } -export async function sendMessageToOffsreen(action: string, data?: any) { - // service_worker通过chrome.scripting.executeScript调用window.postMessage主动发送消息 + +export async function sendMessageToOffscreen(action: string, data?: any) { // service_worker和offscreen同时监听消息,会导致消息被两边同时接收,但是返回结果时会产生问题,导致报错 // 不进行监听的话又无法从service_worker主动发送消息 - const ctx = await chrome.runtime.getContexts({ - contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT], - documentUrls: [chrome.runtime.getURL("src/offscreen.html")], - }); - chrome.scripting.executeScript({ - target: { - documentIds: [ctx[0]!.documentId!], - tabId: -1, - }, - func: (message) => { - // 在页面上下文中执行的代码 - window.postMessage( - { - type: "sendMessage", - daat: message, - }, - "*" - ); - }, - args: [{ action, data }], + // 所以这里通过clients.matchAll()获取到所有的client,然后通过postMessage发送消息 + const list = await clients.matchAll(); + list[0].postMessage({ + type: "sendMessage", + data: { action, data }, }); } diff --git a/src/app/service/service_worker/index.ts b/src/app/service/service_worker/index.ts index e5a1587..1ad59b3 100644 --- a/src/app/service/service_worker/index.ts +++ b/src/app/service/service_worker/index.ts @@ -21,6 +21,30 @@ export default class ServiceWorkerManager { group.on("preparationOffscreen", async () => { // 准备好环境 this.mq.emit("preparationOffscreen", {}); + + const ctx = await chrome.runtime.getContexts({ + contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT], + documentUrls: [chrome.runtime.getURL("src/offscreen.html")], + }); + console.log("ctx", ctx, chrome.runtime.getURL("src/offscreen.html")); + chrome.scripting.executeScript({ + target: { + documentIds: [ctx[0]!.documentId!], + tabId: -1, + }, + func: (message) => { + // 在页面上下文中执行的代码 + console.log("tesss"); + window.postMessage( + { + type: "sendMessage", + daat: message, + }, + "*" + ); + }, + args: [{ action: "test", data: "test" }], + }); }); const resource = new ResourceService(group.group("resource"), this.mq); diff --git a/src/types/main.d.ts b/src/types/main.d.ts index 1663fdf..279e754 100644 --- a/src/types/main.d.ts +++ b/src/types/main.d.ts @@ -3,7 +3,9 @@ declare module "*.tpl"; declare module "*.json"; declare module "*.yaml"; -declare let sandbox: Window; +declare const sandbox: Window; + +declare const clients: Clients; declare namespace GMSend { interface XHRDetails {