From 6e8aeae283cd74ffa31708c8d8119b5689990f28 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Mon, 3 Apr 2023 10:19:06 -0400 Subject: [PATCH] Flush memory cache at key filtering profile changes To reduce the need for hard reload after changes in filters, rules. --- platform/common/vapi-background.js | 3 ++ src/js/start.js | 4 +++ src/js/storage.js | 7 ++-- src/js/ublock.js | 57 +++++++++++++++++++++--------- 4 files changed, 50 insertions(+), 21 deletions(-) diff --git a/platform/common/vapi-background.js b/platform/common/vapi-background.js index 00912e8db..376ebecd6 100644 --- a/platform/common/vapi-background.js +++ b/platform/common/vapi-background.js @@ -1298,6 +1298,9 @@ vAPI.Net = class { this.listenerMap.set(clientListener, actualListener); return actualListener; } + handlerBehaviorChanged() { + browser.webRequest.handlerBehaviorChanged(); + } onUnprocessedRequest(details) { const { tabId } = details; if ( tabId === -1 ) { return; } diff --git a/src/js/start.js b/src/js/start.js index abf54e96e..eb109432c 100644 --- a/src/js/start.js +++ b/src/js/start.js @@ -459,6 +459,10 @@ if ( selfieIsValid !== true ) { } } +// Flush memory cache -- unsure whether the browser does this internally +// when loading a new extension. +vAPI.net.handlerBehaviorChanged(); + // Final initialization steps after all needed assets are in memory. // https://github.com/uBlockOrigin/uBlock-issues/issues/974 diff --git a/src/js/storage.js b/src/js/storage.js index b15d8ff20..2b1924b3a 100644 --- a/src/js/storage.js +++ b/src/js/storage.js @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* globals browser, WebAssembly */ +/* globals WebAssembly */ 'use strict'; @@ -581,9 +581,7 @@ self.addEventListener('hiddenSettingsChanged', ( ) => { // https://www.reddit.com/r/uBlockOrigin/comments/cj7g7m/ // https://www.reddit.com/r/uBlockOrigin/comments/cnq0bi/ - if ( options.killCache ) { - browser.webRequest.handlerBehaviorChanged(); - } + vAPI.net.handlerBehaviorChanged(); vAPI.messaging.broadcast({ what: 'userFiltersUpdated' }); }; @@ -818,6 +816,7 @@ self.addEventListener('hiddenSettingsChanged', ( ) => { staticExtFilteringEngine.freeze(); redirectEngine.freeze(); vAPI.net.unsuspend(); + vAPI.net.handlerBehaviorChanged(); vAPI.storage.set({ 'availableFilterLists': µb.availableFilterLists }); diff --git a/src/js/ublock.js b/src/js/ublock.js index 390c8783d..0031865fa 100644 --- a/src/js/ublock.js +++ b/src/js/ublock.js @@ -187,6 +187,10 @@ const matchBucket = function(url, hostname, bucket, start) { } } this.saveWhitelist(); + + // Flush memory cache + vAPI.net.handlerBehaviorChanged(); + return true; }; @@ -521,6 +525,11 @@ const matchBucket = function(url, hostname, bucket, start) { // https://github.com/chrisaljoudi/uBlock/issues/420 cosmeticFilteringEngine.removeFromSelectorCache(srcHostname, 'net'); + // Flush memory cache + if ( action === 1 ) { + vAPI.net.handlerBehaviorChanged(); + } + if ( details.tabId === undefined ) { return; } if ( requestType.startsWith('3p') ) { @@ -577,25 +586,39 @@ const matchBucket = function(url, hostname, bucket, start) { ); if ( changed === false ) { return; } - // Take action if needed + // Take per-switch action if needed switch ( details.name ) { - case 'no-scripting': - this.updateToolbarIcon(details.tabId, 0b100); - break; - case 'no-cosmetic-filtering': { - const scriptlet = newState ? 'cosmetic-off' : 'cosmetic-on'; - vAPI.tabs.executeScript(details.tabId, { - file: `/js/scriptlets/${scriptlet}.js`, - allFrames: true, - }); - break; - } - case 'no-large-media': - const pageStore = this.pageStoreFromTabId(details.tabId); - if ( pageStore !== null ) { - pageStore.temporarilyAllowLargeMediaElements(!newState); + case 'no-scripting': + this.updateToolbarIcon(details.tabId, 0b100); + break; + case 'no-cosmetic-filtering': { + const scriptlet = newState ? 'cosmetic-off' : 'cosmetic-on'; + vAPI.tabs.executeScript(details.tabId, { + file: `/js/scriptlets/${scriptlet}.js`, + allFrames: true, + }); + break; + } + case 'no-large-media': + const pageStore = this.pageStoreFromTabId(details.tabId); + if ( pageStore !== null ) { + pageStore.temporarilyAllowLargeMediaElements(!newState); + } + break; + default: + break; + } + + // Flush memory cache if needed + if ( newState ) { + switch ( details.name ) { + case 'no-scripting': + case 'no-remote-fonts': + vAPI.net.handlerBehaviorChanged(); + break; + default: + break; } - break; } if ( details.persist !== true ) { return; }