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; +}