Index: lib/contentFiltering.js |
=================================================================== |
--- a/lib/contentFiltering.js |
+++ b/lib/contentFiltering.js |
@@ -15,17 +15,18 @@ |
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
*/ |
/** @module contentFiltering */ |
"use strict"; |
const {RegExpFilter} = require("../adblockpluscore/lib/filterClasses"); |
-const {ElemHide, createStyleSheet} = require("../adblockpluscore/lib/elemHide"); |
+const {ElemHide, createStyleSheet, |
+ rulesFromStyleSheet} = require("../adblockpluscore/lib/elemHide"); |
const {ElemHideEmulation} = require("../adblockpluscore/lib/elemHideEmulation"); |
const {filterNotifier} = require("../adblockpluscore/lib/filterNotifier"); |
const {Snippets, compileScript} = require("../adblockpluscore/lib/snippets"); |
const {checkWhitelisted} = require("./whitelisting"); |
const {extractHostFromFrame} = require("./url"); |
const {port} = require("./messaging"); |
const {HitLogger, logRequest} = require("./hitLogger"); |
const info = require("info"); |
@@ -92,22 +93,19 @@ |
browser.tabs.removeCSS(tabId, { |
code: styleSheet, |
cssOrigin: "user", |
frameId, |
matchAboutBlank: true |
}); |
} |
-function updateFrameStyles(tabId, frameId, selectors, groupName, appendOnly) |
+function updateFrameStyles(tabId, frameId, styleSheet, groupName = "standard", |
+ appendOnly = false) |
{ |
- let styleSheet = ""; |
- if (selectors.length > 0) |
- styleSheet = createStyleSheet(selectors); |
- |
let frame = ext.getFrame(tabId, frameId); |
if (!frame) |
return false; |
if (!frame.injectedStyleSheets) |
frame.injectedStyleSheets = new Map(); |
let oldStyleSheet = frame.injectedStyleSheets.get(groupName); |
@@ -189,17 +187,17 @@ |
// tabs.insertCSS for why we catch any error here and simply |
// return a rejected promise. |
return Promise.reject(error); |
} |
} |
port.on("content.applyFilters", (message, sender) => |
{ |
- let selectors = []; |
+ let styleSheet = {code: "", selectors: []}; |
let emulatedPatterns = []; |
let trace = HitLogger.hasListener(sender.page.id); |
let inline = !userStyleSheetsSupported; |
let {elemhide, snippets} = message.filterTypes || |
{elemhide: true, snippets: true}; |
if (!checkWhitelisted(sender.page, sender.frame, null, |
@@ -226,40 +224,50 @@ |
} |
} |
if (elemhide && !checkWhitelisted(sender.page, sender.frame, null, |
RegExpFilter.typeMap.ELEMHIDE)) |
{ |
let specificOnly = checkWhitelisted(sender.page, sender.frame, null, |
RegExpFilter.typeMap.GENERICHIDE); |
- selectors = ElemHide.getSelectorsForDomain(docDomain, specificOnly); |
+ styleSheet = ElemHide.generateStyleSheetForDomain(docDomain, specificOnly, |
+ trace); |
for (let filter of ElemHideEmulation.getRulesForDomain(docDomain)) |
emulatedPatterns.push({selector: filter.selector, text: filter.text}); |
} |
} |
if (!inline && !updateFrameStyles(sender.page.id, sender.frame.id, |
- selectors, "standard")) |
+ styleSheet.code)) |
{ |
inline = true; |
} |
let response = {trace, inline, emulatedPatterns}; |
- if (trace || inline) |
- response.selectors = selectors; |
+ |
+ if (inline) |
+ response.rules = [...rulesFromStyleSheet(styleSheet.code)]; |
+ |
+ if (trace) |
+ response.selectors = styleSheet.selectors; |
return response; |
}); |
port.on("content.injectSelectors", (message, sender) => |
{ |
- updateFrameStyles(sender.page.id, sender.frame.id, message.selectors, |
- message.groupName, message.appendOnly); |
+ let styleSheet = createStyleSheet(message.selectors); |
+ if (!userStyleSheetsSupported || |
+ !updateFrameStyles(sender.page.id, sender.frame.id, styleSheet, |
+ message.groupName, message.appendOnly)) |
+ { |
+ return [...rulesFromStyleSheet(styleSheet)]; |
+ } |
}); |
fetch(browser.extension.getURL("/snippets.js"), {cache: "no-cache"}) |
.then(response => response.ok ? response.text() : "") |
.then(text => |
{ |
snippetsLibrarySource = text; |
}); |