Index: lib/cssInjection.js |
=================================================================== |
--- a/lib/cssInjection.js |
+++ b/lib/cssInjection.js |
@@ -24,16 +24,40 @@ |
const {ElemHideEmulation} = require("elemHideEmulation"); |
const {checkWhitelisted} = require("whitelisting"); |
const {extractHostFromFrame} = require("url"); |
const {port} = require("messaging"); |
const devtools = require("devtools"); |
const userStyleSheetsSupported = "extensionTypes" in browser && |
"CSSOrigin" in browser.extensionTypes; |
+const selectorGroupSize = 1024; |
+ |
+function* splitSelectors(selectors) |
+{ |
+ // Chromium's Blink engine supports only up to 8,192 selectors; more |
+ // specifically, it ignores any selectors that start at index 8192 or beyond |
+ // in the list of plain selectors. In order to avoid spilling outside of this |
+ // range, we simply add multiple rules in groups of up to 1,024 selectors |
+ // each. |
+ // See issue #6298 and https://crbug.com/804179 |
+ for (let i = 0; i < selectors.length; i += selectorGroupSize) |
+ yield selectors.slice(i, i + selectorGroupSize); |
+} |
+ |
+function* createRules(selectors) |
+{ |
+ for (let selectorGroup of splitSelectors(selectors)) |
+ yield selectorGroup.join(", ") + " {display: none !important;}"; |
+} |
+ |
+function createStyleSheet(selectors) |
+{ |
+ return Array.from(createRules(selectors)).join("\n"); |
+} |
function addStyleSheet(tabId, frameId, styleSheet) |
{ |
browser.tabs.insertCSS(tabId, { |
code: styleSheet, |
cssOrigin: "user", |
frameId, |
matchAboutBlank: true, |
@@ -50,17 +74,17 @@ |
matchAboutBlank: true |
}); |
} |
function updateFrameStyles(tabId, frameId, selectors, groupName) |
{ |
let styleSheet = null; |
if (selectors.length > 0) |
- styleSheet = selectors.join(", ") + "{display: none !important;}"; |
+ styleSheet = createStyleSheet(selectors); |
let frame = ext.getFrame(tabId, frameId); |
if (!frame.injectedStyleSheets) |
frame.injectedStyleSheets = new Map(); |
let oldStyleSheet = frame.injectedStyleSheets.get(groupName); |
// Ideally we would compare the old and new style sheets and skip this code |