Skip to content

Commit a24a9ea

Browse files
committed
🚧 firefox mv3兼容
1 parent caa3bf2 commit a24a9ea

10 files changed

Lines changed: 80 additions & 51 deletions

File tree

packages/filesystem/baidu/baidu.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,9 @@ export default class BaiduFileSystem implements FileSystem {
6666
id: 100,
6767
action: {
6868
type: "modifyHeaders" as chrome.declarativeNetRequest.RuleActionType,
69-
responseHeaders: [{ operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE, header: "cookie" }],
69+
responseHeaders: [
70+
{ operation: "remove" as chrome.declarativeNetRequest.HeaderOperation, header: "cookie" },
71+
],
7072
},
7173
condition: {
7274
urlFilter: url,

src/app/service/content/content.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,5 +104,6 @@ export default class ContentRuntime {
104104
);
105105
const client = new Client(this.msg, "inject");
106106
client.do("pageLoad", { scripts });
107+
console.log("pageLoad", scripts);
107108
}
108109
}

src/app/service/service_worker/gm_api.ts

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ export default class GMApi {
381381
const requestHeaders = [
382382
{
383383
header: "X-Scriptcat-GM-XHR-Request-Id",
384-
operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE,
384+
operation: "remove" as chrome.declarativeNetRequest.HeaderOperation,
385385
},
386386
] as chrome.declarativeNetRequest.ModifyHeaderInfo[];
387387
Object.keys(headers).forEach((key) => {
@@ -391,7 +391,7 @@ export default class GMApi {
391391
if (headers[key]) {
392392
requestHeaders.push({
393393
header: key,
394-
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
394+
operation: "set" as chrome.declarativeNetRequest.HeaderOperation,
395395
value: headers[key],
396396
});
397397
}
@@ -400,7 +400,7 @@ export default class GMApi {
400400
} else {
401401
requestHeaders.push({
402402
header: key,
403-
operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE,
403+
operation: "remove" as chrome.declarativeNetRequest.HeaderOperation,
404404
});
405405
delete headers[key];
406406
}
@@ -411,14 +411,14 @@ export default class GMApi {
411411
if (params.cookie) {
412412
requestHeaders.push({
413413
header: "cookie",
414-
operation: chrome.declarativeNetRequest.HeaderOperation.SET,
414+
operation: "set" as chrome.declarativeNetRequest.HeaderOperation,
415415
value: params.cookie,
416416
});
417417
} else {
418418
// 否则删除cookie
419419
requestHeaders.push({
420420
header: "cookie",
421-
operation: chrome.declarativeNetRequest.HeaderOperation.REMOVE,
421+
operation: "remove" as chrome.declarativeNetRequest.HeaderOperation,
422422
});
423423
}
424424
} else if (params.cookie) {
@@ -923,6 +923,12 @@ export default class GMApi {
923923

924924
// 处理GM_xmlhttpRequest请求
925925
handlerGmXhr() {
926+
const reqOpt = ["requestHeaders"];
927+
const respOpt = ["responseHeaders"];
928+
if (!isFirefox()) {
929+
reqOpt.push("extraHeaders");
930+
respOpt.push("extraHeaders");
931+
}
926932
chrome.webRequest.onBeforeSendHeaders.addListener(
927933
(details) => {
928934
if (details.tabId === -1) {
@@ -940,7 +946,7 @@ export default class GMApi {
940946
urls: ["<all_urls>"],
941947
types: ["xmlhttprequest"],
942948
},
943-
["requestHeaders", "extraHeaders"]
949+
reqOpt
944950
);
945951
chrome.webRequest.onHeadersReceived.addListener(
946952
(details) => {
@@ -964,7 +970,7 @@ export default class GMApi {
964970
urls: ["<all_urls>"],
965971
types: ["xmlhttprequest"],
966972
},
967-
["responseHeaders", "extraHeaders"]
973+
respOpt
968974
);
969975
}
970976

src/app/service/service_worker/runtime.ts

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import PermissionVerify from "./permission_verify";
2626
import { SystemConfig } from "@App/pkg/config/config";
2727
import { ResourceService } from "./resource";
2828
import { LocalStorageDAO } from "@App/app/repo/localStorage";
29+
import Logger from "@App/app/logger/logger";
2930

3031
// 为了优化性能,存储到缓存时删除了code、value与resource
3132
export interface ScriptMatchInfo extends ScriptRunResouce {
@@ -299,6 +300,7 @@ export class RuntimeService {
299300
scripts: enableScript,
300301
});
301302

303+
console.log("pageLoad", enableScript);
302304
return Promise.resolve({ flag: scriptFlag, scripts: enableScript });
303305
}
304306

@@ -323,13 +325,29 @@ export class RuntimeService {
323325
let messageFlag = await this.getMessageFlag();
324326
if (!messageFlag) {
325327
messageFlag = await this.messageFlag();
326-
const injectJs = await fetch("inject.js").then((res) => res.text());
328+
const injectJs = await fetch("/src/inject.js").then((res) => res.text());
327329
// 替换ScriptFlag
328330
const code = `(function (MessageFlag) {\n${injectJs}\n})('${messageFlag}')`;
329331
chrome.userScripts.configureWorld({
330332
csp: "script-src 'self' 'unsafe-inline' 'unsafe-eval' *",
331333
messaging: true,
332334
});
335+
try {
336+
// 注册content.js
337+
await chrome.scripting.registerContentScripts([
338+
{
339+
id: "scriptcat-content",
340+
js: ["/src/content.js"],
341+
matches: ["<all_urls>"],
342+
allFrames: true,
343+
runAt: "document_start",
344+
world: "ISOLATED",
345+
},
346+
]);
347+
} catch (e) {
348+
LoggerCore.logger().error("update inject.js error", Logger.E(e));
349+
throw e;
350+
}
333351
const scripts: chrome.userScripts.RegisteredUserScript[] = [
334352
{
335353
id: "scriptcat-inject",
@@ -339,33 +357,20 @@ export class RuntimeService {
339357
world: "MAIN",
340358
runAt: "document_start",
341359
},
342-
// 注册content
343-
{
344-
id: "scriptcat-content",
345-
js: [{ file: "src/content.js" }],
346-
matches: ["<all_urls>"],
347-
allFrames: true,
348-
runAt: "document_start",
349-
world: "USER_SCRIPT",
350-
},
351360
];
352361
try {
353362
// 如果使用getScripts来判断, 会出现找不到的问题
354363
// 另外如果使用
355364
await chrome.userScripts.register(scripts);
356365
} catch (e: any) {
357-
LoggerCore.logger().error("register inject.js error", {
358-
error: e,
359-
});
366+
LoggerCore.logger().error("register inject.js error", Logger.E(e));
360367
if (e.message?.indexOf("Duplicate script ID") !== -1) {
361368
// 如果是重复注册, 则更新
362-
chrome.userScripts.update(scripts, () => {
363-
if (chrome.runtime.lastError) {
364-
LoggerCore.logger().error("update inject.js error", {
365-
error: chrome.runtime.lastError,
366-
});
367-
}
368-
});
369+
try {
370+
await chrome.userScripts.update(scripts);
371+
} catch (e) {
372+
LoggerCore.logger().error("update inject.js error", Logger.E(e));
373+
}
369374
}
370375
}
371376
}
@@ -536,21 +541,17 @@ export class RuntimeService {
536541
},
537542
});
538543
if (res.length > 0) {
539-
await chrome.userScripts.update([registerScript], () => {
540-
if (chrome.runtime.lastError) {
541-
logger.error("update registerScript error", {
542-
error: chrome.runtime.lastError,
543-
});
544-
}
545-
});
544+
try {
545+
await chrome.userScripts.update([registerScript]);
546+
} catch (e) {
547+
logger.error("update registerScript error", Logger.E(e));
548+
}
546549
} else {
547-
await chrome.userScripts.register([registerScript], () => {
548-
if (chrome.runtime.lastError) {
549-
logger.error("registerScript error", {
550-
error: chrome.runtime.lastError,
551-
});
552-
}
553-
});
550+
try {
551+
await chrome.userScripts.register([registerScript]);
552+
} catch (e) {
553+
logger.error("registerScript error", Logger.E(e));
554+
}
554555
}
555556
await Cache.getInstance().set("registryScript:" + script.uuid, true);
556557
}

src/app/service/service_worker/script.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ export class ScriptService {
4040

4141
listenerScriptInstall() {
4242
// 初始化脚本安装监听
43+
console.log("init script install listener");
4344
chrome.webRequest.onBeforeRequest.addListener(
4445
(req: chrome.webRequest.WebRequestBodyDetails) => {
46+
console.log(req);
4547
// 处理url, 实现安装脚本
4648
if (req.method !== "GET") {
4749
return;
@@ -101,9 +103,9 @@ export class ScriptService {
101103
},
102104
{
103105
urls: [
104-
"https://docs.scriptcat.org/docs/script_installation/",
105-
"https://docs.scriptcat.org/en/docs/script_installation/",
106-
"https://www.tampermonkey.net/script_installation.php",
106+
"https://docs.scriptcat.org/docs/script_installation/*",
107+
"https://docs.scriptcat.org/en/docs/script_installation/*",
108+
"https://www.tampermonkey.net/script_installation.php*",
107109
],
108110
types: ["main_frame"],
109111
}

src/content.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const loggerCore = new LoggerCore({
1717

1818
const client = new RuntimeClient(send);
1919
client.pageLoad().then((data) => {
20-
loggerCore.logger().debug("content start");
20+
loggerCore.logger().debug("content start",chrome.runtime);
2121
const extMsg = new ExtensionMessage();
2222
const msg = new CustomEventMessage(data.flag, true);
2323
const server = new Server("content", msg);

src/inject.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const server = new Server("inject", msg);
1818
server.on("pageLoad", (data: { scripts: ScriptRunResouce[] }) => {
1919
logger.logger().debug("inject start");
2020
// 监听事件
21+
console.log("pageLoad", data);
2122
const runtime = new InjectRuntime(server, msg, data.scripts);
2223
runtime.start();
2324
});

src/manifest.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
"unlimitedStorage",
4242
"declarativeNetRequest"
4343
],
44+
"optional_permissions": [
45+
"userScripts"
46+
],
4447
"host_permissions": [
4548
"<all_urls>"
4649
],

src/pages/popup/App.tsx

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import ScriptMenuList from "../components/ScriptMenuList";
1818
import { popupClient } from "../store/features/script";
1919
import { ScriptMenu } from "@App/app/service/service_worker/popup";
2020
import { systemConfig } from "../store/global";
21-
import { isUserScriptsAvailable } from "@App/pkg/utils/utils";
21+
import { isFirefox, isUserScriptsAvailable } from "@App/pkg/utils/utils";
2222

2323
const CollapseItem = Collapse.Item;
2424

@@ -86,9 +86,21 @@ function App() {
8686
}, []);
8787
return (
8888
<>
89-
{!isUserScriptsAvailable() && (
90-
<Alert type="warning" content={<div dangerouslySetInnerHTML={{ __html: t("develop_mode_guide") }} />} />
91-
)}
89+
{!isUserScriptsAvailable() &&
90+
(isFirefox() ? (
91+
<>
92+
<Alert type="warning" content={<div dangerouslySetInnerHTML={{ __html: t("develop_mode_guide") }} />} />
93+
<Button
94+
onClick={() => {
95+
chrome.permissions.request({ permissions: ["userScripts"] });
96+
}}
97+
>
98+
申请权限
99+
</Button>
100+
</>
101+
) : (
102+
<Alert type="warning" content={<div dangerouslySetInnerHTML={{ __html: t("develop_mode_guide") }} />} />
103+
))}
92104
<Card
93105
size="small"
94106
title={

src/pkg/utils/utils.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,8 @@ export function isUserScriptsAvailable() {
269269
try {
270270
// Property access which throws if developer mode is not enabled.
271271
chrome.userScripts;
272-
return true;
272+
// 兼容chrome的写法
273+
return !!chrome.userScripts;
273274
} catch {
274275
// Not available.
275276
return false;

0 commit comments

Comments
 (0)