Make asset updater compatible with non-persistent background page

Related issue:
https://github.com/uBlockOrigin/uBlock-issues/issues/2969

Additionally, modified default timing values for asset updater and
selfie creation.
This commit is contained in:
Raymond Hill 2024-03-01 19:52:55 -05:00
parent 80b66c849a
commit 96704f2fda
No known key found for this signature in database
GPG key ID: 25E1490B761470C2
4 changed files with 43 additions and 39 deletions

View file

@ -1325,6 +1325,8 @@ async function diffUpdater() {
terminate();
};
const worker = new Worker('js/diff-updater.js');
}).catch(reason => {
ubolog(`Diff updater: ${reason}`);
});
}

View file

@ -49,8 +49,8 @@ const hiddenSettingsDefault = {
allowGenericProceduralFilters: false,
assetFetchTimeout: 30,
autoCommentFilterTemplate: '{{date}} {{origin}}',
autoUpdateAssetFetchPeriod: 15,
autoUpdateDelayAfterLaunch: 105,
autoUpdateAssetFetchPeriod: 5,
autoUpdateDelayAfterLaunch: 37,
autoUpdatePeriod: 1,
benchmarkDatasetURL: 'unset',
blockingProfiles: '11111/#F00 11010/#C0F 11001/#00F 00001',
@ -84,7 +84,7 @@ const hiddenSettingsDefault = {
popupPanelHeightMode: 0,
requestJournalProcessPeriod: 1000,
requestStatsDisabled: false,
selfieAfter: 2,
selfieDelayInSeconds: 53,
strictBlockingBypassDuration: 120,
toolbarWarningTimeout: 60,
trustedListPrefixes: 'ublock-',

View file

@ -476,15 +476,6 @@ webRequest.start();
// as possible ensure minimal memory usage baseline.
lz4Codec.relinquish();
// https://github.com/chrisaljoudi/uBlock/issues/184
// Check for updates not too far in the future.
io.addObserver(µb.assetObserver.bind(µb));
µb.scheduleAssetUpdater({
updateDelay: µb.userSettings.autoUpdate
? µb.hiddenSettings.autoUpdateDelayAfterLaunch * 1000
: 0
});
// Force an update of the context menu according to the currently
// active tab.
contextMenu.update();
@ -509,11 +500,39 @@ ubolog(`All ready ${µb.supportStats.allReadyAfter} after launch`);
µb.isReadyResolve();
// https://github.com/chrisaljoudi/uBlock/issues/184
// Check for updates not too far in the future.
io.addObserver(µb.assetObserver.bind(µb));
if ( µb.userSettings.autoUpdate ) {
let needEmergencyUpdate = false;
const entries = await io.getUpdateAges({
filters: µb.selectedFilterLists,
internal: [ '*' ],
});
for ( const entry of entries ) {
if ( entry.ageNormalized < 2 ) { continue; }
needEmergencyUpdate = true;
break;
}
const updateDelay = needEmergencyUpdate
? 2000
: µb.hiddenSettings.autoUpdateDelayAfterLaunch * 1000;
µb.scheduleAssetUpdater({
auto: true,
updateDelay,
fetchDelay: needEmergencyUpdate ? 1000 : undefined
});
}
// Process alarm queue
while ( µb.alarmQueue.length !== 0 ) {
const what = µb.alarmQueue.shift();
ubolog(`Processing alarm event from suspended state: '${what}'`);
switch ( what ) {
case 'assetUpdater':
µb.scheduleAssetUpdater({ auto: true, updateDelay: 2000, fetchDelay : 1000 });
break;
case 'createSelfie':
µb.selfieManager.create();
break;

View file

@ -1376,9 +1376,9 @@ onBroadcast(msg => {
ubolog('Filtering engine selfie marked for invalidation');
}
vAPI.alarms.create('createSelfie', {
delayInMinutes: µb.hiddenSettings.selfieAfter + 0.5
delayInMinutes: (µb.hiddenSettings.selfieDelayInSeconds + 17) / 60,
});
createTimer.offon({ min: µb.hiddenSettings.selfieAfter });
createTimer.offon({ sec: µb.hiddenSettings.selfieDelayInSeconds });
};
const createTimer = vAPI.defer.create(create);
@ -1543,7 +1543,6 @@ onBroadcast(msg => {
{
let next = 0;
let lastEmergencyUpdate = 0;
const launchTimer = vAPI.defer.create(fetchDelay => {
next = 0;
@ -1552,6 +1551,7 @@ onBroadcast(msg => {
µb.scheduleAssetUpdater = async function(details = {}) {
launchTimer.off();
vAPI.alarms.clear('assetUpdater');
if ( details.now ) {
next = 0;
@ -1570,40 +1570,23 @@ onBroadcast(msg => {
this.hiddenSettings.autoUpdatePeriod * 3600000;
const now = Date.now();
let needEmergencyUpdate = false;
// Respect cooldown period before launching an emergency update.
const timeSinceLastEmergencyUpdate = (now - lastEmergencyUpdate) / 3600000;
if ( timeSinceLastEmergencyUpdate > 1 ) {
const entries = await io.getUpdateAges({
filters: µb.selectedFilterLists,
internal: [ '*' ],
});
for ( const entry of entries ) {
if ( entry.ageNormalized < 2 ) { continue; }
needEmergencyUpdate = true;
lastEmergencyUpdate = now;
break;
}
}
// Use the new schedule if and only if it is earlier than the previous
// one.
if ( next !== 0 ) {
updateDelay = Math.min(updateDelay, Math.max(next - now, 0));
}
if ( needEmergencyUpdate ) {
updateDelay = Math.min(updateDelay, 15000);
updateDelay = Math.min(updateDelay, Math.max(next - now, 1));
}
next = now + updateDelay;
const fetchDelay = needEmergencyUpdate
? 2000
: this.hiddenSettings.autoUpdateAssetFetchPeriod * 1000 || 60000;
const fetchDelay = details.fetchDelay ||
this.hiddenSettings.autoUpdateAssetFetchPeriod * 1000 ||
60000;
launchTimer.on(updateDelay, fetchDelay);
vAPI.alarms.create('assetUpdater', {
delayInMinutes: Math.ceil(updateDelay / 60000) + 0.25
});
};
}