diff --git a/README.md b/README.md index a1e9c04eb0ebb..880f57a750169 100644 --- a/README.md +++ b/README.md @@ -135,7 +135,7 @@ Also of interest: [Deploying uBlock Origin for Firefox with CCK2 and Group Polic ##### Debian/Ubuntu -Users of Debian 9 or later or Ubuntu 16.04 or later may simply +Thanks to Debian contributor [Sean Whitton](https://wiki.debian.org/SeanWhitton), users of Debian 9 or later or Ubuntu 16.04 or later may simply `apt-get install xul-ext-ublock-origin`. #### Microsoft Edge diff --git a/platform/chromium/manifest.json b/platform/chromium/manifest.json index 750869fce5611..11f43225a6ef9 100644 --- a/platform/chromium/manifest.json +++ b/platform/chromium/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "uBlock Origin", - "version": "1.9.7.1", + "version": "1.9.7.4", "default_locale": "en", "description": "__MSG_extShortDesc__", diff --git a/platform/chromium/vapi-background.js b/platform/chromium/vapi-background.js index 3014ca2f3a7bb..bd4e5eb3fef65 100644 --- a/platform/chromium/vapi-background.js +++ b/platform/chromium/vapi-background.js @@ -240,10 +240,25 @@ vAPI.tabs.registerListeners = function() { // http://raymondhill.net/ublock/popup.html var reGoodForWebRequestAPI = /^https?:\/\//; + // https://forums.lanik.us/viewtopic.php?f=62&t=32826 + // Chromium-based browsers: sanitize target URL. I've seen data: URI with + // newline characters in standard fields, possibly as a way of evading + // filters. As per spec, there should be no whitespaces in a data: URI's + // standard fields. + var sanitizeURL = function(url) { + if ( url.startsWith('data:') === false ) { return url; } + var pos = url.indexOf(','); + if ( pos === -1 ) { return url; } + var s = url.slice(0, pos); + if ( s.search(/\s/) === -1 ) { return url; } + return s.replace(/\s+/, '') + url.slice(pos); + }; + var onCreatedNavigationTarget = function(details) { //console.debug('onCreatedNavigationTarget: popup candidate tab id %d = "%s"', details.tabId, details.url); if ( reGoodForWebRequestAPI.test(details.url) === false ) { details.frameId = 0; + details.url = sanitizeURL(details.url); onNavigationClient(details); } if ( typeof vAPI.tabs.onPopupCreated === 'function' ) { @@ -261,6 +276,7 @@ vAPI.tabs.registerListeners = function() { if ( details.frameId !== 0 ) { return; } + details.url = sanitizeURL(details.url); onNavigationClient(details); }; @@ -269,6 +285,9 @@ vAPI.tabs.registerListeners = function() { }; var onUpdated = function(tabId, changeInfo, tab) { + if ( changeInfo.url ) { + changeInfo.url = sanitizeURL(changeInfo.url); + } onUpdatedClient(tabId, changeInfo, tab); }; diff --git a/platform/edge/manifest.json b/platform/edge/manifest.json index 9b9a292188b37..be2156daf11ab 100644 --- a/platform/edge/manifest.json +++ b/platform/edge/manifest.json @@ -1,8 +1,8 @@ { "manifest_version": 2, - "name": "uBlock Origin", - "version": "1.9.7.1", + "name": "μBlock Origin", + "version": "1.9.7.4", "default_locale": "en", "description": "__MSG_extShortDesc__", diff --git a/platform/edge/vapi-background.js b/platform/edge/vapi-background.js index aa7c39ac83805..d3e6d63408056 100644 --- a/platform/edge/vapi-background.js +++ b/platform/edge/vapi-background.js @@ -361,10 +361,25 @@ vAPI.tabs.registerListeners = function() { // http://raymondhill.net/ublock/popup.html var reGoodForWebRequestAPI = /^https?:\/\//; + // https://forums.lanik.us/viewtopic.php?f=62&t=32826 + // Chromium-based browsers: sanitize target URL. I've seen data: URI with + // newline characters in standard fields, possibly as a way of evading + // filters. As per spec, there should be no whitespaces in a data: URI's + // standard fields. + var sanitizeURL = function(url) { + if ( url.startsWith('data:') === false ) { return url; } + var pos = url.indexOf(','); + if ( pos === -1 ) { return url; } + var s = url.slice(0, pos); + if ( s.search(/\s/) === -1 ) { return url; } + return s.replace(/\s+/, '') + url.slice(pos); + }; + var onCreatedNavigationTarget = function(details) { //console.debug('onCreatedNavigationTarget: popup candidate tab id %d = "%s"', details.tabId, details.url); if ( reGoodForWebRequestAPI.test(details.url) === false ) { details.frameId = 0; + details.url = sanitizeURL(details.url); onNavigationClient(details); } if ( typeof vAPI.tabs.onPopupCreated === 'function' ) { @@ -382,6 +397,7 @@ vAPI.tabs.registerListeners = function() { if ( details.frameId !== 0 ) { return; } + details.url = sanitizeURL(details.url); onNavigationClient(details); }; @@ -390,6 +406,9 @@ vAPI.tabs.registerListeners = function() { }; var onUpdated = function(tabId, changeInfo, tab) { + if ( changeInfo.url ) { + changeInfo.url = sanitizeURL(changeInfo.url); + } onUpdatedClient(tabId, changeInfo, tab); }; diff --git a/platform/opera/manifest.json b/platform/opera/manifest.json index 5febad3afb412..d765e998598e1 100644 --- a/platform/opera/manifest.json +++ b/platform/opera/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "uBlock Origin", - "version": "1.9.7.1", + "version": "1.9.7.4", "default_locale": "en", "description": "__MSG_extShortDesc__", diff --git a/src/js/background.js b/src/js/background.js index 1a384b5888b51..c63d680b3c804 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -50,6 +50,7 @@ return { userSettings: { advancedUserEnabled: false, + alwaysDetachLogger: false, autoUpdate: true, cloudStorageEnabled: false, collapseBlocked: true, diff --git a/src/js/cosmetic-filtering.js b/src/js/cosmetic-filtering.js index 58cc598501121..8859530bc770c 100644 --- a/src/js/cosmetic-filtering.js +++ b/src/js/cosmetic-filtering.js @@ -1337,7 +1337,7 @@ FilterContainer.prototype.retrieveUserScripts = function(domain, hostname) { bucket.retrieve(hostname, selectors); } if ( entity !== '' && (bucket = this.userScripts.get(entity)) ) { - bucket.retrieve(hostname, selectors); + bucket.retrieve(entity, selectors); } var i = selectors.length; while ( i-- ) { diff --git a/src/js/messaging.js b/src/js/messaging.js index 5717e4704838f..4d44872199950 100644 --- a/src/js/messaging.js +++ b/src/js/messaging.js @@ -139,7 +139,7 @@ var onMessage = function(request, sender, callback) { break; case 'gotoURL': - vAPI.tabs.open(request.details); + µb.openNewTab(request.details); break; case 'reloadTab': diff --git a/src/js/popup.js b/src/js/popup.js index c42e9d114b2c5..7f16de3d39a02 100644 --- a/src/js/popup.js +++ b/src/js/popup.js @@ -571,8 +571,6 @@ var gotoURL = function(ev) { ev.preventDefault(); - var rel = this.getAttribute('rel') || ''; - messaging.send( 'popupPanel', { @@ -581,7 +579,7 @@ var gotoURL = function(ev) { url: this.getAttribute('href'), select: true, index: -1, - popup: rel === 'popup' && ev.shiftKey + shiftKey: ev.shiftKey } } ); diff --git a/src/js/reverselookup-worker.js b/src/js/reverselookup-worker.js index ed4f910048a5d..17a99a9811a44 100644 --- a/src/js/reverselookup-worker.js +++ b/src/js/reverselookup-worker.js @@ -157,9 +157,9 @@ var fromCosmeticFilter = function(details) { var domain = details.domain; pos = domain.indexOf('.'); if ( pos !== -1 ) { - var entity = domain.slice(0, pos); - candidates[entity + '.*##' + filter] = new RegExp( - ['c', 'e', reEscape(entity), reEscape(filter)].join('\\v') + + var entity = domain.slice(0, pos) + '.*'; + candidates[entity + '##' + filter] = new RegExp( + ['c', 'h', '\\w+', reEscape(entity), reEscape(filter)].join('\\v') + '(?:\\n|$)' ); } diff --git a/src/js/tab.js b/src/js/tab.js index 597896e451790..6ca1c781875f4 100644 --- a/src/js/tab.js +++ b/src/js/tab.js @@ -391,12 +391,15 @@ housekeep itself. return tabContexts[vAPI.noTabId]; }; + // https://github.com/gorhill/uBlock/issues/1735 + // Filter for popups if actually committing. var commit = function(tabId, url) { var entry = tabContexts[tabId]; if ( entry === undefined ) { entry = push(tabId, url); } else { entry.commit(url); + popupCandidateTest(tabId); } return entry; }; @@ -534,8 +537,6 @@ vAPI.tabs.onClosed = function(tabId) { // d: close target vAPI.tabs.onPopupUpdated = (function() { - //console.debug('vAPI.tabs.onPopup: details = %o', details); - // The same context object will be reused everytime. This also allows to // remember whether a popup or popunder was matched. var context = {}; @@ -575,9 +576,15 @@ vAPI.tabs.onPopupUpdated = (function() { context.requestType = 'popup'; // https://github.com/gorhill/uBlock/commit/1d448b85b2931412508aa01bf899e0b6f0033626#commitcomment-14944764 - // Ignore bad target URL. On Firefox, an `about:blank` tab may be - // opened for a new tab before it is filled in with the real target URL. - if ( context.requestHostname === '' ) { + // Ignore bad target URL. On Firefox, an `about:blank` tab may be + // opened for a new tab before it is filled in with the real target + // URL. + // https://github.com/gorhill/uBlock/issues/1735 + // Do not bail out on `data:` URI, they are commonly used for popups. + if ( + context.requestHostname === '' && + targetURL.startsWith('data:') === false + ) { return ''; } diff --git a/src/js/utils.js b/src/js/utils.js index 2dde6c95ecd39..2d5a661171698 100644 --- a/src/js/utils.js +++ b/src/js/utils.js @@ -210,3 +210,18 @@ }; /******************************************************************************/ + +µBlock.openNewTab = function(details) { + if ( details.url.startsWith('logger-ui.html') ) { + if ( details.shiftKey ) { + this.changeUserSettings( + 'alwaysDetachLogger', + !this.userSettings.alwaysDetachLogger + ); + } + details.popup = this.userSettings.alwaysDetachLogger; + } + vAPI.tabs.open(details); +}; + +/******************************************************************************/ diff --git a/src/popup.html b/src/popup.html index 493808009908b..6da2a6f60a86d 100644 --- a/src/popup.html +++ b/src/popup.html @@ -18,7 +18,7 @@

 

   - +

?