2014-06-24 00:42:43 +02:00
|
|
|
/*******************************************************************************
|
|
|
|
|
2015-05-21 20:15:17 +02:00
|
|
|
uBlock - 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-03-11 23:26:00 +01:00
|
|
|
µBlock.restart = (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-06-11 18:12:23 +02:00
|
|
|
vAPI.app.onShutdown = function() {
|
|
|
|
µb.staticFilteringReverseLookup.shutdown();
|
2015-06-23 17:37:44 +02:00
|
|
|
µb.assetUpdater.shutdown();
|
2015-06-11 18:12:23 +02:00
|
|
|
µb.staticNetFilteringEngine.reset();
|
|
|
|
µb.sessionFirewall.reset();
|
|
|
|
µb.permanentFirewall.reset();
|
|
|
|
µb.permanentFirewall.reset();
|
|
|
|
µb.sessionURLFiltering.reset();
|
|
|
|
µb.permanentURLFiltering.reset();
|
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
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() {
|
2015-04-07 03:26:05 +02:00
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/184
|
2015-02-13 18:10:10 +01:00
|
|
|
// 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-08-11 21:29:14 +02:00
|
|
|
vAPI.cloud.start([
|
|
|
|
'tpFiltersPane',
|
|
|
|
'myFiltersPane',
|
|
|
|
'myRulesPane',
|
|
|
|
'whitelistPane'
|
|
|
|
]);
|
|
|
|
|
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();
|
2016-01-17 19:30:43 +01:00
|
|
|
µb.contextMenu.update(null);
|
2016-01-03 19:58:25 +01:00
|
|
|
µb.firstInstall = false;
|
2015-02-13 18:10:10 +01:00
|
|
|
};
|
2014-12-20 21:28:16 +01:00
|
|
|
|
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-04-27 16:54:13 +02:00
|
|
|
// https://github.com/gorhill/uBlock/issues/135#issuecomment-96677379
|
|
|
|
// `about:loopconversation` is used by Firefox for its Hello service
|
|
|
|
if ( lastVersion.localeCompare('0.9.5.2') < 0 ) {
|
|
|
|
µb.netWhitelist = µb.whitelistFromString(
|
|
|
|
µb.stringFromWhitelist(µb.netWhitelist) +
|
|
|
|
'\n' +
|
|
|
|
'loopconversation.about-scheme'
|
|
|
|
);
|
|
|
|
µb.saveWhitelist();
|
|
|
|
}
|
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;
|
|
|
|
}
|
2015-11-29 23:06:58 +01:00
|
|
|
if ( selfie.redirectEngine === undefined ) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-02-24 19:48:03 +01:00
|
|
|
µb.remoteBlacklists = selfie.filterLists;
|
|
|
|
µb.staticNetFilteringEngine.fromSelfie(selfie.staticNetFilteringEngine);
|
2015-11-29 17:04:42 +01:00
|
|
|
µb.redirectEngine.fromSelfie(selfie.redirectEngine);
|
2015-02-24 19:48:03 +01:00
|
|
|
µb.cosmeticFilteringEngine.fromSelfie(selfie.cosmeticFilteringEngine);
|
|
|
|
return true;
|
2014-08-21 01:39:49 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
2015-04-07 03:26:05 +02:00
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/226
|
2015-02-13 18:10:10 +01:00
|
|
|
// 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-04-07 03:26:05 +02:00
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/426
|
2015-02-13 18:10:10 +01:00
|
|
|
// 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
|
|
|
|
2015-04-07 03:26:05 +02:00
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/540
|
2015-02-13 18:10:10 +01:00
|
|
|
// Disabling local mirroring for the time being
|
|
|
|
userSettings.experimentalEnabled = false;
|
|
|
|
|
2015-06-02 15:27:18 +02:00
|
|
|
vAPI.browserSettings.set({
|
|
|
|
'hyperlinkAuditing': !userSettings.hyperlinkAuditingDisabled,
|
2015-06-25 02:01:27 +02:00
|
|
|
'prefetching': !userSettings.prefetchingDisabled,
|
|
|
|
'webrtcIPAddress': !userSettings.webrtcIPAddressHidden
|
2015-06-02 15:27:18 +02:00
|
|
|
});
|
2015-06-01 21:03:22 +02:00
|
|
|
|
2015-03-27 18:00:55 +01:00
|
|
|
µb.permanentFirewall.fromString(fetched.dynamicFilteringString);
|
2015-02-13 18:10:10 +01:00
|
|
|
µb.sessionFirewall.assign(µb.permanentFirewall);
|
2015-05-21 20:15:17 +02:00
|
|
|
µb.permanentURLFiltering.fromString(fetched.urlFilteringString);
|
|
|
|
µb.sessionURLFiltering.assign(µb.permanentURLFiltering);
|
2015-03-27 18:00:55 +01:00
|
|
|
µb.hnSwitches.fromString(fetched.hostnameSwitchesString);
|
2015-02-13 18:10:10 +01:00
|
|
|
|
|
|
|
// Remove obsolete setting
|
|
|
|
delete userSettings.logRequests;
|
2015-04-10 08:17:12 +02:00
|
|
|
vAPI.storage.remove('logRequests');
|
2015-02-13 18:10:10 +01:00
|
|
|
};
|
|
|
|
|
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 ) {
|
2015-03-01 23:25:48 +01:00
|
|
|
fetched.selfie = null;
|
2015-11-29 23:06:58 +01:00
|
|
|
µb.selfieManager.destroy();
|
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) {
|
2016-01-03 19:58:25 +01:00
|
|
|
// https://github.com/gorhill/uBlock/issues/747
|
|
|
|
µb.firstInstall = fetched.version === '0.0.0.0';
|
|
|
|
|
2015-02-24 19:48:03 +01:00
|
|
|
// 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 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
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
2016-01-03 19:58:25 +01:00
|
|
|
var onAdminSettingsRestored = function() {
|
|
|
|
// Forbid remote fetching of assets
|
|
|
|
µb.assets.remoteFetchBarrier += 1;
|
|
|
|
|
|
|
|
var fetchableProps = {
|
|
|
|
'compiledMagic': '',
|
|
|
|
'dynamicFilteringString': 'behind-the-scene * 3p noop\nbehind-the-scene * 3p-frame noop',
|
|
|
|
'urlFilteringString': '',
|
|
|
|
'hostnameSwitchesString': '',
|
|
|
|
'lastRestoreFile': '',
|
|
|
|
'lastRestoreTime': 0,
|
|
|
|
'lastBackupFile': '',
|
|
|
|
'lastBackupTime': 0,
|
|
|
|
'netWhitelist': '',
|
|
|
|
'selfie': null,
|
|
|
|
'selfieMagic': '',
|
|
|
|
'version': '0.0.0.0'
|
2015-10-21 17:53:03 +02:00
|
|
|
};
|
2015-03-11 23:26:00 +01:00
|
|
|
|
2016-01-03 19:58:25 +01:00
|
|
|
toFetch(µb.localSettings, fetchableProps);
|
|
|
|
toFetch(µb.userSettings, fetchableProps);
|
|
|
|
toFetch(µb.restoreBackupSettings, fetchableProps);
|
|
|
|
|
|
|
|
vAPI.storage.get(fetchableProps, onFirstFetchReady);
|
|
|
|
};
|
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
return function() {
|
2015-10-21 17:53:03 +02:00
|
|
|
// https://github.com/gorhill/uBlock/issues/531
|
|
|
|
µb.restoreAdminSettings(onAdminSettingsRestored);
|
2015-03-11 23:26:00 +01:00
|
|
|
};
|
2015-02-13 18:10:10 +01:00
|
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
|
|
})();
|
2014-08-21 16:56:36 +02:00
|
|
|
|
|
|
|
/******************************************************************************/
|
2015-03-11 23:26:00 +01:00
|
|
|
|
|
|
|
µBlock.restart();
|