Skip to content
Open
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
3 changes: 2 additions & 1 deletion packages/chrome-extension-mock/declarativ_net_request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,10 @@ export default class DeclarativeNetRequest {
OTHER: "other",
};

updateSessionRules() {
updateSessionRules(rule: any, callback?: any) {
return new Promise<void>((resolve) => {
resolve();
callback?.();
});
}
}
58 changes: 58 additions & 0 deletions src/app/service/service_worker/dnr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/**
* scheduler 用于 Service Worker 或 Event Page, Chrome 94+, Firefox 142+
*/
const scheduler_ =
typeof scheduler !== "undefined" &&
typeof scheduler?.postTask === "function" &&
typeof scheduler?.yield === "function"
? scheduler
: null;

// 用于扩充初始化时新增 SessionRules. FireFox 需要等一等才加,否则会失效。
export const addSessionRules = async (rules: chrome.declarativeNetRequest.Rule[], resolve?: ResolveFn) => {
await scheduler_?.yield?.();
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [...rules.map((rule) => rule.id)],
addRules: rules,
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
resolve?.();
}
);
};

export const sessionRuleDynamicAdd = (rule: chrome.declarativeNetRequest.Rule, resolve?: ResolveFn) => {
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [rule.id],
addRules: [rule],
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
resolve?.();
}
);
};

export const sessionRuleDynamicRemove = (ruleId: number, resolve?: ResolveFn) => {
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [ruleId],
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
resolve?.();
}
);
};
44 changes: 5 additions & 39 deletions src/app/service/service_worker/gm_api/gm_api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ import { headerModifierMap, headersReceivedMap } from "./gm_xhr";
import { BgGMXhr } from "@App/pkg/utils/xhr/bg_gm_xhr";
import { mightPrepareSetClipboard, setClipboard } from "../clipboard";
import { nativePageWindowOpen } from "../../offscreen/gm_api";
import { addSessionRules, sessionRuleDynamicAdd, sessionRuleDynamicRemove } from "../dnr";

let generatedUniqueMarkerIDs = "";
let generatedUniqueMarkerIDWhen = "";
Expand Down Expand Up @@ -712,10 +713,7 @@ export default class GMApi {
},
} as chrome.declarativeNetRequest.Rule;
headerModifierMap.set(markerID, { rule, redirectNotManual });
await chrome.declarativeNetRequest.updateSessionRules({
removeRuleIds: [ruleId],
addRules: [rule],
});
await new Promise((resolve) => sessionRuleDynamicAdd(rule, resolve));
}
return true;
}
Expand Down Expand Up @@ -1594,32 +1592,11 @@ export default class GMApi {
},
};
headerModifierMap.set(markerID, { rule: newRule, redirectNotManual });
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [rule.id],
addRules: [newRule],
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
}
);
sessionRuleDynamicAdd(newRule);
} else {
// 删除关联与DNR
headerModifierMap.delete(markerID);
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [rule.id],
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
}
);
sessionRuleDynamicRemove(rule.id);
}
}
}
Expand Down Expand Up @@ -1650,18 +1627,7 @@ export default class GMApi {
tabIds: [chrome.tabs.TAB_ID_NONE], // 只限于后台 service_worker / offscreen
},
} as chrome.declarativeNetRequest.Rule;
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [ruleId],
addRules: [rule],
},
() => {
const lastError = chrome.runtime.lastError;
if (lastError) {
console.error("chrome.declarativeNetRequest.updateSessionRules:", lastError);
}
}
);
addSessionRules([rule]);
}

start() {
Expand Down
16 changes: 2 additions & 14 deletions src/app/service/service_worker/script.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ import { getSimilarityScore, ScriptUpdateCheck } from "./script_update_check";
import { LocalStorageDAO } from "@App/app/repo/localStorage";
import { CompiledResourceDAO } from "@App/app/repo/resource";
import { initRegularUpdateCheck } from "./regular_updatecheck";
import { addSessionRules } from "./dnr";

export type TCheckScriptUpdateOption = Partial<
{ checkType: "user"; noUpdateCheck?: number } | ({ checkType: "system" } & Record<string, any>)
Expand Down Expand Up @@ -299,20 +300,7 @@ export class ScriptService {
}
}
);
chrome.declarativeNetRequest.updateSessionRules(
{
removeRuleIds: [...rules.map((rule) => rule.id)],
addRules: rules,
},
() => {
if (chrome.runtime.lastError) {
console.error(
"chrome.runtime.lastError in chrome.declarativeNetRequest.updateSessionRules:",
chrome.runtime.lastError
);
}
}
);
addSessionRules(rules);
}

public async openInstallPageByUrl(
Expand Down
14 changes: 14 additions & 0 deletions src/types/main.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,20 @@ declare module "@App/app/types.d.ts";
type Override<T, U> = Omit<T, keyof U> & U;
type ValueOf<T> = T[keyof T];
type ReactStateSetter<T> = (value: T | ((prev: T) => T)) => void;
type ResolveFn<T = void> = (val: T) => void;

interface SchedulerPostTaskOptions {
delay?: number;
priority?: "user-blocking" | "user-visible" | "background";
signal?: AbortSignal;
}

interface Scheduler {
postTask<T>(callback: () => T | Promise<T>, options?: SchedulerPostTaskOptions): Promise<T>;
yield(): Promise<void>;
}

declare let scheduler: Scheduler | undefined;

declare const sandbox: Window;

Expand Down
Loading