| Index: include.preload.js |
| diff --git a/include.preload.js b/include.preload.js |
| index 7030adc57c6e779603a247c2ca43f2037cb27dbe..f07382ac0c517b9ad2e2531fbe7aa4430b33c260 100644 |
| --- a/include.preload.js |
| +++ b/include.preload.js |
| @@ -300,58 +300,81 @@ function init(document) |
| shadow.appendChild(document.createElement("shadow")); |
| } |
| - var updateStylesheet = function(reinject) |
| + function addElemHideSelectors(selectors) |
| { |
| - ext.backgroundPage.sendMessage({type: "get-selectors"}, function(selectors) |
| + if (selectors.length == 0) |
| + return; |
| + |
| + if (!style) |
| + { |
| + // Create <style> element lazily, only if we add styles. Add it to |
| + // the shadow DOM if possible. Otherwise fallback to the <head> or |
| + // <html> element. If we have injected a style element before that |
| + // has been removed (the sheet property is null), create a new one. |
| + style = document.createElement("style"); |
| + (shadow || document.head || document.documentElement).appendChild(style); |
| + |
| + // It can happen that the frame already navigated to a different |
| + // document while we were waiting for the background page to respond. |
| + // In that case the sheet property will stay null, after addind the |
| + // <style> element to the shadow DOM. |
| + if (!style.sheet) |
| + return; |
| + |
| + observer = reinjectRulesWhenRemoved(document, style); |
| + } |
| + |
| + // If using shadow DOM, we have to add the ::content pseudo-element |
| + // before each selector, in order to match elements within the |
| + // insertion point. |
| + if (shadow) |
| + selectors = convertSelectorsForShadowDOM(selectors); |
| + |
| + // WebKit (and Blink?) apparently chokes when the selector list in a |
| + // CSS rule is huge. So we split the elemhide selectors into groups. |
| + while (selectors.length > 0) |
| { |
| + var selector = selectors.splice(0, SELECTOR_GROUP_SIZE).join(", "); |
| + style.sheet.addRule(selector, "display: none !important;"); |
| + } |
| + }; |
| + |
| + var updateStylesheet = function(propertyFilters) |
|
kzar
2015/11/30 17:57:32
I deliberately added a typo in the propertFilters
kzar
2015/12/01 10:46:04
OK I think I understand now, this function is only
|
| + { |
| + var selectors = null; |
| + var CSSPropertyFiltersLoaded = false; |
| + |
| + var checkLoaded = function() |
| + { |
| + if (!selectors || !CSSPropertyFiltersLoaded) |
| + return; |
| + |
| if (observer) |
| - { |
| observer.disconnect(); |
| - observer = null; |
| - } |
| + observer = null; |
| if (style && style.parentElement) |
| - { |
| style.parentElement.removeChild(style); |
| - style = null; |
| - } |
| + style = null; |
| - if (selectors.length > 0) |
| - { |
| - // Create <style> element lazily, only if we add styles. Add it to |
| - // the shadow DOM if possible. Otherwise fallback to the <head> or |
| - // <html> element. If we have injected a style element before that |
| - // has been removed (the sheet property is null), create a new one. |
| - style = document.createElement("style"); |
| - (shadow || document.head || document.documentElement).appendChild(style); |
| - |
| - // It can happen that the frame already navigated to a different |
| - // document while we were waiting for the background page to respond. |
| - // In that case the sheet property will stay null, after adding the |
| - // <style> element to the shadow DOM. |
| - if (style.sheet) |
| - { |
| - // If using shadow DOM, we have to add the ::content pseudo-element |
| - // before each selector, in order to match elements within the |
| - // insertion point. |
| - if (shadow) |
| - selectors = convertSelectorsForShadowDOM(selectors); |
| - |
| - // WebKit (and Blink?) apparently chokes when the selector list in a |
| - // CSS rule is huge. So we split the elemhide selectors into groups. |
| - for (var i = 0; selectors.length > 0; i++) |
| - { |
| - var selector = selectors.splice(0, SELECTOR_GROUP_SIZE).join(", "); |
| - style.sheet.insertRule(selector + " { display: none !important; }", i); |
| - } |
| - } |
| + addElemHideSelectors(selectors); |
| + propertyFilters.apply(); |
| + }; |
| - observer = reinjectRulesWhenRemoved(document, style); |
| - } |
| + ext.backgroundPage.sendMessage({type: "get-selectors"}, function(response) |
| + { |
| + selectors = response; |
| + checkLoaded(); |
| + }); |
| + |
| + propertyFilters.load(function() |
| + { |
| + CSSPropertyFiltersLoaded = true; |
| + checkLoaded(); |
| }); |
| }; |
| - updateStylesheet(); |
| + ext.backgroundPage.sendMessage({type: "get-selectors"}, addElemHideSelectors); |
|
Sebastian Noack
2015/12/10 10:30:49
Any reason we use different logic on initilization
kzar
2015/12/10 15:16:20
No reason that I know of, Done.
|
| document.addEventListener("error", function(event) |
| { |
| @@ -391,11 +414,16 @@ function init(document) |
| } |
| }, true); |
| - return updateStylesheet; |
| + if (window.document == document) |
|
Sebastian Noack
2015/12/10 10:30:49
Why don't you just put this code below, outside th
kzar
2015/12/10 15:16:20
Done.
|
| + { |
| + window.updateStylesheet = updateStylesheet.bind( |
| + null, new CSSPropertyFilters(window, addElemHideSelectors) |
| + ); |
| + } |
| } |
| if (document instanceof HTMLDocument) |
| { |
| checkSitekey(); |
| - window.updateStylesheet = init(document); |
| + init(document); |
| } |