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

Unified Diff: include.preload.js

Issue 29401596: Issue 5094 - Implement support for :has() in chrome extension (Closed) Base URL: https://hg.adblockplus.org/adblockpluschrome/
Patch Set: Properly implement the tracer. Improve the element hiding logic. Created April 5, 2017, 9:07 a.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 | « dependencies ('k') | lib/filterValidation.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
@@ -122,16 +122,44 @@
{
if (/^(?!https?:)[\w-]+:/i.test(urls[i]))
urls.splice(i--, 1);
}
return urls;
}
+/* collapse the element and ensure it stays that way */
Sebastian Noack 2017/04/05 14:58:49 If you feel that this function needs to be documen
+function collapseElement(element)
Sebastian Noack 2017/04/05 14:58:49 "element collapsing" is a special term in the cont
+{
+ function doCollapse(element)
+ {
+ let propertyName = "display";
+ let propertyValue = "none";
+ if (element.localName == "frame")
+ {
+ propertyName = "visibility";
+ propertyValue = "hidden";
+ }
+
+ if (element.style.getPropertyValue(propertyName) != propertyValue ||
+ element.style.getPropertyPriority(propertyName) != "important")
+ element.style.setProperty(propertyName, propertyValue, "important");
+ }
+
+ doCollapse(element);
+
+ new MutationObserver(doCollapse).observe(
+ element, {
+ attributes: true,
+ attributeFilter: ["style"]
+ }
+ );
+}
+
function checkCollapse(element)
{
let mediatype = typeMap.get(element.localName);
if (!mediatype)
return;
let urls = getURLsFromElement(element);
if (urls.length == 0)
@@ -142,41 +170,19 @@
type: "filters.collapse",
urls,
mediatype,
baseURL: document.location.href
},
collapse =>
{
- function collapseElement()
- {
- let propertyName = "display";
- let propertyValue = "none";
- if (element.localName == "frame")
- {
- propertyName = "visibility";
- propertyValue = "hidden";
- }
-
- if (element.style.getPropertyValue(propertyName) != propertyValue ||
- element.style.getPropertyPriority(propertyName) != "important")
- element.style.setProperty(propertyName, propertyValue, "important");
- }
-
if (collapse)
{
- collapseElement();
-
- new MutationObserver(collapseElement).observe(
- element, {
- attributes: true,
- attributeFilter: ["style"]
- }
- );
+ collapseElement(element);
}
}
);
}
function checkSitekey()
{
let attr = document.documentElement.getAttribute("data-adblockkey");
@@ -205,16 +211,29 @@
{
if (document.readyState != "loading")
this.checkNodes([document], selectors, filters);
this.selectors.push(...selectors);
this.filters.push(...filters);
},
+ hideElements(filters)
Sebastian Noack 2017/04/05 14:58:49 The name of this function isn't optimal. It doesn'
hub 2017/04/06 10:15:20 ok
+ {
+ let matchedSelectors = [];
+ for (let filter of filters)
+ matchedSelectors.push(filter.replace(/^.*?##/, ""));
Sebastian Noack 2017/04/05 14:58:49 This logic is redundant with code in checkNodes().
hub 2017/04/06 10:15:20 Acknowledged.
+
+ if (document.readyState != "loading")
Sebastian Noack 2017/04/05 14:58:49 This check seems wrong. ElementHidingTracer.addSel
hub 2017/04/06 10:15:20 Acknowledged.
+ ext.backgroundPage.sendMessage({
+ type: "devtools.traceElemHide",
+ selectors: matchedSelectors
+ });
+ },
+
checkNodes(nodes, selectors, filters)
{
let matchedSelectors = [];
for (let i = 0; i < selectors.length; i++)
{
nodes: for (let node of nodes)
{
@@ -425,17 +444,18 @@
window,
callback =>
{
ext.backgroundPage.sendMessage({
type: "filters.get",
what: "elemhideemulation"
}, callback);
},
- this.addSelectors.bind(this)
+ this.addSelectors.bind(this),
+ this.hideElements.bind(this)
);
}
ElemHide.prototype = {
selectorGroupSize: 200,
createShadowTree()
{
// Use Shadow DOM if available as to not mess with with web pages that
@@ -536,16 +556,25 @@
this.style.sheet.insertRule(selector + "{display: none !important;}",
this.style.sheet.cssRules.length);
}
if (this.tracer)
this.tracer.addSelectors(selectors, filters || selectors);
},
+ hideElements(elements, filters)
+ {
+ for (let element of elements)
+ collapseElement(element);
+
+ if (this.tracer)
+ this.tracer.hideElements(filters);
+ },
+
apply()
{
ext.backgroundPage.sendMessage({type: "get-selectors"}, response =>
{
if (this.tracer)
this.tracer.disconnect();
this.tracer = null;
« no previous file with comments | « dependencies ('k') | lib/filterValidation.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld