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

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,19 +290,19 @@ 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();
if (!messageFlag) {
messageFlag = await this.messageFlag();
const injectJs = await fetch("inject.js").then((res) => res.text());
// 替换ScriptFlag
const code = `(function (MessageFlag) {\n${injectJs}\n})('${messageFlag}')`;
chrome.userScripts.configureWorld({ chrome.userScripts.configureWorld({
csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *", csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *",
messaging: true, messaging: true,
}); });
fetch("inject.js") const scripts: chrome.userScripts.RegisteredUserScript[] = [
.then((res) => res.text())
.then(async (injectJs) => {
// 替换ScriptFlag
const code = `(function (MessageFlag) {\n${injectJs}\n})('${await this.messageFlag()}')`;
chrome.userScripts.register([
{ {
id: "scriptcat-inject", id: "scriptcat-inject",
js: [{ code }], js: [{ code }],
@ -316,11 +320,28 @@ export class RuntimeService {
runAt: "document_start", runAt: "document_start",
world: "USER_SCRIPT", world: "USER_SCRIPT",
}, },
]); ];
try {
// 如果使用getScripts来判断, 会出现找不到的问题
// 另外如果使用
await chrome.userScripts.register(scripts);
} catch (e: any) {
LoggerCore.logger().error("register inject.js error", {
error: e,
});
if (e.message?.indexOf("Duplicate script ID") !== -1) {
// 如果是重复注册, 则更新
chrome.userScripts.update(scripts, () => {
if (chrome.runtime.lastError) {
LoggerCore.logger().error("update inject.js error", {
error: chrome.runtime.lastError,
}); });
} }
}); });
} }
}
}
}
loadingScript: Promise<void> | null | undefined; loadingScript: Promise<void> | null | undefined;
@ -473,19 +494,28 @@ 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({
} else {
await chrome.userScripts.register([registerScript], () => {
if (chrome.runtime.lastError) {
LoggerCore.logger().error("registerScript error", {
error: chrome.runtime.lastError,
name: script.name, name: script.name,
registerMatch: { registerMatch: {
matches: registerScript.matches, matches: registerScript.matches,
excludeMatches: registerScript.excludeMatches, 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 {
await chrome.userScripts.register([registerScript], () => {
if (chrome.runtime.lastError) {
logger.error("registerScript error", {
error: chrome.runtime.lastError,
});
} }
}); });
} }