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

Unified Diff: chrome/content/elemHideEmulation.js

Issue 29423569: Issue 4796 - Use a modern JS engine in the browser tests and convert all files to ECMAScript 6 (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Created April 27, 2017, 11:20 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
Index: chrome/content/elemHideEmulation.js
===================================================================
--- a/chrome/content/elemHideEmulation.js
+++ b/chrome/content/elemHideEmulation.js
@@ -1,26 +1,44 @@
-// We are currently limited to ECMAScript 5 in this file, because it is being
-// used in the browser tests. See https://issues.adblockplus.org/ticket/4796
+/*
+ * This file is part of Adblock Plus <https://adblockplus.org/>,
+ * Copyright (C) 2006-2017 eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
-var propertySelectorRegExp = /\[\-abp\-properties=(["'])([^"']+)\1\]/;
+/* globals filterToRegExp */
+
+"use strict";
+
+let propertySelectorRegExp = /\[-abp-properties=(["'])([^"']+)\1\]/;
function splitSelector(selector)
{
if (selector.indexOf(",") == -1)
return [selector];
- var selectors = [];
- var start = 0;
- var level = 0;
- var sep = "";
+ let selectors = [];
+ let start = 0;
+ let level = 0;
+ let sep = "";
- for (var i = 0; i < selector.length; i++)
+ for (let i = 0; i < selector.length; i++)
{
- var chr = selector[i];
+ let chr = selector[i];
if (chr == "\\") // ignore escaped characters
i++;
else if (chr == sep) // don't split within quoted text
sep = ""; // e.g. [attr=","]
else if (sep == "")
{
if (chr == '"' || chr == "'")
@@ -44,124 +62,123 @@ function splitSelector(selector)
function ElemHideEmulation(window, getFiltersFunc, addSelectorsFunc)
{
this.window = window;
this.getFiltersFunc = getFiltersFunc;
this.addSelectorsFunc = addSelectorsFunc;
}
ElemHideEmulation.prototype = {
- stringifyStyle: function(style)
+ stringifyStyle(style)
{
- var styles = [];
- for (var i = 0; i < style.length; i++)
+ let styles = [];
+ for (let i = 0; i < style.length; i++)
{
- var property = style.item(i);
- var value = style.getPropertyValue(property);
- var priority = style.getPropertyPriority(property);
- styles.push(property + ": " + value + (priority ? " !" + priority : "") + ";");
+ let property = style.item(i);
+ let value = style.getPropertyValue(property);
+ let priority = style.getPropertyPriority(property);
+ styles.push(property + ": " + value + (priority ? " !" + priority : "") +
+ ";");
}
styles.sort();
return styles.join(" ");
},
- isSameOrigin: function(stylesheet)
+ isSameOrigin(stylesheet)
{
try
{
return new URL(stylesheet.href).origin == this.window.location.origin;
}
catch (e)
{
// Invalid URL, assume that it is first-party.
return true;
}
},
- findSelectors: function(stylesheet, selectors, filters)
+ findSelectors(stylesheet, selectors, filters)
{
// Explicitly ignore third-party stylesheets to ensure consistent behavior
// between Firefox and Chrome.
if (!this.isSameOrigin(stylesheet))
return;
- var rules = stylesheet.cssRules;
+ let rules = stylesheet.cssRules;
if (!rules)
return;
- for (var i = 0; i < rules.length; i++)
+ for (let rule of rules)
{
- var rule = rules[i];
if (rule.type != rule.STYLE_RULE)
continue;
- var style = this.stringifyStyle(rule.style);
- for (var j = 0; j < this.patterns.length; j++)
+ let style = this.stringifyStyle(rule.style);
+ for (let pattern of this.patterns)
{
- var pattern = this.patterns[j];
if (pattern.regexp.test(style))
{
- var subSelectors = splitSelector(rule.selectorText);
- for (var k = 0; k < subSelectors.length; k++)
+ let subSelectors = splitSelector(rule.selectorText);
+ for (let subSelector of subSelectors)
{
- var subSelector = subSelectors[k];
selectors.push(pattern.prefix + subSelector + pattern.suffix);
filters.push(pattern.text);
}
}
}
}
},
- addSelectors: function(stylesheets)
+ addSelectors(stylesheets)
{
- var selectors = [];
- var filters = [];
- for (var i = 0; i < stylesheets.length; i++)
- this.findSelectors(stylesheets[i], selectors, filters);
+ let selectors = [];
+ let filters = [];
+ for (let stylesheet of stylesheets)
+ this.findSelectors(stylesheet, selectors, filters);
this.addSelectorsFunc(selectors, filters);
},
- onLoad: function(event)
+ onLoad(event)
{
- var stylesheet = event.target.sheet;
+ let stylesheet = event.target.sheet;
if (stylesheet)
this.addSelectors([stylesheet]);
},
- apply: function()
+ apply()
{
- this.getFiltersFunc(function(patterns)
+ this.getFiltersFunc(patterns =>
{
this.patterns = [];
- for (var i = 0; i < patterns.length; i++)
+ for (let pattern of patterns)
{
- var pattern = patterns[i];
- var match = propertySelectorRegExp.exec(pattern.selector);
+ let match = propertySelectorRegExp.exec(pattern.selector);
if (!match)
continue;
- var propertyExpression = match[2];
- var regexpString;
+ let propertyExpression = match[2];
+ let regexpString;
if (propertyExpression.length >= 2 && propertyExpression[0] == "/" &&
propertyExpression[propertyExpression.length - 1] == "/")
+ {
regexpString = propertyExpression.slice(1, -1)
.replace("\\x7B ", "{").replace("\\x7D ", "}");
+ }
else
regexpString = filterToRegExp(propertyExpression);
this.patterns.push({
text: pattern.text,
regexp: new RegExp(regexpString, "i"),
prefix: pattern.selector.substr(0, match.index),
suffix: pattern.selector.substr(match.index + match[0].length)
});
}
if (this.patterns.length > 0)
{
- var document = this.window.document;
+ let {document} = this.window;
this.addSelectors(document.styleSheets);
document.addEventListener("load", this.onLoad.bind(this), true);
}
- }.bind(this));
+ });
}
};

Powered by Google App Engine
This is Rietveld