Skip to content

Commit 427f6ae

Browse files
committed
fix: revert firefox csp revise
1 parent 8eaadfd commit 427f6ae

File tree

5 files changed

+31
-43
lines changed

5 files changed

+31
-43
lines changed

packages/force-copy/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "force-copy",
3-
"version": "1.0.9",
3+
"version": "1.0.10",
44
"author": "Czy",
55
"license": "MIT",
66
"sideEffects": false,
@@ -10,8 +10,8 @@
1010
"dev:rollup": "cross-env NODE_ENV=development rollup -wc",
1111
"dev:gecko": "cross-env NODE_ENV=development PLATFORM=gecko rspack build --watch",
1212
"build:gecko": "rm -rf build-gecko && cross-env PLATFORM=gecko rspack build",
13-
"build:zip": "mkdir -p .zip && cd build && zip -r ../.zip/chromium.zip .",
14-
"build:zip:gecko": "mkdir -p .zip && cd build-gecko && zip -r ../.zip/gecko.zip .",
13+
"build:zip": "mkdir -p .zip && rm -f .zip/chromium.zip && cd build && zip -r ../.zip/chromium.zip .",
14+
"build:zip:gecko": "mkdir -p .zip && rm -f .zip/gecko.zip && cd build-gecko && zip -r ../.zip/gecko.zip .",
1515
"lint:ts": "../../node_modules/typescript/bin/tsc --noEmit"
1616
},
1717
"repository": {

packages/force-copy/src/content/runtime/script.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ export const importInjectScript = () => {
2626
script.onload = () => {
2727
script.remove();
2828
// 如果仍然不存在 尝试在 Content Script 中执行
29+
// 在 Content Script 中执行可以保证 DOM 事件类型的处理
30+
!unsafeWindow[signal] && fn();
31+
};
32+
script.onerror = () => {
33+
script.remove();
2934
!unsafeWindow[signal] && fn();
3035
};
3136
}

packages/force-copy/src/manifest/index.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,7 @@ if (process.env.PLATFORM === "gecko") {
5656
__MANIFEST__.background = {
5757
scripts: [__MANIFEST__.background.service_worker],
5858
};
59-
__MANIFEST__.permissions = [
60-
"activeTab",
61-
"tabs",
62-
"webRequest",
63-
"webRequestBlocking",
64-
"management",
65-
...__URL_MATCH__,
66-
];
59+
__MANIFEST__.permissions = ["activeTab", "tabs", "webRequest", "management", ...__URL_MATCH__];
6760
__MANIFEST__.browser_specific_settings = {
6861
gecko: { strict_min_version: "91.1.0" },
6962
gecko_android: { strict_min_version: "91.1.0" },

packages/force-copy/src/utils/logger.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@ class Logger {
1414

1515
info(...args: unknown[]) {
1616
if (this.level <= LOG_LEVEL.INFO) {
17-
console.log("FC Log: ", ...args);
17+
console.log("FC Log:", ...args);
1818
}
1919
}
2020

2121
trace(...args: unknown[]) {
2222
if (this.level <= LOG_LEVEL.INFO) {
23-
console.trace("FC Trace: ", ...args);
23+
console.trace("FC Trace:", ...args);
2424
}
2525
}
2626

2727
warning(...args: unknown[]) {
2828
if (this.level <= LOG_LEVEL.WARNING) {
29-
console.warn("FC Warning: ", ...args);
29+
console.warn("FC Warning:", ...args);
3030
}
3131
}
3232

3333
error(...args: unknown[]) {
3434
if (this.level <= LOG_LEVEL.ERROR) {
35-
console.error("FC Error: ", ...args);
35+
console.error("FC Error:", ...args);
3636
}
3737
}
3838
}

packages/force-copy/src/worker/runtime/script.ts

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,14 @@ export const importWorkerScript = () => {
4949

5050
// #IFDEF GECKO
5151
logger.info("Register Inject Scripts By Content Script Inline Code");
52-
// 使用 cross.tabs.executeScript 得到的 windowcontent window
53-
// 此时就必须要使用 inject script 的方式才能正常注入脚本
54-
// 然而这种方式就会受到 content security policy 策略的限制
52+
// 使用 cross.tabs.executeScript 得到的 WindowContent Window
53+
// 此时就必须要使用 Inject Script 的方式才能正常注入脚本
54+
// 然而这种方式就会受到 Content Security Policy 策略的限制
5555
// https://github.com/violentmonkey/violentmonkey/issues/1001
56+
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
5657
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onHeadersReceived
57-
chrome.webRequest.onHeadersReceived.addListener(
58+
// https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webRequest/onResponseStarted
59+
chrome.webRequest.onResponseStarted.addListener(
5860
res => {
5961
if (!res.responseHeaders) return void 0;
6062
if (res.type !== "main_frame" && res.type !== "sub_frame") {
@@ -65,24 +67,14 @@ export const importWorkerScript = () => {
6567
// 仅处理 CSP 的问题
6668
if (responseHeaderName !== "content-security-policy") continue;
6769
const value = res.responseHeaders[i].value || "";
68-
const types = value.split(";").map(it => it.trim());
69-
const target: string[] = [];
70-
// CSP 不支持多个 nonce, 但可以配置多个 hash
71-
// 这里的 hash 会在编译时计算并替换资源
72-
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
73-
const hashed = "'sha256-${CSP-HASH}'";
74-
for (const item of types) {
75-
const [type, ...rest] = item.split(" ");
76-
if (type === "script-src" || type === "default-src") {
77-
target.push([type, hashed, ...rest].join(" "));
78-
continue;
79-
}
80-
target.push(item);
81-
}
82-
// 覆盖原有的响应头, 扩展的 CSP 总是更倾向于更加严格的模式
83-
// 实际测试中仅有完全抹除标头时, 才可以解决冲突的问题
84-
res.responseHeaders[i].value = target.join(";");
85-
// 存在 CSP 时尝试直接在 content script 中执行
70+
// CSP 不支持多个 nonce, 但可以配置多个 sha-hash
71+
// 这里的 hash 会在编译时计算并替换资源 'sha256-${CSP-HASH}'
72+
// 但对 CSP 策略修改存在问题, 这里仅读取并尝试注入, 而不直接增加 hash
73+
// 例如 'self' => ok / 'self'+'hash' => error 宽松到严格结构问题
74+
// 此外即使覆盖原有的响应头, 扩展的 CSP 总是更倾向于更加严格的模式
75+
// 在实际测试中, 仅有完全抹除标头时, 才可以实际解决多个扩展冲突的问题
76+
// ...
77+
// 存在 CSP 时尝试直接在 Content Script 中执行
8678
let code = [
8779
`if (window["${process.env.INJECT_FILE}"] && document instanceof XMLDocument === false) {`,
8880
` window["${process.env.INJECT_FILE}"]();`,
@@ -102,7 +94,7 @@ export const importWorkerScript = () => {
10294
code = [
10395
CODE_PREFIX,
10496
`script.nonce = "${nonce[1]}";`,
105-
`script.innerText = code`,
97+
`script.innerText = code;`,
10698
CODE_SUFFIX,
10799
].join("\n");
108100
}
@@ -125,13 +117,11 @@ export const importWorkerScript = () => {
125117
// @ts-expect-error filter params
126118
cross.tabs.onUpdated.addListener(onUpdate, { tabId: res.tabId });
127119
}
128-
// 返回修改后的响应头配置
129-
return {
130-
responseHeaders: res.responseHeaders,
131-
};
120+
// onHeadersReceived 仅读取响应头而不修改
121+
return void 0;
132122
},
133123
{ urls: URL_MATCH, types: ["main_frame", "sub_frame"] },
134-
["blocking", "responseHeaders"]
124+
["responseHeaders"]
135125
);
136126
// #ENDIF
137127
};

0 commit comments

Comments
 (0)