diff --git a/src/app/logger/core.ts b/src/app/logger/core.ts index dfd7cac..7be7787 100644 --- a/src/app/logger/core.ts +++ b/src/app/logger/core.ts @@ -37,9 +37,9 @@ export default class LoggerCore { this.writer = config.writer; this.level = config.level || this.level; this.labels = config.labels || {}; - // 获取日志debug等级, 如果是开发环境, 则默认为trace + // 获取日志debug等级, 如果是开发环境, 则默认为debug if (process.env.NODE_ENV === "development") { - this.debug = "trace"; + this.debug = "debug"; } if (!LoggerCore.instance) { LoggerCore.instance = this; diff --git a/src/app/logger/message_writer.ts b/src/app/logger/message_writer.ts index 1b75bf5..f455d13 100644 --- a/src/app/logger/message_writer.ts +++ b/src/app/logger/message_writer.ts @@ -1,16 +1,16 @@ -import { WindowMessage } from "@Packages/message/window_message"; import { LogLabel, LogLevel, Writer } from "./core"; +import { MessageSend } from "@Packages/message/server"; // 通过通讯机制写入日志 export default class MessageWriter implements Writer { - connect: WindowMessage; + send: MessageSend; - constructor(connect: WindowMessage) { - this.connect = connect; + constructor(connect: MessageSend) { + this.send = connect; } write(level: LogLevel, message: string, label: LogLabel): void { - this.connect.sendMessage({ + this.send.sendMessage({ action: "logger", data: { id: 0, diff --git a/src/app/service/service_worker/runtime.ts b/src/app/service/service_worker/runtime.ts index 2fcde18..5004f4b 100644 --- a/src/app/service/service_worker/runtime.ts +++ b/src/app/service/service_worker/runtime.ts @@ -6,6 +6,7 @@ import GMApi from "./gm_api"; import { subscribeScriptEnable } from "../queue"; import { ScriptService } from "./script"; import { runScript, stopScript } from "../offscreen/client"; +import { dealMatches } from "./utils"; export class RuntimeService { scriptDAO: ScriptDAO = new ScriptDAO(); @@ -81,7 +82,34 @@ export class RuntimeService { registryPageScript(script: ScriptAndCode) { console.log(script); + const matches = script.metadata["match"]; + if (!matches) { + return; + } + matches.push(...(script.metadata["include"] || [])); + const registerScript: chrome.userScripts.RegisteredUserScript = { + id: script.uuid, + js: [{ code: script.code }], + matches: dealMatches(matches), + world: "MAIN", + }; + if (!script.metadata["noframes"]) { + registerScript.allFrames = true; + } + if (script.metadata["exclude-match"]) { + const excludeMatches = script.metadata["exclude-match"]; + excludeMatches.push(...(script.metadata["exclude"] || [])); + registerScript.excludeMatches = dealMatches(excludeMatches); + } + if (script.metadata["run-at"]) { + registerScript.runAt = script.metadata["run-at"][0] as chrome.userScripts.RunAt; + } + chrome.userScripts.register([registerScript]); } - unregistryPageScript(script: Script) {} + unregistryPageScript(script: Script) { + chrome.userScripts.unregister({ + ids: [script.uuid], + }); + } } diff --git a/src/app/service/service_worker/utils.ts b/src/app/service/service_worker/utils.ts index 3e90943..47cec55 100644 --- a/src/app/service/service_worker/utils.ts +++ b/src/app/service/service_worker/utils.ts @@ -4,3 +4,8 @@ export function isExtensionRequest(details: chrome.webRequest.ResourceRequest & (details.originUrl && details.originUrl.startsWith(chrome.runtime.getURL(""))) ); } + +// 处理油猴的match和include为chrome的matches +export function dealMatches(matches: string[]) { + return matches; +} diff --git a/src/content.ts b/src/content.ts new file mode 100644 index 0000000..a8dfb00 --- /dev/null +++ b/src/content.ts @@ -0,0 +1,22 @@ +import LoggerCore from "./app/logger/core"; +import MessageWriter from "./app/logger/message_writer"; +import { SandboxManager } from "./app/service/sandbox"; +import { ExtensionMessageSend } from "@Packages/message/extension_message"; + +function main() { + // 建立与service_worker页面的连接 + const msg = new ExtensionMessageSend(); + + // 初始化日志组件 + const loggerCore = new LoggerCore({ + writer: new MessageWriter(msg), + labels: { env: "sandbox" }, + }); + loggerCore.logger().debug("offscreen start"); + + // 初始化管理器 + const manager = new SandboxManager(msg); + manager.initManager(); +} + +main(); diff --git a/src/injected.ts b/src/injected.ts new file mode 100644 index 0000000..1a5a407 --- /dev/null +++ b/src/injected.ts @@ -0,0 +1,23 @@ +import LoggerCore from "./app/logger/core"; +import MessageWriter from "./app/logger/message_writer"; +import MessageContent from "./app/message/content"; +import InjectRuntime from "./runtime/content/inject"; + +// 通过flag与content建立通讯,这个ScriptFlag是后端注入时候生成的 +// eslint-disable-next-line no-undef +const flag = ScriptFlag; + +const message = new MessageContent(flag, false); + +// 加载logger组件 +const logger = new LoggerCore({ + debug: process.env.NODE_ENV === "development", + writer: new MessageWriter(message), + labels: { env: "inject", href: window.location.href }, +}); + +message.setHandler("pageLoad", (_action, data) => { + logger.logger().debug("inject start"); + const runtime = new InjectRuntime(message, data.scripts, flag); + runtime.start(); +}); diff --git a/src/manifest.json b/src/manifest.json index 0d38c42..c86dc3e 100644 --- a/src/manifest.json +++ b/src/manifest.json @@ -28,6 +28,7 @@ "scripting", "activeTab", "webRequest", + "userScripts", "declarativeNetRequest" ], "host_permissions": [