From e5b438257fef7c943fb2a814f706b6810bd9090f Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sat, 21 Oct 2023 14:25:26 -0400 Subject: [PATCH] Ensure scriptlet cache is reset when filtering profile changes Related issue: https://github.com/uBlockOrigin/uBlock-issues/issues/2896 TODO: Eventually, distinguish between filtering profile increasing or decreasing so as to avoid flushing caches when increasing filtering, which should not affect the scriptlets cache. --- src/js/scriptlet-filtering.js | 4 ++++ src/js/start.js | 2 +- src/js/storage.js | 9 +++++---- src/js/ublock.js | 14 ++++---------- src/js/utils.js | 26 +++++++++++++++++++++----- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/js/scriptlet-filtering.js b/src/js/scriptlet-filtering.js index 1eb551540..595ed911b 100644 --- a/src/js/scriptlet-filtering.js +++ b/src/js/scriptlet-filtering.js @@ -66,6 +66,10 @@ const scriptletFilteringEngine = { const contentScriptRegisterer = new (class { constructor() { this.hostnameToDetails = new Map(); + if ( browser.contentScripts === undefined ) { return; } + µb.onEvent('filteringBehaviorChanged', ( ) => { + this.reset(); + }); } register(hostname, code) { if ( browser.contentScripts === undefined ) { return false; } diff --git a/src/js/start.js b/src/js/start.js index d18f41d6f..6dbaeefc1 100644 --- a/src/js/start.js +++ b/src/js/start.js @@ -453,7 +453,7 @@ if ( selfieIsValid !== true ) { // Flush memory cache -- unsure whether the browser does this internally // when loading a new extension. -vAPI.net.handlerBehaviorChanged(); +µb.filteringBehaviorChanged(); // Final initialization steps after all needed assets are in memory. diff --git a/src/js/storage.js b/src/js/storage.js index 575814b57..77c5ec39c 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -243,7 +243,7 @@ import { if ( typeof hs[key] !== typeof hsDefault[key] ) { continue; } this.hiddenSettings[key] = hs[key]; } - this.fireDOMEvent('hiddenSettingsChanged'); + this.fireEvent('hiddenSettingsChanged'); }; // Note: Save only the settings which values differ from the default ones. @@ -259,7 +259,7 @@ import { }); }; -self.addEventListener('hiddenSettingsChanged', ( ) => { +µb.onEvent('hiddenSettingsChanged', ( ) => { const µbhs = µb.hiddenSettings; ubologSet(µbhs.consoleLogLevel === 'info'); vAPI.net.setOptions({ @@ -364,6 +364,7 @@ self.addEventListener('hiddenSettingsChanged', ( ) => { netWhitelist: this.arrayFromWhitelist(this.netWhitelist) }); this.netWhitelistModifyTime = Date.now(); + µb.filteringBehaviorChanged(); }; /******************************************************************************/ @@ -593,7 +594,7 @@ self.addEventListener('hiddenSettingsChanged', ( ) => { // https://www.reddit.com/r/uBlockOrigin/comments/cj7g7m/ // https://www.reddit.com/r/uBlockOrigin/comments/cnq0bi/ - vAPI.net.handlerBehaviorChanged(); + µb.filteringBehaviorChanged(); vAPI.messaging.broadcast({ what: 'userFiltersUpdated' }); }; @@ -830,7 +831,7 @@ self.addEventListener('hiddenSettingsChanged', ( ) => { staticExtFilteringEngine.freeze(); redirectEngine.freeze(); vAPI.net.unsuspend(); - vAPI.net.handlerBehaviorChanged(); + µb.filteringBehaviorChanged(); vAPI.storage.set({ 'availableFilterLists': µb.availableFilterLists }); diff --git a/src/js/ublock.js b/src/js/ublock.js index 0031865fa..a02ee6f1b 100644 --- a/src/js/ublock.js +++ b/src/js/ublock.js @@ -187,10 +187,6 @@ const matchBucket = function(url, hostname, bucket, start) { } } this.saveWhitelist(); - - // Flush memory cache - vAPI.net.handlerBehaviorChanged(); - return true; }; @@ -425,7 +421,7 @@ const matchBucket = function(url, hostname, bucket, start) { redirectEngine.invalidateResourcesSelfie(io); this.loadRedirectResources(); } - this.fireDOMEvent('hiddenSettingsChanged'); + this.fireEvent('hiddenSettingsChanged'); }; /******************************************************************************/ @@ -526,9 +522,7 @@ const matchBucket = function(url, hostname, bucket, start) { cosmeticFilteringEngine.removeFromSelectorCache(srcHostname, 'net'); // Flush memory cache - if ( action === 1 ) { - vAPI.net.handlerBehaviorChanged(); - } + µb.filteringBehaviorChanged(); if ( details.tabId === undefined ) { return; } @@ -614,7 +608,7 @@ const matchBucket = function(url, hostname, bucket, start) { switch ( details.name ) { case 'no-scripting': case 'no-remote-fonts': - vAPI.net.handlerBehaviorChanged(); + µb.filteringBehaviorChanged(); break; default: break; @@ -675,7 +669,7 @@ const matchBucket = function(url, hostname, bucket, start) { parse(); - self.addEventListener('hiddenSettingsChanged', ( ) => { parse(); }); + µb.onEvent('hiddenSettingsChanged', ( ) => { parse(); }); } /******************************************************************************/ diff --git a/src/js/utils.js b/src/js/utils.js index be3b1a585..09e54eb15 100644 --- a/src/js/utils.js +++ b/src/js/utils.js @@ -134,16 +134,32 @@ import µb from './background.js'; /******************************************************************************/ -µb.fireDOMEvent = function(name) { +µb.fireEvent = function(name) { if ( - window instanceof Object && - window.dispatchEvent instanceof Function && - window.CustomEvent instanceof Function + self instanceof Object && + self.dispatchEvent instanceof Function && + self.CustomEvent instanceof Function ) { - window.dispatchEvent(new CustomEvent(name)); + self.dispatchEvent(new CustomEvent(name)); } }; +µb.onEvent = function(name, fn) { + if ( + self instanceof Object && + self.addEventListener instanceof Function + ) { + self.addEventListener(name, fn); + } +}; + +/******************************************************************************/ + +µb.filteringBehaviorChanged = function() { + vAPI.net.handlerBehaviorChanged(); + this.fireEvent('filteringBehaviorChanged'); +}; + /******************************************************************************/ // TODO: properly compare arrays