mirror of
https://github.com/gorhill/uBlock.git
synced 2024-11-05 18:32:30 +01:00
157cef6034
This commit moves the parsing, compiling and enforcement of the `redirect=` and `redirect-rule=` network filter options into the static network filtering engine as modifier options -- just like `csp=` and `queryprune=`. This solves the two following issues: - https://github.com/gorhill/uBlock/issues/3590 - https://github.com/uBlockOrigin/uBlock-issues/issues/1008#issuecomment-716164214 Additionally, `redirect=` option is not longer afflicted by static network filtering syntax quirks, `redirect=` filters can be used with any other static filtering modifier options, can be excepted using `@@` and can be badfilter-ed. Since more than one `redirect=` directives could be found to apply to a single network request, the concept of redirect priority is introduced. By default, `redirect=` directives have an implicit priority of 0. Filter authors can declare an explicit priority by appending `:[integer]` to the token of the `redirect=` option, for example: ||example.com/*.js$1p,script,redirect=noopjs:100 The priority dictates which redirect token out of many will be ultimately used. Cases of multiple `redirect=` directives applying to a single blocked network request are expected to be rather unlikely. Explicit redirect priority should be used if and only if there is a case of redirect ambiguity to solve.
216 lines
7.3 KiB
JavaScript
216 lines
7.3 KiB
JavaScript
/*******************************************************************************
|
|
|
|
uBlock Origin - a browser extension to block requests.
|
|
Copyright (C) 2014-present Raymond Hill
|
|
|
|
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
|
|
*/
|
|
|
|
|
|
'use strict';
|
|
|
|
/******************************************************************************/
|
|
|
|
// Not all platforms may have properly declared vAPI.webextFlavor.
|
|
|
|
if ( vAPI.webextFlavor === undefined ) {
|
|
vAPI.webextFlavor = { major: 0, soup: new Set([ 'ublock' ]) };
|
|
}
|
|
|
|
|
|
/******************************************************************************/
|
|
|
|
const µBlock = (( ) => { // jshint ignore:line
|
|
|
|
const hiddenSettingsDefault = {
|
|
allowGenericProceduralFilters: false,
|
|
assetFetchTimeout: 30,
|
|
autoCommentFilterTemplate: '{{date}} {{origin}}',
|
|
autoUpdateAssetFetchPeriod: 120,
|
|
autoUpdateDelayAfterLaunch: 180,
|
|
autoUpdatePeriod: 7,
|
|
benchmarkDatasetURL: 'unset',
|
|
blockingProfiles: '11111/#F00 11011/#C0F 11001/#00F 00001',
|
|
cacheStorageAPI: 'unset',
|
|
cacheStorageCompression: true,
|
|
cacheControlForFirefox1376932: 'no-cache, no-store, must-revalidate',
|
|
cloudStorageCompression: false,
|
|
cnameIgnoreList: 'unset',
|
|
cnameIgnore1stParty: true,
|
|
cnameIgnoreExceptions: true,
|
|
cnameIgnoreRootDocument: true,
|
|
cnameMaxTTL: 120,
|
|
cnameReplayFullURL: false,
|
|
cnameUncloak: true,
|
|
cnameUncloakProxied: false,
|
|
consoleLogLevel: 'unset',
|
|
debugScriptlets: false,
|
|
debugScriptletInjector: false,
|
|
disableWebAssembly: false,
|
|
extensionUpdateForceReload: false,
|
|
ignoreRedirectFilters: false,
|
|
ignoreScriptInjectFilters: false,
|
|
filterAuthorMode: false,
|
|
loggerPopupType: 'popup',
|
|
manualUpdateAssetFetchPeriod: 500,
|
|
popupFontSize: 'unset',
|
|
popupPanelDisabledSections: 0,
|
|
popupPanelLockedSections: 0,
|
|
popupPanelHeightMode: 0,
|
|
requestJournalProcessPeriod: 1000,
|
|
selfieAfter: 3,
|
|
strictBlockingBypassDuration: 120,
|
|
suspendTabsUntilReady: 'unset',
|
|
uiPopupConfig: 'undocumented',
|
|
uiFlavor: 'unset',
|
|
uiStyles: 'unset',
|
|
uiTheme: 'unset',
|
|
updateAssetBypassBrowserCache: false,
|
|
userResourcesLocation: 'unset',
|
|
};
|
|
|
|
return {
|
|
userSettings: {
|
|
advancedUserEnabled: false,
|
|
alwaysDetachLogger: true,
|
|
autoUpdate: true,
|
|
cloudStorageEnabled: false,
|
|
collapseBlocked: true,
|
|
colorBlindFriendly: false,
|
|
contextMenuEnabled: true,
|
|
dynamicFilteringEnabled: false,
|
|
externalLists: [],
|
|
firewallPaneMinimized: true,
|
|
hyperlinkAuditingDisabled: true,
|
|
ignoreGenericCosmeticFilters: vAPI.webextFlavor.soup.has('mobile'),
|
|
largeMediaSize: 50,
|
|
parseAllABPHideFilters: true,
|
|
popupPanelSections: 0b111,
|
|
prefetchingDisabled: true,
|
|
requestLogMaxEntries: 1000,
|
|
showIconBadge: true,
|
|
tooltipsDisabled: false,
|
|
webrtcIPAddressHidden: false,
|
|
},
|
|
|
|
hiddenSettingsDefault: hiddenSettingsDefault,
|
|
hiddenSettings: Object.assign({}, hiddenSettingsDefault),
|
|
|
|
// Features detection.
|
|
privacySettingsSupported: vAPI.browserSettings instanceof Object,
|
|
cloudStorageSupported: vAPI.cloud instanceof Object,
|
|
canFilterResponseData: typeof browser.webRequest.filterResponseData === 'function',
|
|
canInjectScriptletsNow: vAPI.webextFlavor.soup.has('chromium'),
|
|
|
|
// https://github.com/chrisaljoudi/uBlock/issues/180
|
|
// Whitelist directives need to be loaded once the PSL is available
|
|
netWhitelist: new Map(),
|
|
netWhitelistModifyTime: 0,
|
|
netWhitelistDefault: [
|
|
'about-scheme',
|
|
'chrome-extension-scheme',
|
|
'chrome-scheme',
|
|
'edge-scheme',
|
|
'moz-extension-scheme',
|
|
'opera-scheme',
|
|
'vivaldi-scheme',
|
|
'wyciwyg-scheme', // Firefox's "What-You-Cache-Is-What-You-Get"
|
|
],
|
|
|
|
localSettings: {
|
|
blockedRequestCount: 0,
|
|
allowedRequestCount: 0,
|
|
},
|
|
localSettingsLastModified: 0,
|
|
localSettingsLastSaved: 0,
|
|
|
|
// Read-only
|
|
systemSettings: {
|
|
compiledMagic: 31, // Increase when compiled format changes
|
|
selfieMagic: 31, // Increase when selfie format changes
|
|
},
|
|
|
|
// https://github.com/uBlockOrigin/uBlock-issues/issues/759#issuecomment-546654501
|
|
// The assumption is that cache storage state reflects whether
|
|
// compiled or selfie assets are available or not. The properties
|
|
// below is to no longer rely on this assumption -- though it's still
|
|
// not clear how the assumption could be wrong, and it's still not
|
|
// clear whether relying on those properties will really solve the
|
|
// issue. It's just an attempt at hardening.
|
|
compiledFormatChanged: false,
|
|
selfieIsInvalid: false,
|
|
|
|
restoreBackupSettings: {
|
|
lastRestoreFile: '',
|
|
lastRestoreTime: 0,
|
|
lastBackupFile: '',
|
|
lastBackupTime: 0,
|
|
},
|
|
|
|
commandShortcuts: new Map(),
|
|
|
|
// Allows to fully customize uBO's assets, typically set through admin
|
|
// settings. The content of 'assets.json' will also tell which filter
|
|
// lists to enable by default when uBO is first installed.
|
|
assetsBootstrapLocation: undefined,
|
|
|
|
userFiltersPath: 'user-filters',
|
|
pslAssetKey: 'public_suffix_list.dat',
|
|
|
|
selectedFilterLists: [],
|
|
availableFilterLists: {},
|
|
badLists: new Map(),
|
|
|
|
// https://github.com/uBlockOrigin/uBlock-issues/issues/974
|
|
// This can be used to defer filtering decision-making.
|
|
readyToFilter: false,
|
|
|
|
pageStores: new Map(),
|
|
pageStoresToken: 0,
|
|
|
|
storageQuota: vAPI.storage.QUOTA_BYTES,
|
|
storageUsed: 0,
|
|
|
|
noopFunc: function(){},
|
|
|
|
apiErrorCount: 0,
|
|
|
|
maybeGoodPopup: {
|
|
tabId: 0,
|
|
url: '',
|
|
},
|
|
|
|
epickerArgs: {
|
|
eprom: null,
|
|
mouse: false,
|
|
target: '',
|
|
zap: false,
|
|
},
|
|
|
|
scriptlets: {},
|
|
|
|
cspNoInlineScript: "script-src 'unsafe-eval' * blob: data:",
|
|
cspNoScripting: 'script-src http: https:',
|
|
cspNoInlineFont: 'font-src *',
|
|
|
|
liveBlockingProfiles: [],
|
|
blockingProfileColorCache: new Map(),
|
|
};
|
|
|
|
})();
|
|
|
|
/******************************************************************************/
|