From 9f3282d74f8a7edc0f326140b115bb49c776ef24 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Tue, 10 Jun 2025 15:18:47 -0400 Subject: [PATCH] [mv3] Safari: expand rsach `requestDomains` entries into own rule Related issue: https://github.com/uBlockOrigin/uBOL-home/issues/358 --- platform/mv3/make-rulesets.js | 50 ++++++----------------- platform/mv3/safari/patch-ruleset.js | 60 ++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 38 deletions(-) create mode 100644 platform/mv3/safari/patch-ruleset.js diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 3a5ed2824..89e240448 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -324,38 +324,12 @@ const isURLSkip = rule => /******************************************************************************/ -function patchRuleset(ruleset) { - if ( platform !== 'safari' ) { return ruleset; } - const out = []; - for ( const rule of ruleset ) { - const condition = rule.condition; - if ( rule.action.type === 'modifyHeaders' ) { - log(`Safari's incomplete API: ${JSON.stringify(rule)}`, true); - continue; - } - if ( Array.isArray(rule.condition.responseHeaders) ) { - log(`Safari's incomplete API: ${JSON.stringify(rule)}`, true); - continue; - } - if ( Array.isArray(condition.requestMethods) ) { - log(`Safari's incomplete API: ${JSON.stringify(rule)}`, true); - continue; - } - if ( Array.isArray(condition.excludedRequestMethods) ) { - log(`Safari's incomplete API: ${JSON.stringify(rule)}`, true); - continue; - } - if ( Array.isArray(condition.initiatorDomains) ) { - condition.domains = condition.initiatorDomains; - delete condition.initiatorDomains; - } - if ( Array.isArray(condition.excludedInitiatorDomains) ) { - condition.excludedDomains = condition.excludedInitiatorDomains; - delete condition.excludedInitiatorDomains; - } - out.push(rule); - } - return out; +async function patchRuleset(ruleset) { + return import(`./${platform}/patch-ruleset.js`).then(module => { + return module.patchRuleset(ruleset) + }).catch(( ) => { + return ruleset; + }); } /******************************************************************************/ @@ -550,7 +524,7 @@ async function processNetworkFilters(assetDetails, network) { } } - const plainGood = patchRuleset( + const plainGood = await patchRuleset( rules.filter(rule => isSafe(rule) && isRegex(rule) === false) ); log(`\tPlain good: ${plainGood.length}`); @@ -560,12 +534,12 @@ async function processNetworkFilters(assetDetails, network) { .join('\n'), true ); - const regexes = patchRuleset( + const regexes = await patchRuleset( rules.filter(rule => isSafe(rule) && isRegex(rule)) ); log(`\tMaybe good (regexes): ${regexes.length}`); - const redirects = patchRuleset( + const redirects = await patchRuleset( rules.filter(rule => isUnsupported(rule) === false && isRedirect(rule) @@ -579,19 +553,19 @@ async function processNetworkFilters(assetDetails, network) { }); log(`\tredirect=: ${redirects.length}`); - const removeparamsGood = patchRuleset( + const removeparamsGood = await patchRuleset( rules.filter(rule => isUnsupported(rule) === false && isRemoveparam(rule) ) ); - const removeparamsBad = patchRuleset( + const removeparamsBad = await patchRuleset( rules.filter(rule => isUnsupported(rule) && isRemoveparam(rule) ) ); log(`\tremoveparams= (accepted/discarded): ${removeparamsGood.length}/${removeparamsBad.length}`); - const modifyHeaders = patchRuleset( + const modifyHeaders = await patchRuleset( rules.filter(rule => isUnsupported(rule) === false && isModifyHeaders(rule) diff --git a/platform/mv3/safari/patch-ruleset.js b/platform/mv3/safari/patch-ruleset.js new file mode 100644 index 000000000..44bbce061 --- /dev/null +++ b/platform/mv3/safari/patch-ruleset.js @@ -0,0 +1,60 @@ +/******************************************************************************* + + uBlock Origin - a comprehensive, efficient content blocker + Copyright (C) 2025-present Raymond Hill + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see {http://www.gnu.org/licenses/}. + + Home: https://github.com/gorhill/uBlock +*/ + +function patchRuleWithRequestDomains(rule, out) { + const requestDomains = rule.condition.requestDomains; + delete rule.condition.requestDomains; + for ( const domain of requestDomains ) { + const newRule = structuredClone(rule); + newRule.condition.urlFilter = `||${domain}^`; + out.push(newRule); + } +} + +export function patchRuleset(ruleset) { + const out = []; + for ( const rule of ruleset ) { + const condition = rule.condition; + if ( rule.action.type === 'modifyHeaders' ) { continue; } + if ( Array.isArray(rule.condition.responseHeaders) ) { continue; } + if ( Array.isArray(condition.requestMethods) ) { continue; } + if ( Array.isArray(condition.excludedRequestMethods) ) { continue; } + if ( Array.isArray(condition.initiatorDomains) ) { + condition.domains = condition.initiatorDomains; + delete condition.initiatorDomains; + } + if ( Array.isArray(condition.excludedInitiatorDomains) ) { + condition.excludedDomains = condition.excludedInitiatorDomains; + delete condition.excludedInitiatorDomains; + } + if ( + Array.isArray(condition.requestDomains) && + Array.isArray(condition.excludedRequestDomains) === false && + Boolean(condition.regexFilter) === false && + Boolean(condition.urlFilter) === false + ) { + patchRuleWithRequestDomains(rule, out); + } else { + out.push(rule); + } + } + return out; +}