From ab24f725ce9df85b88274c89104c85f6c072af99 Mon Sep 17 00:00:00 2001 From: gorhill Date: Tue, 15 Sep 2015 09:51:22 -0400 Subject: [PATCH] select optimal `hideElements` depending on whether shadow DOM is supported --- src/js/contentscript-end.js | 87 +++++++++++++++++++------------------ 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/src/js/contentscript-end.js b/src/js/contentscript-end.js index b4cd920bd..776862fa2 100644 --- a/src/js/contentscript-end.js +++ b/src/js/contentscript-end.js @@ -443,55 +443,58 @@ var uBlockCollapser = (function() { //console.debug('µBlock> generic cosmetic filters: injecting %d CSS rules:', selectors.length, text); }; - var hideElements = function(selectors) { - // https://github.com/chrisaljoudi/uBlock/issues/207 - // Do not call querySelectorAll() using invalid CSS selectors - if ( selectors.length === 0 ) { - return; - } + var hideElements = (function() { if ( document.body === null ) { - return; + return function() {}; } - var elems = document.querySelectorAll(selectors); - var i = elems.length; - if ( i === 0 ) { - return; - } - // https://github.com/chrisaljoudi/uBlock/issues/158 - // Using CSSStyleDeclaration.setProperty is more reliable if ( document.body.shadowRoot === undefined ) { - while ( i-- ) { - elems[i].style.setProperty('display', 'none', 'important'); - } - return; + return function(selectors) { + // https://github.com/chrisaljoudi/uBlock/issues/207 + // Do not call querySelectorAll() using invalid CSS selectors + if ( selectors.length === 0 ) { return; } + var elems = document.querySelectorAll(selectors); + var i = elems.length; + if ( i === 0 ) { return; } + // https://github.com/chrisaljoudi/uBlock/issues/158 + // Using CSSStyleDeclaration.setProperty is more reliable + while ( i-- ) { + elems[i].style.setProperty('display', 'none', 'important'); + } + }; } - // https://github.com/gorhill/uBlock/issues/435 - // Using shadow content so that we do not have to modify style - // attribute. - var sessionId = vAPI.sessionId; - var elem, shadow; - while ( i-- ) { - elem = elems[i]; - shadow = elem.shadowRoot; - // https://www.chromestatus.com/features/4668884095336448 - // "Multiple shadow roots is being deprecated." - if ( shadow !== null ) { - if ( shadow.className !== sessionId ) { + return function(selectors) { + if ( selectors.length === 0 ) { return; } + var elems = document.querySelectorAll(selectors); + var i = elems.length; + if ( i === 0 ) { return; } + // https://github.com/gorhill/uBlock/issues/435 + // Using shadow content so that we do not have to modify style + // attribute. + var sessionId = vAPI.sessionId; + var elem, shadow; + while ( i-- ) { + elem = elems[i]; + shadow = elem.shadowRoot; + // https://www.chromestatus.com/features/4668884095336448 + // "Multiple shadow roots is being deprecated." + if ( shadow !== null ) { + if ( shadow.className !== sessionId ) { + elem.style.setProperty('display', 'none', 'important'); + } + continue; + } + // https://github.com/gorhill/uBlock/pull/555 + // Not all nodes can be shadowed: + // https://github.com/w3c/webcomponents/issues/102 + try { + shadow = elem.createShadowRoot(); + shadow.className = sessionId; + } catch (ex) { elem.style.setProperty('display', 'none', 'important'); } - continue; } - // https://github.com/gorhill/uBlock/pull/555 - // Not all nodes can be shadowed: - // https://github.com/w3c/webcomponents/issues/102 - try { - shadow = elem.createShadowRoot(); - shadow.className = sessionId; - } catch (ex) { - elem.style.setProperty('display', 'none', 'important'); - } - } - }; + }; + })(); // Extract and return the staged nodes which (may) match the selectors.