From bfa271266aa0818f8759835746df9a6becc413b3 Mon Sep 17 00:00:00 2001 From: cyfung1031 <44498510+cyfung1031@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:19:37 +0900 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E8=89=AF=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/app/service/content/create_context.ts | 86 +++++++++++++++-------- src/app/service/content/gm_api.ts | 6 +- tests/runtime/gm_api.test.ts | 6 +- tests/utils.test.ts | 6 +- 4 files changed, 68 insertions(+), 36 deletions(-) diff --git a/src/app/service/content/create_context.ts b/src/app/service/content/create_context.ts index 6b3a58be..8330c229 100644 --- a/src/app/service/content/create_context.ts +++ b/src/app/service/content/create_context.ts @@ -3,34 +3,11 @@ import { v4 as uuidv4 } from "uuid"; import type { Message } from "@Packages/message/types"; import EventEmitter from "eventemitter3"; import { GMContextApiGet } from "./gm_context"; -import { createGMBase } from "./gm_api"; +import { createGMBase, type GMApiType } from "./gm_api"; + +function _createContext(options:{[key:string]:any}, scriptGrants:Set | string[]){ + const context = createGMBase(options); -// 构建沙盒上下文 -export function createContext( - scriptRes: ScriptRunResource, - GMInfo: any, - envPrefix: string, - message: Message, - scriptGrants: Set -) { - // 按照GMApi构建 - const valueChangeListener = new Map(); - const EE: EventEmitter = new EventEmitter(); - const context = createGMBase({ - prefix: envPrefix, - message, - scriptRes, - valueChangeListener, - EE, - runFlag: uuidv4(), - eventId: 10000, - GM: { info: GMInfo }, - GM_info: GMInfo, - window: { - onurlchange: null, - }, - grantSet: new Set(), - }); const grantedAPIs: { [key: string]: any } = {}; const __methodInject__ = (grant: string): boolean => { const grantSet: Set = context.grantSet; @@ -64,6 +41,59 @@ export function createContext( g = g[part] || (g[part] = (grantedAPIs[s] || {})); } } - context.unsafeWindow = window; + return context; +} + +// 构建沙盒上下文 +export function createContext( + scriptRes: ScriptRunResource, + GMInfo: any, + envPrefix: string, + message: Message, + scriptGrants: Set | string[] +) { + // 按照GMApi构建 + const valueChangeListener = new Map(); + const EE: EventEmitter = new EventEmitter(); + const context = _createContext({ + prefix: envPrefix, + message, + scriptRes, + valueChangeListener, + EE, + runFlag: uuidv4(), + eventId: 10000, + GM: { info: GMInfo }, + GM_info: GMInfo, + window: { + onurlchange: null, + }, + grantSet: new Set(), + unsafeWindow: window + }, scriptGrants); + return context; +} + +// 构建测试用沙盒上下文 +export function createTestContext( + prefix: string, + message: Message, + scriptRes: ScriptRunResource, + scriptGrants: Set | string[] +) { + + const valueChangeListener = new Map(); + const EE: EventEmitter = new EventEmitter(); + const context = _createContext({ + prefix, + message, + scriptRes, + valueChangeListener, + EE, + notificationTagMap: new Map(), + eventId: 0, + grantSet: new Set(), + }, scriptGrants); + return context; } diff --git a/src/app/service/content/gm_api.ts b/src/app/service/content/gm_api.ts index 6161a21b..668a206f 100644 --- a/src/app/service/content/gm_api.ts +++ b/src/app/service/content/gm_api.ts @@ -108,8 +108,8 @@ class GM_Base implements IGM_Base { } } -// GMApi 定义 外部用API函数。不使用@protected -export default class GMApi extends GM_Base { +// GMApi 定义 外部用API函数。不使用@protected。定義API用。不導出 +class GMApi extends GM_Base { /** * */ @@ -1157,3 +1157,5 @@ export const { createGMBase } = GM_Base; // 從 GMApi 對象中解構出內部函數,用於後續本地使用,不導出 const { _GM_getValue, _GM_cookie, _GM_setValue, _GM_xmlhttpRequest } = GMApi; + +export type GMApiType = InstanceType; diff --git a/tests/runtime/gm_api.test.ts b/tests/runtime/gm_api.test.ts index 1618a44b..44bcd9ac 100644 --- a/tests/runtime/gm_api.test.ts +++ b/tests/runtime/gm_api.test.ts @@ -1,5 +1,5 @@ import { type Script, ScriptDAO, type ScriptRunResource } from "@App/app/repo/scripts"; -import GMApi from "@App/app/service/content/gm_api"; +import { createTestContext } from "@App/app/service/content/create_context"; import { initTestEnv, initTestGMApi } from "@Tests/utils"; import { randomUUID } from "crypto"; import { newMockXhr } from "mock-xmlhttprequest"; @@ -33,9 +33,9 @@ beforeAll(async () => { }); describe("GM xmlHttpRequest", () => { - const gmApi = new GMApi("serviceWorker", msg, { + const gmApi = createTestContext("serviceWorker", msg, { uuid: script.uuid - }); + }, ["GM_xmlhttpRequest"]); const mockXhr = newMockXhr(); mockXhr.onSend = async (request) => { switch (request.url) { diff --git a/tests/utils.test.ts b/tests/utils.test.ts index e28e9ef3..e38598d8 100644 --- a/tests/utils.test.ts +++ b/tests/utils.test.ts @@ -4,7 +4,7 @@ import { randomUUID } from "crypto"; import { newMockXhr } from "mock-xmlhttprequest"; import type { Script, ScriptRunResource } from "@App/app/repo/scripts"; import { ScriptDAO } from "@App/app/repo/scripts"; -import GMApi from "@App/app/service/content/gm_api"; +import { createTestContext } from "@App/app/service/content/create_context"; initTestEnv(); @@ -29,9 +29,9 @@ describe("测试GMApi环境", async () => { checktime: 0, }; await new ScriptDAO().save(script); - const gmApi = new GMApi("serviceWorker", msg, { + const gmApi = createTestContext("serviceWorker", msg, { uuid: script.uuid - }); + }, ["GM_xmlhttpRequest"]); const mockXhr = newMockXhr(); mockXhr.onSend = async (request) => { return request.respond(200, {}, "example");