Skip to content

Commit 6bfa724

Browse files
committed
[mv3] Normalize rulesets read from package
This ensures rulesets are properly rendered in DNR ruleset viewer in Safari.
1 parent 1a8238e commit 6bfa724

File tree

4 files changed

+45
-13
lines changed

4 files changed

+45
-13
lines changed

platform/mv3/extension/js/debug.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
Home: https://github.com/gorhill/uBlock
2020
*/
2121

22-
import { INITIATOR_DOMAINS, dnr } from './ext-compat.js';
22+
import { dnr, normalizeDNRRules } from './ext-compat.js';
2323
import { browser } from './ext.js';
2424

2525
/******************************************************************************/
@@ -62,7 +62,11 @@ const getRuleset = async rulesetId => {
6262
} else {
6363
const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined);
6464
if ( response === undefined ) { return; }
65-
rules = await response.json().catch(( ) => undefined);
65+
rules = await response.json().catch(( ) =>
66+
undefined
67+
).then(rules =>
68+
normalizeDNRRules(rules)
69+
);
6670
}
6771
if ( Array.isArray(rules) === false ) { return; }
6872
const ruleset = new Map();
@@ -72,8 +76,8 @@ const getRuleset = async rulesetId => {
7276
if ( condition.requestDomains ) {
7377
condition.requestDomains = pruneLongLists(condition.requestDomains);
7478
}
75-
if ( condition[INITIATOR_DOMAINS] ) {
76-
condition[INITIATOR_DOMAINS] = pruneLongLists(condition[INITIATOR_DOMAINS]);
79+
if ( condition.initiatorDomains ) {
80+
condition.initiatorDomains = pruneLongLists(condition.initiatorDomains);
7781
}
7882
}
7983
const ruleId = rule.id;

platform/mv3/extension/js/ext-compat.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222
export const webext = self.browser || self.chrome;
2323
export const dnr = webext.declarativeNetRequest || {};
24-
export const INITIATOR_DOMAINS = 'initiatorDomains';
25-
export const EXCLUDED_INITIATOR_DOMAINS = 'excludedInitiatorDomains';
2624

2725
/******************************************************************************/
2826

@@ -36,6 +34,15 @@ const isSameRules = (a, b) => {
3634

3735
/******************************************************************************/
3836

37+
export function normalizeDNRRules(rules, ruleIds) {
38+
if ( Array.isArray(rules) === false ) { return rules; }
39+
return Array.isArray(ruleIds)
40+
? rules.filter(rule => ruleIds.includes(rule.id))
41+
: rules;
42+
}
43+
44+
/******************************************************************************/
45+
3946
dnr.setAllowAllRules = async function(id, allowed, notAllowed, reverse, priority) {
4047
const [
4148
beforeDynamicRules,

platform/mv3/extension/js/ro-dnr-editor.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import { DNREditor } from './dnr-editor.js';
2323
import { i18n$ } from './i18n.js';
24+
import { normalizeDNRRules } from './ext-compat.js';
2425
import { sendMessage } from './ext.js';
2526
import { textFromRules } from './dnr-parser.js';
2627

@@ -59,7 +60,11 @@ export class ReadOnlyDNREditor extends DNREditor {
5960
for ( const [ realm, dir ] of Object.entries(realms) ) {
6061
if ( Boolean(rulesetDetails.rules?.[realm]) === false ) { continue; }
6162
promises.push(
62-
fetch(`./rulesets/${dir}/${this.id}.json`).then(response => response.json())
63+
fetch(`./rulesets/${dir}/${this.id}.json`).then(response =>
64+
response.json()
65+
).then(rules =>
66+
normalizeDNRRules(rules)
67+
)
6368
);
6469
}
6570
const parts = await Promise.all(promises);

platform/mv3/safari/ext-compat.js

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@
2121

2222

2323
export const webext = self.browser;
24-
export const INITIATOR_DOMAINS = 'domains';
25-
export const EXCLUDED_INITIATOR_DOMAINS = 'excludedDomains';
2624

2725
/******************************************************************************/
2826

@@ -86,6 +84,26 @@ const isSameRules = (a, b) => {
8684

8785
/******************************************************************************/
8886

87+
export function normalizeDNRRules(rules, ruleIds) {
88+
if ( Array.isArray(rules) === false ) { return rules; }
89+
const selectedRules = Array.isArray(ruleIds)
90+
? rules.filter(rule => ruleIds.includes(rule.id))
91+
: rules;
92+
selectedRules.forEach(rule => {
93+
if ( Array.isArray(rule.domains) ) {
94+
rules.initiatorDomains = rule.domains;
95+
delete rule.domains;
96+
}
97+
if ( Array.isArray(rule.excludedDomains) ) {
98+
rules.excludedInitiatorDomains = rule.excludedDomains;
99+
delete rule.excludedDomains;
100+
}
101+
});
102+
return selectedRules;
103+
}
104+
105+
/******************************************************************************/
106+
89107
export const dnr = {
90108
DYNAMIC_RULESET_ID: '_dynamic',
91109
MAX_NUMBER_OF_ENABLED_STATIC_RULESETS: nativeDNR.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,
@@ -97,8 +115,7 @@ export const dnr = {
97115
return new Promise(resolve => {
98116
nativeDNR.getDynamicRules(rules => {
99117
if ( Array.isArray(rules) === false ) { return resolve([]); }
100-
if ( Array.isArray(ruleIds) === false ) { return resolve(rules); }
101-
return resolve(rules.filter(rule => ruleIds.includes(rule.id)));
118+
return resolve(normalizeDNRRules(rules, ruleIds));
102119
});
103120
});
104121
},
@@ -112,8 +129,7 @@ export const dnr = {
112129
return new Promise(resolve => {
113130
nativeDNR.getSessionRules(rules => {
114131
if ( Array.isArray(rules) === false ) { return resolve([]); }
115-
if ( Array.isArray(ruleIds) === false ) { return resolve(rules); }
116-
return resolve(rules.filter(rule => ruleIds.includes(rule.id)));
132+
return resolve(normalizeDNRRules(rules, ruleIds));
117133
});
118134
});
119135
},

0 commit comments

Comments
 (0)