发送消息到offsreen
Some checks failed
test / Run tests (push) Failing after 13s
build / Build (push) Failing after 23s

This commit is contained in:
王一之 2025-02-12 18:07:34 +08:00
parent 36cf8ef5a7
commit 3c238bcdc8
5 changed files with 44 additions and 24 deletions

View File

@ -52,6 +52,7 @@
"@types/react": "^18.2.48", "@types/react": "^18.2.48",
"@types/react-dom": "^18.2.18", "@types/react-dom": "^18.2.18",
"@types/semver": "^7.5.8", "@types/semver": "^7.5.8",
"@types/serviceworker": "^0.0.120",
"@unocss/postcss": "0.65.0-beta.2", "@unocss/postcss": "0.65.0-beta.2",
"@vitest/coverage-v8": "2.1.4", "@vitest/coverage-v8": "2.1.4",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",

8
pnpm-lock.yaml generated
View File

@ -111,6 +111,9 @@ importers:
'@types/semver': '@types/semver':
specifier: ^7.5.8 specifier: ^7.5.8
version: 7.5.8 version: 7.5.8
'@types/serviceworker':
specifier: ^0.0.120
version: 0.0.120
'@unocss/postcss': '@unocss/postcss':
specifier: 0.65.0-beta.2 specifier: 0.65.0-beta.2
version: 0.65.0-beta.2(postcss@8.4.49) version: 0.65.0-beta.2(postcss@8.4.49)
@ -1125,6 +1128,9 @@ packages:
'@types/serve-static@1.15.7': '@types/serve-static@1.15.7':
resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==}
'@types/serviceworker@0.0.120':
resolution: {integrity: sha512-pVe9ZC82J4uRw+v35TAydtsBAbX1V79uZ0H0rQNtx7oFPImuKY1FTEqSbjTMOtAmb5AWS6z2FFCShu6WMylNng==}
'@types/sockjs@0.3.36': '@types/sockjs@0.3.36':
resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==}
@ -4722,6 +4728,8 @@ snapshots:
'@types/node': 22.10.2 '@types/node': 22.10.2
'@types/send': 0.17.4 '@types/send': 0.17.4
'@types/serviceworker@0.0.120': {}
'@types/sockjs@0.3.36': '@types/sockjs@0.3.36':
dependencies: dependencies:
'@types/node': 22.10.2 '@types/node': 22.10.2

View File

@ -79,7 +79,7 @@ export default class GMApi {
console.log("xml request", request, con); console.log("xml request", request, con);
// 先处理unsafe hearder // 先处理unsafe hearder
// 再发送到offscreen, 处理请求 // 再发送到offscreen, 处理请求
sendMessageToOffsreen("offscreen/gmApi/requestXhr", request.params); sendMessageToOffscreen("offscreen/gmApi/requestXhr", request.params);
} }
start() { 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和offscreen同时监听消息,会导致消息被两边同时接收,但是返回结果时会产生问题,导致报错
// 不进行监听的话又无法从service_worker主动发送消息 // 不进行监听的话又无法从service_worker主动发送消息
const ctx = await chrome.runtime.getContexts({ // 所以这里通过clients.matchAll()获取到所有的client,然后通过postMessage发送消息
contextTypes: [chrome.runtime.ContextType.OFFSCREEN_DOCUMENT], const list = await clients.matchAll();
documentUrls: [chrome.runtime.getURL("src/offscreen.html")], list[0].postMessage({
});
chrome.scripting.executeScript({
target: {
documentIds: [ctx[0]!.documentId!],
tabId: -1,
},
func: (message) => {
// 在页面上下文中执行的代码
window.postMessage(
{
type: "sendMessage", type: "sendMessage",
daat: message, data: { action, data },
},
"*"
);
},
args: [{ action, data }],
}); });
} }

View File

@ -21,6 +21,30 @@ export default class ServiceWorkerManager {
group.on("preparationOffscreen", async () => { group.on("preparationOffscreen", async () => {
// 准备好环境 // 准备好环境
this.mq.emit("preparationOffscreen", {}); 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); const resource = new ResourceService(group.group("resource"), this.mq);

4
src/types/main.d.ts vendored
View File

@ -3,7 +3,9 @@ declare module "*.tpl";
declare module "*.json"; declare module "*.json";
declare module "*.yaml"; declare module "*.yaml";
declare let sandbox: Window; declare const sandbox: Window;
declare const clients: Clients;
declare namespace GMSend { declare namespace GMSend {
interface XHRDetails { interface XHRDetails {