diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index 18c2e66fa..67ecdd232 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -51,7 +51,7 @@ function getScriptingDetails() { /******************************************************************************/ -const toRegisterable = (fname, hostnames) => { +const toRegisterable = (fname, hostnames, trustedSites) => { const directive = { id: fname, allFrames: true, @@ -62,6 +62,12 @@ const toRegisterable = (fname, hostnames) => { } else { directive.matches = [ '' ]; } + if ( + directive.matches.length === 1 && + directive.matches[0] === '' + ) { + directive.excludeMatches = ut.matchesFromHostnames(trustedSites); + } directive.js = [ `/rulesets/js/${fname.slice(0,2)}/${fname.slice(2)}.js` ]; if ( (ut.fidFromFileName(fname) & RUN_AT_END_BIT) !== 0 ) { directive.runAt = 'document_end'; @@ -92,10 +98,19 @@ const arrayEq = (a, b) => { return true; }; -const shouldUpdate = (registered, candidateHostnames) => { - const registeredHostnames = registered.matches && - ut.hostnamesFromMatches(registered.matches); - return arrayEq(registeredHostnames, candidateHostnames) === false; +const shouldUpdate = (registered, afterHostnames, afterExcludeHostnames) => { + if ( afterHostnames.length === 1 && afterHostnames[0] === '*' ) { + const beforeExcludeHostnames = registered.excludeMatches && + ut.hostnamesFromMatches(registered.excludeMatches) || + []; + if ( arrayEq(beforeExcludeHostnames, afterExcludeHostnames) === false ) { + return true; + } + } + const beforeHostnames = registered.matches && + ut.hostnamesFromMatches(registered.matches) || + []; + return arrayEq(beforeHostnames, afterHostnames) === false; }; const isTrustedHostname = (trustedSites, hn) => { @@ -152,6 +167,7 @@ function registerSomeInjectables(args) { } = args; const toRegisterMap = new Map(); + const trustedSitesSet = new Set(trustedSites); const checkMatches = (hostnamesToFidsMap, hn) => { let fids = hostnamesToFidsMap.get(hn); @@ -177,7 +193,7 @@ function registerSomeInjectables(args) { const hostnamesToFidsMap = scriptingDetails.get(rulesetId); if ( hostnamesToFidsMap === undefined ) { continue; } for ( let hn of hostnamesSet ) { - if ( isTrustedHostname(trustedSites, hn) ) { continue; } + if ( isTrustedHostname(trustedSitesSet, hn) ) { continue; } while ( hn ) { checkMatches(hostnamesToFidsMap, hn); hn = ut.toBroaderHostname(hn); @@ -196,12 +212,13 @@ function registerAllInjectables(args) { } = args; const toRegisterMap = new Map(); + const trustedSitesSet = new Set(trustedSites); for ( const rulesetId of rulesetIds ) { const hostnamesToFidsMap = scriptingDetails.get(rulesetId); if ( hostnamesToFidsMap === undefined ) { continue; } for ( let [ hn, fids ] of hostnamesToFidsMap ) { - if ( isTrustedHostname(trustedSites, hn) ) { continue; } + if ( isTrustedHostname(trustedSitesSet, hn) ) { continue; } if ( typeof fids === 'number' ) { fids = [ fids ]; } for ( const fid of fids ) { const fname = ut.fnameFromFileId(fid); @@ -244,7 +261,6 @@ async function registerInjectables(origins) { browser.scripting.getRegisteredContentScripts(), ]).then(results => { results[0] = new Set(ut.hostnamesFromMatches(results[0].origins)); - results[1] = new Set(results[1]); return results; }); @@ -267,11 +283,11 @@ async function registerInjectables(origins) { const toUpdate = []; for ( const [ fname, hostnames ] of toRegisterMap ) { if ( before.has(fname) === false ) { - toAdd.push(toRegisterable(fname, hostnames)); + toAdd.push(toRegisterable(fname, hostnames, trustedSites)); continue; } - if ( shouldUpdate(before.get(fname), hostnames) ) { - toUpdate.push(toRegisterable(fname, hostnames)); + if ( shouldUpdate(before.get(fname), hostnames, trustedSites) ) { + toUpdate.push(toRegisterable(fname, hostnames, trustedSites)); } } diff --git a/platform/mv3/make-rulesets.js b/platform/mv3/make-rulesets.js index 568eb1c94..35801ef0b 100644 --- a/platform/mv3/make-rulesets.js +++ b/platform/mv3/make-rulesets.js @@ -390,8 +390,7 @@ const pathFromFileName = fname => `${scriptletDir}/${fname.slice(0,2)}/${fname.s /******************************************************************************/ -const COSMETIC_FILES_PER_RULESET = 12; -const PROCEDURAL_FILES_PER_RULESET = 4; +const MAX_COSMETIC_FILTERS_PER_FILE = 128; // This merges selectors which are used by the same hostnames @@ -494,8 +493,6 @@ async function processCosmeticFilters(assetDetails, mapin) { const contentArray = groupCosmeticBySelectors( groupCosmeticByHostnames(mapin) ); - const contentPerFile = - Math.ceil(contentArray.length / COSMETIC_FILES_PER_RULESET); // We do not want more than n CSS files per subscription, so we will // group multiple unrelated selectors in the same file, and distinct @@ -508,8 +505,8 @@ async function processCosmeticFilters(assetDetails, mapin) { const originalScriptletMap = await loadAllSourceScriptlets(); const generatedFiles = []; - for ( let i = 0; i < contentArray.length; i += contentPerFile ) { - const slice = contentArray.slice(i, i + contentPerFile); + for ( let i = 0; i < contentArray.length; i += MAX_COSMETIC_FILTERS_PER_FILE ) { + const slice = contentArray.slice(i, i + MAX_COSMETIC_FILTERS_PER_FILE); const argsMap = slice.map(entry => [ entry[0], { @@ -562,8 +559,6 @@ async function processProceduralCosmeticFilters(assetDetails, mapin) { const contentArray = groupCosmeticBySelectors( groupCosmeticByHostnames(mapin) ); - const contentPerFile = - Math.ceil(contentArray.length / PROCEDURAL_FILES_PER_RULESET); // We do not want more than n CSS files per subscription, so we will // group multiple unrelated selectors in the same file, and distinct @@ -576,8 +571,8 @@ async function processProceduralCosmeticFilters(assetDetails, mapin) { const originalScriptletMap = await loadAllSourceScriptlets(); const generatedFiles = []; - for ( let i = 0; i < contentArray.length; i += contentPerFile ) { - const slice = contentArray.slice(i, i + contentPerFile); + for ( let i = 0; i < contentArray.length; i += MAX_COSMETIC_FILTERS_PER_FILE ) { + const slice = contentArray.slice(i, i + MAX_COSMETIC_FILTERS_PER_FILE); const argsMap = slice.map(entry => [ entry[0], { diff --git a/platform/mv3/scriptlets/abort-current-script.js b/platform/mv3/scriptlets/abort-current-script.js index 3c14594e3..b1b4e3691 100644 --- a/platform/mv3/scriptlets/abort-current-script.js +++ b/platform/mv3/scriptlets/abort-current-script.js @@ -37,7 +37,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_abortCurrentScript() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/abort-on-property-read.js b/platform/mv3/scriptlets/abort-on-property-read.js index f9197515e..cdccd9f4d 100644 --- a/platform/mv3/scriptlets/abort-on-property-read.js +++ b/platform/mv3/scriptlets/abort-on-property-read.js @@ -35,7 +35,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_abortOnPropertyRead() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/abort-on-property-write.js b/platform/mv3/scriptlets/abort-on-property-write.js index 8cbe8deb3..2a9687cc4 100644 --- a/platform/mv3/scriptlets/abort-on-property-write.js +++ b/platform/mv3/scriptlets/abort-on-property-write.js @@ -35,7 +35,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_abortOnPropertyWrite() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/css-specific-procedural.js b/platform/mv3/scriptlets/css-specific-procedural.js index 7563e4c21..7c7f22562 100644 --- a/platform/mv3/scriptlets/css-specific-procedural.js +++ b/platform/mv3/scriptlets/css-specific-procedural.js @@ -31,7 +31,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_cssSpecificProcedural() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/css-specific.js b/platform/mv3/scriptlets/css-specific.js index 2c6d16411..14ded57e0 100644 --- a/platform/mv3/scriptlets/css-specific.js +++ b/platform/mv3/scriptlets/css-specific.js @@ -31,7 +31,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_cssSpecific() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/json-prune.js b/platform/mv3/scriptlets/json-prune.js index 14d3fd347..dcd7dff23 100644 --- a/platform/mv3/scriptlets/json-prune.js +++ b/platform/mv3/scriptlets/json-prune.js @@ -34,7 +34,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_jsonPrune() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/no-settimeout-if.js b/platform/mv3/scriptlets/no-settimeout-if.js index 8067f7e46..39507025e 100644 --- a/platform/mv3/scriptlets/no-settimeout-if.js +++ b/platform/mv3/scriptlets/no-settimeout-if.js @@ -35,7 +35,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_noSetimeoutIf() { /******************************************************************************/ diff --git a/platform/mv3/scriptlets/set-constant.js b/platform/mv3/scriptlets/set-constant.js index 57a51bde2..4510c3694 100644 --- a/platform/mv3/scriptlets/set-constant.js +++ b/platform/mv3/scriptlets/set-constant.js @@ -35,7 +35,7 @@ // Important! // Isolate from global scope -(function() { +(function uBOL_setConstant() { /******************************************************************************/