diff --git a/src/js/contentscript-end.js b/src/js/contentscript-end.js index cc383238d..6d92b137e 100644 --- a/src/js/contentscript-end.js +++ b/src/js/contentscript-end.js @@ -19,7 +19,7 @@ Home: https://github.com/gorhill/uBlock */ -/* global vAPI */ +/* global vAPI, HTMLDocument */ /******************************************************************************/ @@ -62,7 +62,35 @@ var messager = vAPI.messaging.channel('contentscript-end.js'); /******************************************************************************/ -// ABP cosmetic filters +// https://github.com/gorhill/uBlock/issues/789 +// Be sure that specific cosmetic filters are still applied. +// Executed once, then flushed from memory. + +(function() { + // Were there specific cosmetic filters? + var text = vAPI.specificHideStyleText; + if ( typeof text !== 'string' ) { + return; + } + vAPI.specificHideStyleText = undefined; + // Is our style tag still available? + var style = document.getElementById('ublock-preload-1ae7a5f130fc79b4fdb8a4272d9426b5'); + if ( style !== null ) { + return; + } + // Put it back + style = document.createElement('style'); + style.setAttribute('id', 'ublock-preload-1ae7a5f130fc79b4fdb8a4272d9426b5'); + style.appendChild(document.createTextNode(text + '\n{display:none !important;}')); + var parent = document.head || document.documentElement; + if ( parent ) { + parent.appendChild(style); + } +})(); + +/******************************************************************************/ + +// Cosmetic filters (function() { if ( vAPI.skipCosmeticFiltering ) { @@ -78,15 +106,6 @@ var messager = vAPI.messaging.channel('contentscript-end.js'); var contextNodes = [document]; var nullArray = { push: function(){} }; - var domLoaded = function() { - idsFromNodeList(document.querySelectorAll('[id]')); - classesFromNodeList(document.querySelectorAll('[class]')); - retrieveGenericSelectors(); - - // Flush dead code from memory (does this work?) - domLoaded = null; - }; - var retrieveGenericSelectors = function() { var selectors = classSelectors !== null ? Object.keys(classSelectors) : []; if ( idSelectors !== null ) { @@ -430,7 +449,9 @@ var messager = vAPI.messaging.channel('contentscript-end.js'); // Start cosmetic filtering. - domLoaded(); + idsFromNodeList(document.querySelectorAll('[id]')); + classesFromNodeList(document.querySelectorAll('[class]')); + retrieveGenericSelectors(); // Below this point is the code which takes care to observe changes in // the page and to add if needed relevant CSS rules as a result of the diff --git a/src/js/contentscript-start.js b/src/js/contentscript-start.js index 996b749f4..42357c8df 100644 --- a/src/js/contentscript-start.js +++ b/src/js/contentscript-start.js @@ -20,7 +20,7 @@ */ /* jshint multistr: true */ -/* global vAPI */ +/* global vAPI, HTMLDocument */ /******************************************************************************/ @@ -71,31 +71,32 @@ var cosmeticFilters = function(details) { style.setAttribute('id', 'ublock-preload-1ae7a5f130fc79b4fdb8a4272d9426b5'); var donthide = details.cosmeticDonthide; var hide = details.cosmeticHide; + var i; if ( donthide.length !== 0 ) { donthide = donthide.length !== 1 ? donthide.join(',\n') : donthide[0]; donthide = donthide.split(',\n'); - var i = donthide.length; + i = donthide.length; while ( i-- ) { donthideCosmeticFilters[donthide[i]] = true; } - // https://github.com/gorhill/uBlock/issues/143 - if ( hide.length !== 0 ) { - hide = hide.length !== 1 ? hide.join(',\n') : hide[0]; - hide = hide.split(',\n'); - i = hide.length; - var selector; - while ( i-- ) { - selector = hide[i]; - if ( donthideCosmeticFilters[selector] ) { - hide.splice(i, 1); - } else { - hideCosmeticFilters[selector] = true; - } + } + // https://github.com/gorhill/uBlock/issues/143 + if ( hide.length !== 0 ) { + hide = hide.length !== 1 ? hide.join(',\n') : hide[0]; + hide = hide.split(',\n'); + i = hide.length; + var selector; + while ( i-- ) { + selector = hide[i]; + if ( donthideCosmeticFilters[selector] ) { + hide.splice(i, 1); + } else { + hideCosmeticFilters[selector] = true; } } } if ( hide.length !== 0 ) { - var text = hide.join(',\n'); + var text = vAPI.specificHideStyleText = hide.join(',\n'); hideElements(text); // The linefeed before the style block is very important: do not remove! style.appendChild(document.createTextNode(text + '\n{display:none !important;}'));