uBlock/src/js/start.js

237 lines
7.4 KiB
JavaScript
Raw Normal View History

2014-06-24 00:42:43 +02:00
/*******************************************************************************
2015-03-07 19:20:18 +01:00
µBlock - a browser extension to block requests.
2015-02-13 18:10:10 +01:00
Copyright (C) 2014-2015 Raymond Hill
2014-06-24 00:42:43 +02:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
2015-02-24 19:48:03 +01:00
/* global publicSuffixList, vAPI, µBlock */
2014-06-24 00:42:43 +02:00
/******************************************************************************/
2015-02-13 18:10:10 +01:00
// Load all: executed once.
2014-06-24 00:42:43 +02:00
2015-02-13 18:10:10 +01:00
(function() {
2014-08-21 01:39:49 +02:00
2015-03-11 04:46:18 +01:00
'use strict';
2015-02-28 01:47:34 +01:00
//quickProfiler.start('start.js');
2015-02-24 00:31:29 +01:00
2015-02-13 18:10:10 +01:00
/******************************************************************************/
2015-02-24 19:48:03 +01:00
var µb = µBlock;
/******************************************************************************/
2015-02-13 18:10:10 +01:00
// Final initialization steps after all needed assets are in memory.
// - Initialize internal state with maybe already existing tabs.
// - Schedule next update operation.
var onAllReady = function() {
// https://github.com/gorhill/uBlock/issues/184
// Check for updates not too far in the future.
µb.assetUpdater.onStart.addEventListener(µb.updateStartHandler.bind(µb));
µb.assetUpdater.onCompleted.addEventListener(µb.updateCompleteHandler.bind(µb));
2015-02-24 00:31:29 +01:00
µb.assetUpdater.onAssetUpdated.addEventListener(µb.assetUpdatedHandler.bind(µb));
µb.assets.onAssetCacheRemoved.addEventListener(µb.assetCacheRemovedHandler.bind(µb));
2015-02-13 18:10:10 +01:00
// Important: remove barrier to remote fetching, this was useful only
// for launch time.
2015-03-11 19:52:20 +01:00
µb.assets.remoteFetchBarrier -= 1;
2015-02-13 18:10:10 +01:00
2015-02-28 01:47:34 +01:00
//quickProfiler.stop(0);
2015-02-24 00:31:29 +01:00
2015-02-13 18:10:10 +01:00
vAPI.onLoadAllCompleted();
};
2014-12-20 21:28:16 +01:00
2015-03-11 19:52:20 +01:00
// Forbid remote fetching of assets
µb.assets.remoteFetchBarrier += 1;
2014-08-21 01:39:49 +02:00
/******************************************************************************/
2015-02-24 19:48:03 +01:00
// Filtering engines dependencies:
// - PSL
2014-08-21 01:39:49 +02:00
2015-02-24 19:48:03 +01:00
var onPSLReady = function() {
µb.loadFilterLists(onAllReady);
};
2014-09-08 23:46:58 +02:00
2015-02-24 19:48:03 +01:00
/******************************************************************************/
// To bring older versions up to date
var onVersionReady = function(lastVersion) {
2015-02-13 18:10:10 +01:00
// Whitelist some key scopes by default
if ( lastVersion.localeCompare('0.8.6.0') < 0 ) {
µb.netWhitelist = µb.whitelistFromString(
2015-03-07 19:20:18 +01:00
µb.stringFromWhitelist(µb.netWhitelist) +
'\n' +
2015-02-13 18:10:10 +01:00
µb.netWhitelistDefault
);
µb.saveWhitelist();
2014-08-21 01:39:49 +02:00
}
2015-02-24 19:48:03 +01:00
if ( lastVersion !== vAPI.app.version ) {
vAPI.storage.set({ version: vAPI.app.version });
2014-09-08 23:46:58 +02:00
}
2015-02-13 18:10:10 +01:00
};
/******************************************************************************/
2014-09-08 23:46:58 +02:00
2015-02-24 19:48:03 +01:00
var onSelfieReady = function(selfie) {
if ( selfie === null || selfie.magic !== µb.systemSettings.selfieMagic ) {
return false;
}
if ( publicSuffixList.fromSelfie(selfie.publicSuffixList) !== true ) {
return false;
}
//console.log('start.js/onSelfieReady: selfie looks good');
µb.remoteBlacklists = selfie.filterLists;
µb.staticNetFilteringEngine.fromSelfie(selfie.staticNetFilteringEngine);
µb.cosmeticFilteringEngine.fromSelfie(selfie.cosmeticFilteringEngine);
return true;
2014-08-21 01:39:49 +02:00
};
/******************************************************************************/
2015-02-13 18:10:10 +01:00
// https://github.com/gorhill/uBlock/issues/226
// Whitelist in memory.
// Whitelist parser needs PSL to be ready.
// gorhill 2014-12-15: not anymore
2015-02-24 19:48:03 +01:00
var onNetWhitelistReady = function(netWhitelistRaw) {
µb.netWhitelist = µb.whitelistFromString(netWhitelistRaw);
µb.netWhitelistModifyTime = Date.now();
2015-02-13 18:10:10 +01:00
};
/******************************************************************************/
// User settings are in memory
2015-02-24 19:48:03 +01:00
var onUserSettingsReady = function(fetched) {
var userSettings = µb.userSettings;
fromFetch(userSettings, fetched);
2014-08-21 16:56:36 +02:00
2015-02-13 18:10:10 +01:00
// https://github.com/gorhill/uBlock/issues/426
// Important: block remote fetching for when loading assets at launch
// time.
µb.assets.autoUpdate = userSettings.autoUpdate;
2015-03-11 04:46:18 +01:00
µb.assets.autoUpdateDelay = µb.updateAssetsEvery;
2015-02-13 18:10:10 +01:00
// https://github.com/gorhill/uBlock/issues/540
// Disabling local mirroring for the time being
userSettings.experimentalEnabled = false;
µb.mirrors.toggle(false /* userSettings.experimentalEnabled */);
µb.contextMenu.toggle(userSettings.contextMenuEnabled);
µb.permanentFirewall.fromString(userSettings.dynamicFilteringString);
µb.sessionFirewall.assign(µb.permanentFirewall);
// Remove obsolete setting
delete userSettings.logRequests;
µb.XAL.keyvalRemoveOne('logRequests');
};
2015-02-24 00:31:29 +01:00
/******************************************************************************/
2015-02-24 19:48:03 +01:00
// Housekeeping, as per system setting changes
var onSystemSettingsReady = function(fetched) {
2015-02-24 00:31:29 +01:00
var mustSaveSystemSettings = false;
2015-02-24 19:48:03 +01:00
if ( fetched.compiledMagic !== µb.systemSettings.compiledMagic ) {
2015-02-24 00:31:29 +01:00
µb.assets.purge(/^cache:\/\/compiled-/);
mustSaveSystemSettings = true;
}
2015-02-24 19:48:03 +01:00
if ( fetched.selfieMagic !== µb.systemSettings.selfieMagic ) {
2015-02-24 00:31:29 +01:00
mustSaveSystemSettings = true;
}
if ( mustSaveSystemSettings ) {
fetched.selfie = null;
µb.destroySelfie();
2015-02-24 19:48:03 +01:00
vAPI.storage.set(µb.systemSettings, µb.noopFunc);
2015-02-24 00:31:29 +01:00
}
2015-02-24 19:48:03 +01:00
};
/******************************************************************************/
var onFirstFetchReady = function(fetched) {
// Order is important -- do not change:
onSystemSettingsReady(fetched);
2015-03-07 05:36:09 +01:00
fromFetch(µb.localSettings, fetched);
2015-02-24 19:48:03 +01:00
onUserSettingsReady(fetched);
2015-03-07 05:36:09 +01:00
fromFetch(µb.restoreBackupSettings, fetched);
2015-02-24 19:48:03 +01:00
onNetWhitelistReady(fetched.netWhitelist);
onVersionReady(fetched.version);
2015-02-24 00:31:29 +01:00
2015-02-24 19:48:03 +01:00
// If we have a selfie, skip loading PSL, filters
if ( onSelfieReady(fetched.selfie) ) {
onAllReady();
return;
}
µb.loadPublicSuffixList(onPSLReady);
};
/******************************************************************************/
var fetchableProps = {
'compiledMagic': '',
2015-03-07 05:36:09 +01:00
'lastRestoreFile': '',
'lastRestoreTime': 0,
'lastBackupFile': '',
'lastBackupTime': 0,
2015-02-24 19:48:03 +01:00
'netWhitelist': '',
'selfie': null,
'selfieMagic': '',
'version': '0.0.0.0'
};
var toFetch = function(from, fetched) {
for ( var k in from ) {
if ( from.hasOwnProperty(k) === false ) {
continue;
}
fetched[k] = from[k];
}
};
var fromFetch = function(to, fetched) {
for ( var k in to ) {
if ( to.hasOwnProperty(k) === false ) {
continue;
}
if ( fetched.hasOwnProperty(k) === false ) {
continue;
}
to[k] = fetched[k];
}
2015-02-24 00:31:29 +01:00
};
/******************************************************************************/
2015-02-24 19:48:03 +01:00
toFetch(µb.localSettings, fetchableProps);
toFetch(µb.userSettings, fetchableProps);
2015-03-07 05:36:09 +01:00
toFetch(µb.restoreBackupSettings, fetchableProps);
2015-02-24 19:48:03 +01:00
vAPI.storage.get(fetchableProps, onFirstFetchReady);
2015-02-13 18:10:10 +01:00
/******************************************************************************/
})();
2014-08-21 16:56:36 +02:00
/******************************************************************************/