diff --git a/platform/firefox/vapi-client.js b/platform/firefox/vapi-client.js index 8eb7f83dd..13025f672 100644 --- a/platform/firefox/vapi-client.js +++ b/platform/firefox/vapi-client.js @@ -430,43 +430,42 @@ vAPI.messaging.start(); /******************************************************************************/ -vAPI.userCSS = (function() { - if ( !self.injectCSS ) { - return; - } - var injectCSS = self.injectCSS, - removeCSS = self.removeCSS, - userCSS = '', - sheetURI = ''; - var load = function() { - if ( userCSS === '' || sheetURI !== '' ) { return; } - sheetURI = 'data:text/css;charset=utf-8,' + encodeURIComponent(userCSS); - injectCSS(sheetURI); - }; - var unload = function() { - if ( sheetURI === '' ) { return; } - removeCSS(sheetURI); - sheetURI = ''; - }; - var add = function(cssText) { - if ( cssText === '' ) { return; } - if ( userCSS !== '' ) { userCSS += '\n'; } - userCSS += cssText; - unload(); - load(); - }; - var toggle = function(state) { - if ( userCSS === '' ) { return; } - if ( state === undefined ) { - state = sheetURI === ''; +if ( self.injectCSS ) { + vAPI.userCSS = { + _userCSS: '', + _sheetURI: '', + _load: function() { + if ( this._userCSS === '' || this._sheetURI !== '' ) { return; } + this._sheetURI = 'data:text/css;charset=utf-8,' + encodeURIComponent(this._userCSS); + self.injectCSS(this._sheetURI); + }, + _unload: function() { + if ( this._sheetURI === '' ) { return; } + self.removeCSS(this._sheetURI); + this._sheetURI = ''; + }, + add: function(cssText) { + if ( cssText === '' ) { return; } + if ( this._userCSS !== '' ) { this._userCSS += '\n'; } + this._userCSS += cssText; + this._unload(); + this._load(); + }, + remove: function(cssText) { + if ( cssText === '' || this._userCSS === '' ) { return; } + this._userCSS = this._userCSS.replace(cssText, '').trim(); + this._unload(); + this._load(); + }, + toggle: function(state) { + if ( this._userCSS === '' ) { return; } + if ( state === undefined ) { + state = this._sheetURI === ''; + } + return state ? this._load() : this._unload(); } - return state ? load() : unload(); }; - return { - add: add, - toggle: toggle - }; -})(); +} /******************************************************************************/ diff --git a/src/js/contentscript.js b/src/js/contentscript.js index 9f2450965..9e20dbc5d 100644 --- a/src/js/contentscript.js +++ b/src/js/contentscript.js @@ -292,6 +292,7 @@ var domFilterer = { removedNodesHandlerMissCount: 0, disabledId: vAPI.randomToken(), enabled: true, + excludeId: undefined, hiddenId: vAPI.randomToken(), hiddenNodeCount: 0, hiddenNodeEnforcer: false, @@ -519,10 +520,16 @@ var domFilterer = { } }, - hideNode: function(node) { - if ( node[this.hiddenId] !== undefined ) { - return; + getExcludeId: function() { + if ( this.excludeId === undefined ) { + this.excludeId = vAPI.randomToken(); } + return this.excludeId; + }, + + hideNode: function(node) { + if ( node[this.hiddenId] !== undefined ) { return; } + if ( this.excludeId !== undefined && node[this.excludeId] ) { return; } node.setAttribute(this.hiddenId, ''); this.hiddenNodeCount += 1; node.hidden = true; @@ -535,9 +542,7 @@ var domFilterer = { if ( styleAttr !== '' ) { styleAttr += '; '; } node.setAttribute('style', styleAttr + 'display: none !important;'); } - if ( shadowId === undefined ) { - return; - } + if ( shadowId === undefined ) { return; } var shadow = node.shadowRoot; if ( shadow ) { if ( shadow[shadowId] && shadow.firstElementChild !== null ) { diff --git a/src/js/scriptlets/element-picker.js b/src/js/scriptlets/element-picker.js index 30fb2c3b5..fc77cbdd0 100644 --- a/src/js/scriptlets/element-picker.js +++ b/src/js/scriptlets/element-picker.js @@ -606,7 +606,7 @@ var filtersFrom = function(x, y) { // https://github.com/gorhill/uBlock/issues/1545 // Network filter candidates from all other elements found at point (x, y). if ( typeof x === 'number' ) { - var attrName = vAPI.sessionId + '-clickblind'; + var attrName = pickerRoot.id + '-clickblind'; var previous; elem = first; while ( elem !== null ) { @@ -1345,6 +1345,11 @@ var stopPicker = function() { return; } + // https://github.com/gorhill/uBlock/issues/2060 + if ( vAPI.userCSS ) { + vAPI.userCSS.remove(pickerStyle.textContent); + } + window.removeEventListener('scroll', onScrolled, true); pickerRoot.contentWindow.removeEventListener('keydown', onKeyPressed, true); taCandidate.removeEventListener('input', onCandidateChanged); @@ -1496,16 +1501,24 @@ pickerRoot.style.cssText = [ // a dedicated style tag. pickerStyle = document.createElement('style'); pickerStyle.textContent = [ - '#' + vAPI.sessionId + ' {', + '#' + pickerRoot.id + ' {', pickerRoot.style.cssText, '}', - '[' + vAPI.sessionId + '-clickblind] {', + '[' + pickerRoot.id + '-clickblind] {', 'pointer-events: none !important;', '}', '' ].join('\n'); document.documentElement.appendChild(pickerStyle); +// https://github.com/gorhill/uBlock/issues/2060 +if ( vAPI.domFilterer ) { + pickerRoot[vAPI.domFilterer.getExcludeId()] = true; +} +if ( vAPI.userCSS ) { + vAPI.userCSS.add(pickerStyle.textContent); +} + pickerRoot.onload = function() { vAPI.shutdown.add(stopPicker); vAPI.messaging.send(