Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: include.preload.js

Issue 29893559: Issue 6999 - Generate style sheets in background page (Closed) Base URL: https://hg.adblockplus.org/adblockpluschrome/
Patch Set: Updated implementation Created Sept. 28, 2018, 1:23 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | lib/contentFiltering.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include.preload.js
===================================================================
--- a/include.preload.js
+++ b/include.preload.js
@@ -402,48 +402,60 @@
this.elemHideEmulation = new ElemHideEmulation(
() => {},
this.hideElements.bind(this)
);
}
ContentFiltering.prototype = {
selectorGroupSize: 1024,
- addSelectorsInline(selectors, groupName, appendOnly = false)
+ getStyleElement(groupName)
{
let style = this.styles.get(groupName);
+ if (style)
+ return style;
- if (style && !appendOnly)
+ // Create <style> element lazily, only if we add styles. Add it 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.
+ let style = document.createElement("style");
+ (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 may stay null, after adding the
+ // <style> element.
+ if (!style.sheet)
+ return null;
+
+ this.styles.set(groupName, style);
+
+ return style;
+ },
+
+ addStyleSheetInline(styleSheet, groupName = "standard")
+ {
+ let style = this.getStyleElement(groupName);
+ if (style)
+ style.textContent = styleSheet;
+ },
+
+ addSelectorsInline(selectors, groupName, appendOnly = false)
+ {
+ let style = this.getStyleElement(groupName);
+ if (!style)
+ return;
+
+ if (!appendOnly)
{
while (style.sheet.cssRules.length > 0)
style.sheet.deleteRule(0);
}
- if (selectors.length == 0)
- return;
-
- if (!style)
- {
- // Create <style> element lazily, only if we add styles. Add it 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");
- (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 may stay null, after adding the
- // <style> element.
- if (!style.sheet)
- return;
-
- this.styles.set(groupName, style);
- }
-
// Chromium's Blink engine supports only up to 8,192 simple selectors, and
// even fewer compound selectors, in a rule. The exact number of selectors
// that would work depends on their sizes (e.g. "#foo .bar" has a
// size of 2). Since we don't know the sizes of the selectors here, we
// simply split them into groups of 1,024, based on the reasonable
// assumption that the average selector won't have a size greater than 8.
// The alternative would be to calculate the sizes of the selectors and
// divide them up accordingly, but this approach is more efficient and has
@@ -517,17 +529,17 @@
this.tracer = null;
if (response.trace)
this.tracer = new ElementHidingTracer();
this.inline = response.inline;
if (this.inline)
- this.addSelectorsInline(response.selectors, "standard");
+ this.addStyleSheetInline(response.styleSheet);
if (this.tracer)
this.tracer.addSelectors(response.selectors);
this.elemHideEmulation.apply(response.emulatedPatterns);
});
}
};
« no previous file with comments | « no previous file | lib/contentFiltering.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld