| Index: lib/content/elemHideEmulation.js |
| =================================================================== |
| --- a/lib/content/elemHideEmulation.js |
| +++ b/lib/content/elemHideEmulation.js |
| @@ -22,33 +22,33 @@ |
| let MIN_INVOCATION_INTERVAL = 3000; |
| const MAX_SYNCHRONOUS_PROCESSING_TIME = 50; |
| const abpSelectorRegexp = /:-abp-([\w-]+)\(/i; |
| function getCachedPropertyValue(object, name, defaultValueFunc = () => {}) |
| { |
| let value = object[name]; |
| - if (typeof value == "undefined") |
| + if (typeof value === "undefined") |
| Object.defineProperty(object, name, {value: value = defaultValueFunc()}); |
| return value; |
| } |
| /** Return position of node from parent. |
| * @param {Node} node the node to find the position of. |
| * @return {number} One-based index like for :nth-child(), or 0 on error. |
| */ |
| function positionInParent(node) |
| { |
| return indexOf(node.parentNode.children, node) + 1; |
| } |
| function makeSelector(node, selector = "") |
| { |
| - if (node == null) |
| + if (!node) |
| return null; |
| if (!node.parentElement) |
| { |
| let newSelector = ":root"; |
| if (selector) |
| newSelector += " > " + selector; |
| return newSelector; |
| } |
| @@ -67,34 +67,34 @@ |
| function parseSelectorContent(content, startIndex) |
| { |
| let parens = 1; |
| let quote = null; |
| let i = startIndex; |
| for (; i < content.length; i++) |
| { |
| let c = content[i]; |
| - if (c == "\\") |
| + if (c === "\\") |
| { |
| // Ignore escaped characters |
| i++; |
| } |
| else if (quote) |
| { |
| - if (c == quote) |
| + if (c === quote) |
| quote = null; |
| } |
| - else if (c == "'" || c == '"') |
| + else if (c === "'" || c === '"') |
| quote = c; |
| - else if (c == "(") |
| + else if (c === "(") |
| parens++; |
| - else if (c == ")") |
| + else if (c === ")") |
| { |
| parens--; |
| - if (parens == 0) |
| + if (parens === 0) |
| break; |
| } |
| } |
| if (parens > 0) |
| return null; |
| return {text: content.substring(startIndex, i), end: i}; |
| } |
| @@ -150,25 +150,25 @@ |
| * Query selector. If it is relative, will try :scope. |
| * @param {Node} subtree the element to query selector |
| * @param {string} selector the selector to query |
| * @param {bool} [all=false] true to perform querySelectorAll() |
| * @returns {?(Node|NodeList)} result of the query. null in case of error. |
| */ |
| function scopedQuerySelector(subtree, selector, all) |
| { |
| - if (selector[0] == ">") |
| + if (selector[0] === ">") |
| { |
| selector = ":scope" + selector; |
| if (scopeSupported) |
| { |
| return all ? subtree.querySelectorAll(selector) : |
| subtree.querySelector(selector); |
| } |
| - if (scopeSupported == null) |
| + if (scopeSupported === null) |
| return tryQuerySelector(subtree, selector, all); |
| return null; |
| } |
| return all ? subtree.querySelectorAll(selector) : |
| subtree.querySelector(selector); |
| } |
| function scopedQuerySelectorAll(subtree, selector) |
| @@ -350,18 +350,18 @@ |
| } |
| } |
| } |
| }; |
| function PropsSelector(propertyExpression) |
| { |
| let regexpString; |
| - if (propertyExpression.length >= 2 && propertyExpression[0] == "/" && |
| - propertyExpression[propertyExpression.length - 1] == "/") |
| + if (propertyExpression.length >= 2 && propertyExpression[0] === "/" && |
| + propertyExpression[propertyExpression.length - 1] === "/") |
| { |
| regexpString = propertyExpression.slice(1, -1) |
| .replace("\\7B ", "{").replace("\\7D ", "}"); |
| } |
| else |
| regexpString = filterToRegExp(propertyExpression); |
| this._regexp = new RegExp(regexpString, "i"); |
| @@ -377,17 +377,17 @@ |
| for (let subSelector of style.subSelectors) |
| { |
| if (subSelector.startsWith("*") && |
| !incompletePrefixRegexp.test(prefix)) |
| { |
| subSelector = subSelector.substr(1); |
| } |
| let idx = subSelector.lastIndexOf("::"); |
| - if (idx != -1) |
| + if (idx !== -1) |
| subSelector = subSelector.substr(0, idx); |
| yield prefix + subSelector; |
| } |
| }, |
| *getSelectors(prefix, subtree, styles) |
| { |
| for (let selector of this.findPropsSelectors(styles, prefix, this._regexp)) |
| @@ -482,17 +482,17 @@ |
| let types = new Set(); |
| for (let mutation of mutations) |
| { |
| types.add(mutation.type); |
| // There are only 3 types of mutations: "attributes", "characterData", and |
| // "childList". |
| - if (types.size == 3) |
| + if (types.size === 3) |
| break; |
| } |
| return types; |
| } |
| function filterPatterns(patterns, {stylesheets, mutations}) |
| { |
| @@ -527,33 +527,33 @@ |
| this.useInlineStyles = true; |
| } |
| ElemHideEmulation.prototype = { |
| isSameOrigin(stylesheet) |
| { |
| try |
| { |
| - return new URL(stylesheet.href).origin == this.document.location.origin; |
| + return new URL(stylesheet.href).origin === this.document.location.origin; |
| } |
| catch (e) |
| { |
| // Invalid URL, assume that it is first-party. |
| return true; |
| } |
| }, |
| /** Parse the selector |
| * @param {string} selector the selector to parse |
| * @return {Array} selectors is an array of objects, |
| * or null in case of errors. |
| */ |
| parseSelector(selector) |
| { |
| - if (selector.length == 0) |
| + if (selector.length === 0) |
| return []; |
| let match = abpSelectorRegexp.exec(selector); |
| if (!match) |
| return [new PlainSelector(selector)]; |
| let selectors = []; |
| if (match.index > 0) |
| @@ -563,43 +563,43 @@ |
| let content = parseSelectorContent(selector, startIndex); |
| if (!content) |
| { |
| console.error(new SyntaxError("Failed to parse Adblock Plus " + |
| `selector ${selector} ` + |
| "due to unmatched parentheses.")); |
| return null; |
| } |
| - if (match[1] == "properties") |
| + if (match[1] === "properties") |
| selectors.push(new PropsSelector(content.text)); |
| - else if (match[1] == "has") |
| + else if (match[1] === "has") |
| { |
| let hasSelectors = this.parseSelector(content.text); |
| - if (hasSelectors == null) |
| + if (hasSelectors === null) |
| return null; |
| selectors.push(new HasSelector(hasSelectors)); |
| } |
| - else if (match[1] == "contains") |
| + else if (match[1] === "contains") |
| selectors.push(new ContainsSelector(content.text)); |
| else |
| { |
| // this is an error, can't parse selector. |
| console.error(new SyntaxError("Failed to parse Adblock Plus " + |
| `selector ${selector}, invalid ` + |
| `pseudo-class :-abp-${match[1]}().`)); |
| return null; |
| } |
| let suffix = this.parseSelector(selector.substr(content.end + 1)); |
| - if (suffix == null) |
| + if (suffix === null) |
| return null; |
| selectors.push(...suffix); |
| - if (selectors.length == 1 && selectors[0] instanceof ContainsSelector) |
| + if (selectors.length === 1 && selectors[0] instanceof ContainsSelector) |
| { |
| console.error(new SyntaxError("Failed to parse Adblock Plus " + |
| `selector ${selector}, can't ` + |
| "have a lonely :-abp-contains().")); |
| return null; |
| } |
| return selectors; |
| }, |
| @@ -666,17 +666,17 @@ |
| continue; |
| } |
| if (!rules) |
| continue; |
| for (let rule of rules) |
| { |
| - if (rule.type != rule.STYLE_RULE) |
| + if (rule.type !== rule.STYLE_RULE) |
| continue; |
| cssStyles.push(stringifyStyle(rule)); |
| } |
| } |
| let pattern = null; |
| let generator = null; |
| @@ -688,29 +688,29 @@ |
| if (!pattern) |
| { |
| if (!patterns.length) |
| { |
| if (selectors.length > 0) |
| this.addSelectorsFunc(selectors, selectorFilters); |
| if (elements.length > 0) |
| this.hideElemsFunc(elements, elementFilters); |
| - if (typeof done == "function") |
| + if (typeof done === "function") |
| done(); |
| return; |
| } |
| pattern = patterns.shift(); |
| generator = evaluate(pattern.selectors, 0, "", |
| this.document, cssStyles); |
| } |
| for (let selector of generator) |
| { |
| - if (selector != null) |
| + if (selector !== null) |
| { |
| if (!this.useInlineStyles) |
| { |
| selectors.push(selector); |
| selectorFilters.push(pattern.text); |
| } |
| else |
| { |
| @@ -807,17 +807,17 @@ |
| { |
| let params = Object.assign({}, this._scheduledProcessing); |
| this._filteringInProgress = true; |
| this._scheduledProcessing = null; |
| this._addSelectors(params.stylesheets, params.mutations, completion); |
| }, |
| MIN_INVOCATION_INTERVAL - (performance.now() - this._lastInvocation)); |
| } |
| - else if (this.document.readyState == "loading") |
| + else if (this.document.readyState === "loading") |
| { |
| this._scheduledProcessing = {stylesheets, mutations}; |
| let handler = () => |
| { |
| this.document.removeEventListener("DOMContentLoaded", handler); |
| let params = Object.assign({}, this._scheduledProcessing); |
| this._filteringInProgress = true; |
| this._scheduledProcessing = null; |
| @@ -845,17 +845,17 @@ |
| }, |
| apply(patterns) |
| { |
| this.patterns = []; |
| for (let pattern of patterns) |
| { |
| let selectors = this.parseSelector(pattern.selector); |
| - if (selectors != null && selectors.length > 0) |
| + if (selectors !== null && selectors.length > 0) |
| this.patterns.push(new Pattern(selectors, pattern.text)); |
| } |
| if (this.patterns.length > 0) |
| { |
| this.queueFiltering(); |
| this.observer.observe( |
| this.document, |