[mv3] Normalize rulesets read from package

This ensures rulesets are properly rendered in DNR ruleset viewer
in Safari.
This commit is contained in:
Raymond Hill 2025-07-12 11:16:29 -04:00
parent 1a8238e03e
commit 6bfa7245f3
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
4 changed files with 45 additions and 13 deletions

View file

@ -19,7 +19,7 @@
Home: https://github.com/gorhill/uBlock
*/
import { INITIATOR_DOMAINS, dnr } from './ext-compat.js';
import { dnr, normalizeDNRRules } from './ext-compat.js';
import { browser } from './ext.js';
/******************************************************************************/
@ -62,7 +62,11 @@ const getRuleset = async rulesetId => {
} else {
const response = await fetch(`/rulesets/main/${rulesetId}.json`).catch(( ) => undefined);
if ( response === undefined ) { return; }
rules = await response.json().catch(( ) => undefined);
rules = await response.json().catch(( ) =>
undefined
).then(rules =>
normalizeDNRRules(rules)
);
}
if ( Array.isArray(rules) === false ) { return; }
const ruleset = new Map();
@ -72,8 +76,8 @@ const getRuleset = async rulesetId => {
if ( condition.requestDomains ) {
condition.requestDomains = pruneLongLists(condition.requestDomains);
}
if ( condition[INITIATOR_DOMAINS] ) {
condition[INITIATOR_DOMAINS] = pruneLongLists(condition[INITIATOR_DOMAINS]);
if ( condition.initiatorDomains ) {
condition.initiatorDomains = pruneLongLists(condition.initiatorDomains);
}
}
const ruleId = rule.id;

View file

@ -21,8 +21,6 @@
export const webext = self.browser || self.chrome;
export const dnr = webext.declarativeNetRequest || {};
export const INITIATOR_DOMAINS = 'initiatorDomains';
export const EXCLUDED_INITIATOR_DOMAINS = 'excludedInitiatorDomains';
/******************************************************************************/
@ -36,6 +34,15 @@ const isSameRules = (a, b) => {
/******************************************************************************/
export function normalizeDNRRules(rules, ruleIds) {
if ( Array.isArray(rules) === false ) { return rules; }
return Array.isArray(ruleIds)
? rules.filter(rule => ruleIds.includes(rule.id))
: rules;
}
/******************************************************************************/
dnr.setAllowAllRules = async function(id, allowed, notAllowed, reverse, priority) {
const [
beforeDynamicRules,

View file

@ -21,6 +21,7 @@
import { DNREditor } from './dnr-editor.js';
import { i18n$ } from './i18n.js';
import { normalizeDNRRules } from './ext-compat.js';
import { sendMessage } from './ext.js';
import { textFromRules } from './dnr-parser.js';
@ -59,7 +60,11 @@ export class ReadOnlyDNREditor extends DNREditor {
for ( const [ realm, dir ] of Object.entries(realms) ) {
if ( Boolean(rulesetDetails.rules?.[realm]) === false ) { continue; }
promises.push(
fetch(`./rulesets/${dir}/${this.id}.json`).then(response => response.json())
fetch(`./rulesets/${dir}/${this.id}.json`).then(response =>
response.json()
).then(rules =>
normalizeDNRRules(rules)
)
);
}
const parts = await Promise.all(promises);

View file

@ -21,8 +21,6 @@
export const webext = self.browser;
export const INITIATOR_DOMAINS = 'domains';
export const EXCLUDED_INITIATOR_DOMAINS = 'excludedDomains';
/******************************************************************************/
@ -86,6 +84,26 @@ const isSameRules = (a, b) => {
/******************************************************************************/
export function normalizeDNRRules(rules, ruleIds) {
if ( Array.isArray(rules) === false ) { return rules; }
const selectedRules = Array.isArray(ruleIds)
? rules.filter(rule => ruleIds.includes(rule.id))
: rules;
selectedRules.forEach(rule => {
if ( Array.isArray(rule.domains) ) {
rules.initiatorDomains = rule.domains;
delete rule.domains;
}
if ( Array.isArray(rule.excludedDomains) ) {
rules.excludedInitiatorDomains = rule.excludedDomains;
delete rule.excludedDomains;
}
});
return selectedRules;
}
/******************************************************************************/
export const dnr = {
DYNAMIC_RULESET_ID: '_dynamic',
MAX_NUMBER_OF_ENABLED_STATIC_RULESETS: nativeDNR.MAX_NUMBER_OF_ENABLED_STATIC_RULESETS,
@ -97,8 +115,7 @@ export const dnr = {
return new Promise(resolve => {
nativeDNR.getDynamicRules(rules => {
if ( Array.isArray(rules) === false ) { return resolve([]); }
if ( Array.isArray(ruleIds) === false ) { return resolve(rules); }
return resolve(rules.filter(rule => ruleIds.includes(rule.id)));
return resolve(normalizeDNRRules(rules, ruleIds));
});
});
},
@ -112,8 +129,7 @@ export const dnr = {
return new Promise(resolve => {
nativeDNR.getSessionRules(rules => {
if ( Array.isArray(rules) === false ) { return resolve([]); }
if ( Array.isArray(ruleIds) === false ) { return resolve(rules); }
return resolve(rules.filter(rule => ruleIds.includes(rule.id)));
return resolve(normalizeDNRRules(rules, ruleIds));
});
});
},