Skip to content

Commit d8274f9

Browse files
committed
fix: sw issues
1 parent 9472afb commit d8274f9

8 files changed

Lines changed: 35 additions & 33 deletions

File tree

src/pages/background/api-handler.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import logger from '@/share/core/logger';
33
import { APIs, TABLE_NAMES_ARR } from '@/share/core/constant';
44
import { prefs } from '@/share/core/prefs';
55
import emitter from '@/share/core/emitter';
6-
import rules from './core/rules';
6+
import * as rules from './core/rules';
77
import { openURL } from './utils';
88
import { getDatabase } from './core/db';
99

@@ -22,11 +22,11 @@ function execute(request: any) {
2222
case APIs.OPEN_URL:
2323
return openURL(request);
2424
case APIs.GET_RULES:
25-
return Promise.resolve(rules.get(request.type, request.options));
25+
return rules.waitLoad().then(() => rules.get(request.type, request.options));
2626
case APIs.SAVE_RULE:
27-
return rules.save(request.rule);
27+
return rules.waitLoad().then(() => rules.save(request.rule));
2828
case APIs.DELETE_RULE:
29-
return rules.remove(request.type, request.id);
29+
return rules.waitLoad().then(() => rules.remove(request.type, request.id));
3030
case APIs.SET_PREFS:
3131
return prefs.set(request.key, request.value);
3232
case APIs.UPDATE_CACHE:

src/pages/background/core/rules.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import { prefs } from '@/share/core/prefs';
99
import emitter from '@/share/core/emitter';
1010
import { getDatabase } from './db';
1111

12+
let isInit = false;
13+
1214
const cache: { [key: string]: null | InitdRule[] } = {};
1315
TABLE_NAMES_ARR.forEach((t) => {
1416
cache[t] = null;
@@ -216,26 +218,33 @@ function init() {
216218
Promise.all(queue).then(() => {
217219
if (TABLE_NAMES_ARR.some((tableName) => cache[tableName] === null)) {
218220
init();
221+
} else {
222+
isInit = true;
223+
emitter.emit(emitter.INNER_RULE_LOADED);
219224
}
220225
});
221226
});
222227
}
223228

224-
if (MANIFEST_VER === 'v3' && typeof window === 'undefined') {
225-
// this is service worker
226-
addEventListener('activate', () => {
227-
init();
229+
function waitLoad() {
230+
return new Promise((resolve) => {
231+
if (isInit) {
232+
resolve(true);
233+
} else {
234+
emitter.once(emitter.INNER_RULE_LOADED, resolve);
235+
}
228236
});
229-
} else {
230-
init();
231237
}
232238

233-
export default {
239+
init();
240+
241+
export {
234242
get,
235243
getAll,
236244
filter,
237245
save,
238246
remove,
239247
updateCache,
240248
convertToBasicRule,
249+
waitLoad,
241250
};

src/pages/background/index.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,7 @@ if (ENABLE_DNR) {
3030
});
3131
}
3232

33-
if (MANIFEST_VER === 'v3' && typeof window === 'undefined') {
34-
// this is service worker
35-
addEventListener('activate', () => {
36-
if (IS_DEV) {
37-
console.log('service worker activated');
38-
}
39-
init();
40-
});
41-
} else {
33+
init();
34+
if (MANIFEST_VER !== 'v3' && typeof window !== 'undefined') {
4235
window.IS_BACKGROUND = true;
43-
init();
4436
}

src/pages/background/request-handler/dnr-handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { prefs } from '@/share/core/prefs';
55
import { detectRunner } from '@/share/core/rule-utils';
66
import type { Rule, RULE_ACTION_OBJ } from '@/share/core/types';
77
import { getVirtualKey } from '@/share/core/utils';
8-
import rules from '../core/rules';
8+
import { getAll } from '../core/rules';
99
import type { DeclarativeNetRequest } from 'webextension-polyfill/namespaces/declarativeNetRequest';
1010

1111
type DNRRule = DeclarativeNetRequest.Rule;
@@ -134,7 +134,7 @@ class DNRRequestHandler {
134134
}
135135

136136
private async initRules() {
137-
const v = Object.values(rules.getAll());
137+
const v = Object.values(getAll());
138138

139139
if (v.some((x) => x === null)) {
140140
// rule not ready

src/pages/background/request-handler/web-request-handler.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import logger from '@/share/core/logger';
66
import type { Rule, RULE_ACTION_OBJ } from '@/share/core/types';
77
import { TABLE_NAMES } from '@/share/core/constant';
88
import { prefs } from '@/share/core/prefs';
9-
import rules from '../core/rules';
9+
import { get as getRules } from '../core/rules';
1010

1111
// 最大修改8MB的Body
1212
const MAX_BODY_SIZE = 8 * 1024 * 1024;
@@ -141,7 +141,7 @@ class WebRequestHandler {
141141
}
142142
logger.debug(`handle before request ${e.url}`, e);
143143
// 可用:重定向,阻止加载
144-
const rule = rules.get(TABLE_NAMES.request, { url: e.url, enable: true });
144+
const rule = getRules(TABLE_NAMES.request, { url: e.url, enable: true });
145145
// Browser is starting up, pass all requests
146146
if (rule === null) {
147147
return;
@@ -201,7 +201,7 @@ class WebRequestHandler {
201201
return;
202202
}
203203
logger.debug(`handle before send ${e.url}`, e.requestHeaders);
204-
const rule = rules.get(TABLE_NAMES.sendHeader, { url: e.url, enable: true });
204+
const rule = getRules(TABLE_NAMES.sendHeader, { url: e.url, enable: true });
205205
// Browser is starting up, pass all requests
206206
if (rule === null) {
207207
return;
@@ -245,7 +245,7 @@ class WebRequestHandler {
245245
return;
246246
}
247247
logger.debug(`handle received ${e.url}`, e.responseHeaders);
248-
const rule = rules.get(TABLE_NAMES.receiveHeader, { url: e.url, enable: true });
248+
const rule = getRules(TABLE_NAMES.receiveHeader, { url: e.url, enable: true });
249249
// Browser is starting up, pass all requests
250250
if (rule) {
251251
this.modifyHeaders(e, REQUEST_TYPE.RESPONSE, rule, detail);
@@ -429,7 +429,7 @@ class WebRequestHandler {
429429
return;
430430
}
431431

432-
let rule = rules.get(TABLE_NAMES.receiveBody, { url: e.url, enable: true });
432+
let rule = getRules(TABLE_NAMES.receiveBody, { url: e.url, enable: true });
433433
if (rule === null) {
434434
return;
435435
}

src/pages/options/sections/rules/edit/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export default class Edit extends React.Component<EditProps, EditState> {
127127
// 初始化
128128
if (reInit || !this.initedRule) {
129129
try {
130-
this.initedRule = initRule(this.state.rule);
130+
this.initedRule = initRule(this.state.rule, true);
131131
} catch (e) {
132132
// 出错
133133
this.setState({
@@ -311,7 +311,7 @@ export default class Edit extends React.Component<EditProps, EditState> {
311311
{this.state.rule.matchType !== 'all' && (
312312
<Form.Input label={t('matchRule')} field="pattern" />
313313
)}
314-
<Form.Input label={t('excludeRule')} field="exclude" />
314+
<Form.Input label={t('excludeRule')} field="exclude" disabled={!ENABLE_WEB_REQUEST} />
315315
{/* Response body encoding */}
316316
{this.state.rule.ruleType === 'modifyReceiveBody' && (
317317
<Form.Select filter field="encoding" label={t('encoding')} optionList={ENCODING_LIST.map((x) => ({ label: x, value: x }))} />
@@ -322,7 +322,7 @@ export default class Edit extends React.Component<EditProps, EditState> {
322322
field="isFunction"
323323
options={[
324324
{ label: t('exec_normal'), value: false },
325-
{ label: t('exec_function'), value: true },
325+
{ label: t('exec_function'), value: true, disabled: !ENABLE_EVAL },
326326
]}
327327
/>
328328
{/* Redirect */}

src/share/core/emitter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ class Emitter extends EventEmitter {
88

99
EVENT_PREFS_UPDATE = 'b3';
1010
EVENT_PREFS_READY = 'b4';
11+
INNER_RULE_LOADED = 'b5';
1112

1213
INNER_RULE_UPDATE = 'c1';
1314
INNER_RULE_REMOVE = 'c2';

src/share/core/rule-utils.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ export function detectRunner(rule: Rule): 'web_request' | 'dnr' {
1313
return 'dnr';
1414
}
1515

16-
export function initRule(rule: Rule): InitdRule {
16+
export function initRule(rule: Rule, forceUseWebRequest = false): InitdRule {
1717
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
1818
const initd: InitdRule = { ...rule } as InitdRule;
1919
initd._runner = detectRunner(rule);
20-
if (initd._runner === 'web_request') {
20+
if (initd._runner === 'web_request' || forceUseWebRequest) {
2121
if (initd.isFunction && ENABLE_EVAL) {
2222
// eslint-disable-next-line no-new-func
2323
initd._func = new Function('val', 'detail', initd.code) as any;

0 commit comments

Comments
 (0)