Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 9 additions & 16 deletions src/app/service/content/script_executor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,15 @@ export type ExecScriptEntry = {
scriptFunc: any;
};

export let initEnvInfo: GMInfoEnv;

try {
initEnvInfo = {
userAgentData: UserAgentData, // 从全局变量获取
sandboxMode: "raw", // 预留字段,当前固定为 raw
isIncognito: false, // inject 环境下无法判断,固定为 false
};
} catch {
// 如果 UserAgentData 不存在,可能是在非inject/content环境下运行
initEnvInfo = {
userAgentData: {},
sandboxMode: "raw",
isIncognito: false,
};
}
export const initEnvInfo = {
/** userAgentData - 从全局变量获取 */
userAgentData: typeof UserAgentData === "object" ? UserAgentData : {},
/** sandboxMode - 预留字段,当前固定为 raw */
sandboxMode: "raw",
/** isIncognito - inject/content 环境下无法判断,固定为 false */
/** 使用者可透过 「 await navigator.storage.persisted() 」来判断,但ScriptCat不会主动执行此代码来判断 */
isIncognito: false,
} satisfies GMInfoEnv;

// 脚本执行器
export class ScriptExecutor {
Expand Down
63 changes: 28 additions & 35 deletions src/app/service/service_worker/runtime.ts
Original file line number Diff line number Diff line change
Expand Up @@ -825,16 +825,9 @@ export class RuntimeService {
}

let retContent: chrome.scripting.RegisteredContentScript[] = [];
let retInject: chrome.userScripts.RegisteredUserScript[] = [];
// inject.js
const injectJs = await this.getInjectJsCode();
if (injectJs) {
// 构建inject.js的脚本注册信息
retInject = this.compileInjectUserScript(injectJs, {
excludeMatches,
excludeGlobs,
});
}
const retInject: chrome.userScripts.RegisteredUserScript[] = [];

// ------ scripting.js ------
// Note: Chrome does not support file.js?query
// 注意:Chrome 不支持 file.js?query
retContent = [
Expand All @@ -848,20 +841,41 @@ export class RuntimeService {
} satisfies chrome.scripting.RegisteredContentScript,
];

// ------ inject.js & content.js ------
const jsonUAD = JSON.stringify(this.userAgentData);
const injectJs = await this.getInjectJsCode();
if (injectJs) {
// 构建inject.js的脚本注册信息
const codeBody = `(function (UserAgentData) {\n${injectJs}\n})(${jsonUAD})`;
const code = `${codeBody}${sourceMapTo("scriptcat-inject.js")}\n`;
const script = {
id: "scriptcat-inject",
js: [{ code }],
matches: ["<all_urls>"],
allFrames: true,
runAt: "document_start",
excludeMatches: excludeMatches,
excludeGlobs: excludeGlobs,
world: "MAIN",
} satisfies chrome.userScripts.RegisteredUserScript;
retInject.push(script);
}
const contentJs = await this.getContentJsCode();
if (contentJs) {
const codeBody = `(function () {\n${contentJs}\n})()`;
// 构建 content.js 的脚本注册信息
const codeBody = `(function (UserAgentData) {\n${contentJs}\n})(${jsonUAD})`;
const code = `${codeBody}${sourceMapTo("scriptcat-content.js")}\n`;
retInject.push({
const script = {
id: "scriptcat-content",
js: [{ code }],
matches: ["<all_urls>"],
allFrames: true,
runAt: "document_start",
world: "USER_SCRIPT",
excludeMatches,
excludeGlobs,
} satisfies chrome.userScripts.RegisteredUserScript);
world: "USER_SCRIPT",
} satisfies chrome.userScripts.RegisteredUserScript;
retInject.push(script);
}

return { content: retContent, inject: retInject };
Expand Down Expand Up @@ -1305,27 +1319,6 @@ export class RuntimeService {
return await runScript(this.msgSender, res);
}

compileInjectUserScript(
injectJs: string,
{ excludeMatches, excludeGlobs }: { excludeMatches: string[] | undefined; excludeGlobs: string[] | undefined }
) {
// 构建inject.js的脚本注册信息
const codeBody = `(function (UserAgentData) {\n${injectJs}\n})(${JSON.stringify(this.userAgentData)})`;
const code = `${codeBody}${sourceMapTo("scriptcat-inject.js")}\n`;
const script: chrome.userScripts.RegisteredUserScript = {
id: "scriptcat-inject",
js: [{ code }],
matches: ["<all_urls>"],
allFrames: true,
world: "MAIN",
runAt: "document_start",
excludeMatches: excludeMatches,
excludeGlobs: excludeGlobs,
};

return [script] as chrome.userScripts.RegisteredUserScript[];
}

scriptMatchEntry(
scriptRes: ScriptRunResource,
o: {
Expand Down
4 changes: 2 additions & 2 deletions src/types/main.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ interface FileSystemObserverInstance {
observe(handle: FileSystemFileHandle | FileSystemDirectoryHandle | FileSystemSyncAccessHandle): Promise<void>;
}

declare const UserAgentData: typeof GM_info.userAgentData;
declare const UserAgentData: typeof GM_info.userAgentData | undefined;

// 可以让content与inject环境交换携带dom的对象
declare let cloneInto: ((detail: any, view: any) => any) | undefined;
declare let cloneInto: ((obj: object, targetScope: object, options?: object) => object) | undefined;

declare namespace GMSend {
interface XHRDetails {
Expand Down
Loading