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

Unified Diff: include.postload.js

Issue 4829486721794048: Issue 700 - Generate filters based on the style attribute as last resort (Closed)
Patch Set: Rebased and escaped backslashes Created Oct. 30, 2014, 4:05 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 | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include.postload.js
===================================================================
--- a/include.postload.js
+++ b/include.postload.js
@@ -24,6 +24,11 @@
var clickHideFiltersDialog = null;
var lastRightClickEvent = null;
+function quote(value)
+{
+ return '"' + value.replace(/(["\\])/g, "\\$1") + '"';
+}
+
function supportsShadowRoot(element)
{
if (!("createShadowRoot" in element))
@@ -309,7 +314,7 @@
return;
var target = e.target;
- while (target.parentNode && !(target.id || target.className || target.src))
+ while (target.parentNode && !(target.id || target.className || target.src || /:.+:/.test(target.getAttribute("style"))))
target = target.parentNode;
if (target == document.documentElement || target == document.body)
target = null;
@@ -381,33 +386,50 @@
clickHideFilters = new Array();
selectorList = new Array();
+
+ var addSelector = function(selector)
+ {
+ clickHideFilters.push(document.domain + "##" + selector);
+ selectorList.push(selector);
+ };
+
if (elementId)
- {
- clickHideFilters.push(document.domain + "###" + elementId);
- selectorList.push("#" + elementId);
- }
+ addSelector("#" + elementId);
+
if (elementClasses && elementClasses.length > 0)
{
- var selector = elementClasses.map(function(elClass)
- {
- return "." + elClass.replace(/([^\w-])/, "\\$1");
- }).join("");
+ var selector = "";
- clickHideFilters.push(document.domain + "##" + selector);
- selectorList.push(selector);
+ for (var i = 0; i < elt.classList.length; i++)
Thomas Greiner 2014/11/04 09:53:21 It's certainly not wrong to use elt.classList here
Sebastian Noack 2014/11/04 14:51:07 The patch has already been merged, but I might fil
Thomas Greiner 2014/11/04 15:15:53 That's totally fine with me. Looks like the origin
Sebastian Noack 2014/11/04 15:44:54 For reference, https://issues.adblockplus.org/tick
+ selector += "." + elt.classList[i].replace(/([^\w-])/, "\\$1");
Wladimir Palant 2014/11/03 18:11:33 Somehow I feel that changing Array.map() into a lo
+
+ addSelector(selector);
}
+
if (url)
{
clickHideFilters.push(url.replace(/^[\w\-]+:\/+(?:www\.)?/, "||"));
- selectorList.push('[src="' + elt.getAttribute("src") + '"]');
+
+ var src = elt.getAttribute("src");
+ if (src)
+ selectorList.push('[src=' + quote(src) + ']');
+ }
+
+ // restore the original style, before generating the fallback filter that
+ // will include the style, and to prevent highlightElements from saving those
+ unhighlightElement(currentElement);
+
+ // as last resort, create a filter based on inline styles
+ if (clickHideFilters.length == 0)
+ {
+ var style = elt.getAttribute("style");
+ if (style)
+ addSelector(elt.localName + '[style=' + quote(style) + ']');
}
// Show popup
clickHide_showDialog(e.clientX, e.clientY, clickHideFilters);
- // Highlight the unlucky elements
- // Restore currentElement's box-shadow and bgcolor so that highlightElements won't save those
- unhighlightElement(currentElement);
// Highlight the elements specified by selector in yellow
highlightElements(selectorList.join(","));
// Now, actually highlight the element the user clicked on in red
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld