| Index: test/browser/elemHideEmulation.js |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/test/browser/elemHideEmulation.js |
| @@ -0,0 +1,229 @@ |
| +/* |
| + * 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/>. |
| + */ |
| + |
| +// 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 |
| + |
| +QUnit.module("Element hiding emulation", |
| +{ |
| + before: function() |
| + { |
| + // The URL object in PhantomJS 2.1.7 does not implement any properties, so |
| + // we need a polyfill. |
| + if (!URL || !("origin" in URL)) |
| + { |
| + var doc = document.implementation.createHTMLDocument(); |
| + var anchor = doc.createElement("a"); |
| + doc.body.appendChild(anchor); |
| + URL = function(url) |
| + { |
| + if (!url) |
| + throw "Invalid URL"; |
| + anchor.href = url; |
| + this.origin = anchor.origin; |
| + }; |
| + } |
| + }, |
| + afterEach: function() |
| + { |
| + var styleElements = document.head.getElementsByTagName("style"); |
| + for (var i = 0; i < styleElements.length; i++) |
| + document.head.removeChild(styleElements[0]); |
| + } |
| +}); |
| + |
| +QUnit.assert.hidden = function(element) |
| +{ |
| + this.equal(getComputedStyle(element).display, "none", |
| + "The element's display property should be set to 'none'"); |
| +}; |
| + |
| +QUnit.assert.visible = function(element) |
| +{ |
| + this.notEqual(getComputedStyle(element).display, "none", |
| + "The element's display property should not be set to 'none'"); |
| +}; |
| + |
| +function findUniqueId() |
| +{ |
| + var id = "elemHideEmulationTest-" + Math.floor(Math.random() * 10000); |
| + if (!document.getElementById(id)) |
| + return id; |
| + return findUniqueId(); |
| +} |
| + |
| +function insertStyleRule(rule) |
| +{ |
| + var styleElement; |
| + var styleElements = document.head.getElementsByTagName("style"); |
| + if (styleElements.length) |
| + { |
| + styleElement = styleElements[0]; |
| + } |
| + else |
| + { |
| + styleElement = document.createElement("style"); |
| + document.head.appendChild(styleElement); |
| + } |
| + styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); |
| +} |
| + |
| +function createElementWithStyle(styleBlock) |
| +{ |
| + var element = document.createElement("div"); |
| + element.id = findUniqueId(); |
| + document.body.appendChild(element); |
| + insertStyleRule("#" + element.id + " " + styleBlock); |
| + return element; |
| +} |
| + |
| +function applyElemHideEmulation(selectors, callback) |
| +{ |
| + var elemHideEmulation = new ElemHideEmulation( |
| + window, |
| + function(callback) |
| + { |
| + var patterns = []; |
| + selectors.forEach(function(selector) |
| + { |
| + patterns.push({selector: selector}); |
| + }); |
| + callback(patterns); |
| + }, |
| + function(selectors) |
| + { |
| + if (!selectors.length) |
| + return; |
| + var selector = selectors.join(", "); |
| + insertStyleRule(selector + "{display: none !important;}"); |
| + } |
| + ); |
| + |
| + elemHideEmulation.load(function() |
| + { |
| + elemHideEmulation.apply(); |
| + callback(); |
| + }); |
| +} |
| + |
| +QUnit.test( |
| + "Verbatim property selector", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{background-color: #000}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='background-color: rgb(0, 0, 0)']"], |
| + function() |
| + { |
| + assert.hidden(toHide); |
| + done(); |
| + } |
| + ); |
| + } |
| +); |
| + |
| +QUnit.test( |
| + "Property selector with wildcard", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{background-color: #000}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='*color: rgb(0, 0, 0)']"], |
| + function() |
| + { |
| + assert.hidden(toHide); |
| + done(); |
| + } |
| + ); |
| + } |
| +); |
| + |
| +QUnit.test( |
| + "Property selector with regular expression", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{background-color: #000}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='/.*color: rgb\\(0, 0, 0\\)/']"], |
| + function() |
| + { |
| + assert.hidden(toHide); |
| + done(); |
| + } |
| + ); |
| + } |
| +); |
| + |
| +QUnit.test( |
| + "Property selector with regular expression containing escaped brace", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{background-color: #000}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='/background.\\x7B 0,6\\x7D : rgb\\(0, 0, 0\\)/']"], |
| + function() |
| + { |
| + assert.hidden(toHide); |
| + done(); |
| + } |
| + ); |
| + } |
| +); |
| + |
| +QUnit.test( |
| + "Property selector with regular expression containing improperly escaped \ |
| +brace", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{background-color: #000}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='/background.\\x7B0,6\\x7D: rgb\\(0, 0, 0\\)/']"], |
| + function() |
| + { |
| + assert.visible(toHide); |
| + done(); |
| + } |
| + ); |
| + } |
| +); |
| + |
| +QUnit.test( |
| + "Property selector works for dynamically changed property", |
| + function(assert) |
| + { |
| + var done = assert.async(); |
| + var toHide = createElementWithStyle("{}"); |
| + applyElemHideEmulation( |
| + ["[-abp-properties='background-color: rgb(0, 0, 0)']"], |
| + function() |
| + { |
| + assert.visible(toHide); |
| + insertStyleRule("#" + toHide.id + " {background-color: #000}"); |
| + setTimeout(function() |
| + { |
| + assert.hidden(toHide); |
| + done(); |
| + }); |
| + } |
| + ); |
| + } |
| +); |