修复首次打开浏览器加载脚本的问题

This commit is contained in:
王一之 2025-04-28 23:24:11 +08:00
parent 8a216933ca
commit 1aaf1bbd4a

View File

@ -164,6 +164,10 @@ export class RuntimeService {
}); });
} }
getMessageFlag() {
return Cache.getInstance().get("scriptInjectMessageFlag");
}
// 给指定tab发送消息 // 给指定tab发送消息
sendMessageToTab(to: ExtMessageSender, action: string, data: any) { sendMessageToTab(to: ExtMessageSender, action: string, data: any) {
if (to.tabId === -1) { if (to.tabId === -1) {
@ -286,40 +290,57 @@ export class RuntimeService {
} }
// 注册inject.js // 注册inject.js
registerInjectScript() { async registerInjectScript() {
chrome.userScripts.getScripts({ ids: ["scriptcat-inject"] }).then((res) => { // 如果没设置过, 则更新messageFlag
if (res.length == 0) { let messageFlag = await this.getMessageFlag();
chrome.userScripts.configureWorld({ if (!messageFlag) {
csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *", messageFlag = await this.messageFlag();
messaging: true, const injectJs = await fetch("inject.js").then((res) => res.text());
// 替换ScriptFlag
const code = `(function (MessageFlag) {\n${injectJs}\n})('${messageFlag}')`;
chrome.userScripts.configureWorld({
csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *",
messaging: true,
});
const scripts: chrome.userScripts.RegisteredUserScript[] = [
{
id: "scriptcat-inject",
js: [{ code }],
matches: ["<all_urls>"],
allFrames: true,
world: "MAIN",
runAt: "document_start",
},
// 注册content
{
id: "scriptcat-content",
js: [{ file: "src/content.js" }],
matches: ["<all_urls>"],
allFrames: true,
runAt: "document_start",
world: "USER_SCRIPT",
},
];
try {
// 如果使用getScripts来判断, 会出现找不到的问题
// 另外如果使用
await chrome.userScripts.register(scripts);
} catch (e: any) {
LoggerCore.logger().error("register inject.js error", {
error: e,
}); });
fetch("inject.js") if (e.message?.indexOf("Duplicate script ID") !== -1) {
.then((res) => res.text()) // 如果是重复注册, 则更新
.then(async (injectJs) => { chrome.userScripts.update(scripts, () => {
// 替换ScriptFlag if (chrome.runtime.lastError) {
const code = `(function (MessageFlag) {\n${injectJs}\n})('${await this.messageFlag()}')`; LoggerCore.logger().error("update inject.js error", {
chrome.userScripts.register([ error: chrome.runtime.lastError,
{ });
id: "scriptcat-inject", }
js: [{ code }],
matches: ["<all_urls>"],
allFrames: true,
world: "MAIN",
runAt: "document_start",
},
// 注册content
{
id: "scriptcat-content",
js: [{ file: "src/content.js" }],
matches: ["<all_urls>"],
allFrames: true,
runAt: "document_start",
world: "USER_SCRIPT",
},
]);
}); });
}
} }
}); }
} }
loadingScript: Promise<void> | null | undefined; loadingScript: Promise<void> | null | undefined;
@ -473,18 +494,27 @@ export class RuntimeService {
if (scriptRes.metadata["run-at"]) { if (scriptRes.metadata["run-at"]) {
registerScript.runAt = getRunAt(scriptRes.metadata["run-at"]); registerScript.runAt = getRunAt(scriptRes.metadata["run-at"]);
} }
if (await Cache.getInstance().get("registryScript:" + script.uuid)) { const res = await chrome.userScripts.getScripts({ ids: [script.uuid] });
await chrome.userScripts.update([registerScript]); const logger = LoggerCore.logger({
name: script.name,
registerMatch: {
matches: registerScript.matches,
excludeMatches: registerScript.excludeMatches,
},
});
if (res.length > 0) {
await chrome.userScripts.update([registerScript], () => {
if (chrome.runtime.lastError) {
logger.error("update registerScript error", {
error: chrome.runtime.lastError,
});
}
});
} else { } else {
await chrome.userScripts.register([registerScript], () => { await chrome.userScripts.register([registerScript], () => {
if (chrome.runtime.lastError) { if (chrome.runtime.lastError) {
LoggerCore.logger().error("registerScript error", { logger.error("registerScript error", {
error: chrome.runtime.lastError, error: chrome.runtime.lastError,
name: script.name,
registerMatch: {
matches: registerScript.matches,
excludeMatches: registerScript.excludeMatches,
},
}); });
} }
}); });