+
-
diff --git a/src/js/3p-filters.js b/src/js/3p-filters.js
index 3f1dc1081..924159c07 100644
--- a/src/js/3p-filters.js
+++ b/src/js/3p-filters.js
@@ -286,7 +286,8 @@ const renderFilterLists = function(soft) {
// Re-insert import widget.
uDom('[data-groupkey="custom"] .listEntries').append(importWidget);
- uDom.nodeFromId('autoUpdate').checked = listDetails.autoUpdate === true;
+ uDom.nodeFromId('autoUpdate').checked =
+ listDetails.autoUpdate === true;
uDom.nodeFromId('listsOfBlockedHostsPrompt').textContent =
vAPI.i18n('3pListsOfBlockedHostsPrompt')
.replace(
@@ -301,6 +302,8 @@ const renderFilterLists = function(soft) {
listDetails.parseCosmeticFilters === true;
uDom.nodeFromId('ignoreGenericCosmeticFilters').checked =
listDetails.ignoreGenericCosmeticFilters === true;
+ uDom.nodeFromId('suspendUntilListsAreLoaded').checked =
+ listDetails.suspendUntilListsAreLoaded === true;
// Compute a hash of the settings so that we can keep track of changes
// affecting the loading of filter lists.
@@ -529,11 +532,12 @@ const buttonPurgeAllHandler = async function(hard) {
/******************************************************************************/
-const autoUpdateCheckboxChanged = function() {
+const userSettingCheckboxChanged = function() {
+ const target = event.target;
messaging.send('dashboard', {
what: 'userSettings',
- name: 'autoUpdate',
- value: this.checked,
+ name: target.id,
+ value: target.checked,
});
};
@@ -683,9 +687,10 @@ self.hasUnsavedData = function() {
/******************************************************************************/
-uDom('#autoUpdate').on('change', autoUpdateCheckboxChanged);
+uDom('#autoUpdate').on('change', userSettingCheckboxChanged);
uDom('#parseCosmeticFilters').on('change', onFilteringSettingsChanged);
uDom('#ignoreGenericCosmeticFilters').on('change', onFilteringSettingsChanged);
+uDom('#suspendUntilListsAreLoaded').on('change', userSettingCheckboxChanged);
uDom('#buttonApply').on('click', ( ) => { buttonApplyHandler(); });
uDom('#buttonUpdate').on('click', ( ) => { buttonUpdateHandler(); });
uDom('#buttonPurgeAll').on('click', ev => {
diff --git a/src/js/background.js b/src/js/background.js
index 4e94b942c..5c9d95abe 100644
--- a/src/js/background.js
+++ b/src/js/background.js
@@ -80,7 +80,6 @@ const hiddenSettingsDefault = {
requestJournalProcessPeriod: 1000,
selfieAfter: 2,
strictBlockingBypassDuration: 120,
- suspendTabsUntilReady: 'unset',
uiPopupConfig: 'unset',
uiFlavor: 'unset',
uiStyles: 'unset',
@@ -109,6 +108,7 @@ const userSettingsDefault = {
prefetchingDisabled: true,
requestLogMaxEntries: 1000,
showIconBadge: true,
+ suspendUntilListsAreLoaded: true,
tooltipsDisabled: false,
webrtcIPAddressHidden: false,
};
@@ -214,7 +214,7 @@ const µBlock = { // jshint ignore:line
readyToFilter: false,
supportStats: {
- launchToReadiness: '',
+ allReadyAfter: '',
},
pageStores: new Map(),
diff --git a/src/js/messaging.js b/src/js/messaging.js
index 4aa038a4c..b2f7cc3d5 100644
--- a/src/js/messaging.js
+++ b/src/js/messaging.js
@@ -1091,6 +1091,7 @@ const getLists = async function(callback) {
isUpdating: io.isUpdating(),
netFilterCount: staticNetFilteringEngine.getFilterCount(),
parseCosmeticFilters: µb.userSettings.parseAllABPHideFilters,
+ suspendUntilListsAreLoaded: µb.userSettings.suspendUntilListsAreLoaded,
userFiltersPath: µb.userFiltersPath
};
const [ lists, metadata ] = await Promise.all([
diff --git a/src/js/start.js b/src/js/start.js
index cb3d43e4f..2702973ea 100644
--- a/src/js/start.js
+++ b/src/js/start.js
@@ -192,6 +192,13 @@ const onNetWhitelistReady = function(netWhitelistRaw, adminExtra) {
// User settings are in memory
const onUserSettingsReady = function(fetched) {
+ // Terminate suspended state?
+ if ( fetched.suspendUntilListsAreLoaded === false ) {
+ vAPI.net.unsuspend({ all: true, discard: true });
+ ubolog(`Unsuspend network activity listener`);
+ µb.supportStats.unsuspendAfter = `${Date.now() - vAPI.T0} ms`;
+ }
+
// `externalLists` will be deprecated in some future, it is kept around
// for forward compatibility purpose, and should reflect the content of
// `importedLists`.
@@ -282,13 +289,6 @@ const onHiddenSettingsReady = async function() {
ubolog(`Override default webext flavor with ${tokens}`);
}
- // Maybe override current network listener suspend state
- if ( µb.hiddenSettings.suspendTabsUntilReady === 'no' ) {
- vAPI.net.unsuspend(true);
- } else if ( µb.hiddenSettings.suspendTabsUntilReady === 'yes' ) {
- vAPI.net.suspend(true);
- }
-
// Maybe disable WebAssembly
if ( vAPI.canWASM && µb.hiddenSettings.disableWebAssembly !== true ) {
const wasmModuleFetcher = function(path) {
@@ -506,11 +506,11 @@ browser.runtime.onUpdateAvailable.addListener(details => {
}
});
-µb.supportStats.launchToReadiness = `${Date.now() - vAPI.T0} ms`;
+µb.supportStats.allReadyAfter = `${Date.now() - vAPI.T0} ms`;
if ( selfieIsValid ) {
- µb.supportStats.launchToReadiness += ' (selfie)';
+ µb.supportStats.allReadyAfter += ' (selfie)';
}
-ubolog(`All ready ${µb.supportStats.launchToReadiness} ms after launch`);
+ubolog(`All ready ${µb.supportStats.allReadyAfter} ms after launch`);
// <<<<< end of private scope
})();
diff --git a/src/js/storage.js b/src/js/storage.js
index 65d397419..2532a0eb8 100644
--- a/src/js/storage.js
+++ b/src/js/storage.js
@@ -239,12 +239,6 @@ import {
if ( typeof hs[key] !== typeof hsDefault[key] ) { continue; }
this.hiddenSettings[key] = hs[key];
}
- if ( typeof this.hiddenSettings.suspendTabsUntilReady === 'boolean' ) {
- this.hiddenSettings.suspendTabsUntilReady =
- this.hiddenSettings.suspendTabsUntilReady
- ? 'yes'
- : 'unset';
- }
this.fireDOMEvent('hiddenSettingsChanged');
};
@@ -810,7 +804,9 @@ self.addEventListener('hiddenSettingsChanged', ( ) => {
const onFilterListsReady = function(lists) {
this.availableFilterLists = lists;
- vAPI.net.suspend();
+ if ( vAPI.net.canSuspend() ) {
+ vAPI.net.suspend();
+ }
redirectEngine.reset();
staticExtFilteringEngine.reset();
staticNetFilteringEngine.reset();
diff --git a/src/js/traffic.js b/src/js/traffic.js
index d4a01bbf6..e44ca9139 100644
--- a/src/js/traffic.js
+++ b/src/js/traffic.js
@@ -1146,22 +1146,7 @@ const webRequest = {
{ urls: [ 'http://*/*', 'https://*/*' ] },
[ 'blocking', 'responseHeaders' ]
);
- vAPI.net.unsuspend(true);
- // Mitigation: force-reload active tabs for environments not
- // supporting suspended network request listeners.
- if (
- vAPI.net.canSuspend() !== true ||
- µb.hiddenSettings.suspendTabsUntilReady === 'no'
- ) {
- const tabs = await vAPI.tabs.query({
- active: true,
- url: [ 'https://*/*', 'http://*/*' ],
- windowType: 'normal',
- });
- for ( const tab of tabs ) {
- vAPI.tabs.reload(tab.id);
- }
- }
+ vAPI.net.unsuspend({ all: true });
};
})(),