OLD | NEW |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 "use strict"; | 18 "use strict"; |
19 | 19 |
20 const {ElemHideEmulation} = require("../../lib/content/elemHideEmulation"); | 20 const {ElemHideEmulation, setDebugMode, |
| 21 getDebugInfo} = require("../../lib/content/elemHideEmulation"); |
21 | 22 |
22 const REFRESH_INTERVAL = 200; | 23 const REFRESH_INTERVAL = 200; |
23 | 24 |
24 let testDocument = null; | 25 let testDocument = null; |
25 | 26 |
26 exports.setUp = function(callback) | 27 exports.setUp = function(callback) |
27 { | 28 { |
| 29 setDebugMode(); |
| 30 |
28 let iframe = document.createElement("iframe"); | 31 let iframe = document.createElement("iframe"); |
29 document.body.appendChild(iframe); | 32 document.body.appendChild(iframe); |
30 testDocument = iframe.contentDocument; | 33 testDocument = iframe.contentDocument; |
31 | 34 |
32 callback(); | 35 callback(); |
33 }; | 36 }; |
34 | 37 |
35 exports.tearDown = function(callback) | 38 exports.tearDown = function(callback) |
36 { | 39 { |
37 let iframe = testDocument.defaultView.frameElement; | 40 let iframe = testDocument.defaultView.frameElement; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 { | 73 { |
71 let withId = ""; | 74 let withId = ""; |
72 if (typeof id != "undefined") | 75 if (typeof id != "undefined") |
73 withId = ` with ID '${id}'`; | 76 withId = ` with ID '${id}'`; |
74 | 77 |
75 test.notEqual( | 78 test.notEqual( |
76 window.getComputedStyle(element).display, "none", | 79 window.getComputedStyle(element).display, "none", |
77 `The element${withId}'s display property should not be set to 'none'`); | 80 `The element${withId}'s display property should not be set to 'none'`); |
78 } | 81 } |
79 | 82 |
| 83 function expectProcessed(test, element, id = null) |
| 84 { |
| 85 let withId = ""; |
| 86 if (id) |
| 87 withId = ` with ID '${id}'`; |
| 88 |
| 89 test.ok( |
| 90 getDebugInfo().lastProcessedElements.has(element), |
| 91 `The element${withId} should have been processed`); |
| 92 } |
| 93 |
| 94 function expectNotProcessed(test, element, id = null) |
| 95 { |
| 96 let withId = ""; |
| 97 if (id) |
| 98 withId = ` with ID '${id}'`; |
| 99 |
| 100 test.ok( |
| 101 !getDebugInfo().lastProcessedElements.has(element), |
| 102 `The element${withId} should not have been processed`); |
| 103 } |
| 104 |
80 function findUniqueId() | 105 function findUniqueId() |
81 { | 106 { |
82 let id = "elemHideEmulationTest-" + Math.floor(Math.random() * 10000); | 107 let id = "elemHideEmulationTest-" + Math.floor(Math.random() * 10000); |
83 if (!testDocument.getElementById(id)) | 108 if (!testDocument.getElementById(id)) |
84 return id; | 109 return id; |
85 return findUniqueId(); | 110 return findUniqueId(); |
86 } | 111 } |
87 | 112 |
88 function insertStyleRule(rule) | 113 function insertStyleRule(rule) |
89 { | 114 { |
90 let styleElement; | 115 let styleElement; |
91 let styleElements = testDocument.head.getElementsByTagName("style"); | 116 let styleElements = testDocument.head.getElementsByTagName("style"); |
92 if (styleElements.length) | 117 if (styleElements.length) |
93 styleElement = styleElements[0]; | 118 styleElement = styleElements[0]; |
94 else | 119 else |
95 { | 120 { |
96 styleElement = testDocument.createElement("style"); | 121 styleElement = testDocument.createElement("style"); |
97 testDocument.head.appendChild(styleElement); | 122 testDocument.head.appendChild(styleElement); |
98 } | 123 } |
99 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); | 124 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); |
100 } | 125 } |
101 | 126 |
102 function createElement(parent) | 127 function createElement(parent, type = "div", id = findUniqueId(), |
| 128 innerText = null) |
103 { | 129 { |
104 let element = testDocument.createElement("div"); | 130 let element = testDocument.createElement(type); |
105 element.id = findUniqueId(); | 131 element.id = id; |
106 if (!parent) | 132 if (!parent) |
107 testDocument.body.appendChild(element); | 133 testDocument.body.appendChild(element); |
108 else | 134 else |
109 parent.appendChild(element); | 135 parent.appendChild(element); |
| 136 if (innerText) |
| 137 element.innerText = innerText; |
110 return element; | 138 return element; |
111 } | 139 } |
112 | 140 |
113 // Insert a <div> with a unique id and a CSS rule | 141 // Insert a <div> with a unique id and a CSS rule |
114 // for the the selector matching the id. | 142 // for the the selector matching the id. |
115 function createElementWithStyle(styleBlock, parent) | 143 function createElementWithStyle(styleBlock, parent) |
116 { | 144 { |
117 let element = createElement(parent); | 145 let element = createElement(parent); |
118 insertStyleRule("#" + element.id + " " + styleBlock); | 146 insertStyleRule("#" + element.id + " " + styleBlock); |
119 return element; | 147 return element; |
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
891 | 919 |
892 return timeout(REFRESH_INTERVAL); | 920 return timeout(REFRESH_INTERVAL); |
893 }).then(() => | 921 }).then(() => |
894 { | 922 { |
895 // Note: Even though it runs both the :-abp-contains() patterns, it only | 923 // Note: Even though it runs both the :-abp-contains() patterns, it only |
896 // hides the parent element because of revision d7d51d29aa34. | 924 // hides the parent element because of revision d7d51d29aa34. |
897 expectHidden(test, parent); | 925 expectHidden(test, parent); |
898 expectVisible(test, child); | 926 expectVisible(test, child); |
899 }).catch(unexpectedError.bind(test)).then(() => test.done()); | 927 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
900 }; | 928 }; |
| 929 |
| 930 exports.testOnlyRelevantElementsProcessed = function(test) |
| 931 { |
| 932 // <body> |
| 933 // <div id="n1"> |
| 934 // <p id="n1_1"></p> |
| 935 // <p id="n1_2"></p> |
| 936 // <p id="n1_4">Hello</p> |
| 937 // </div> |
| 938 // <div id="n2"> |
| 939 // <p id="n2_1"></p> |
| 940 // <p id="n2_2"></p> |
| 941 // <p id="n2_4">Hello</p> |
| 942 // </div> |
| 943 // <div id="n3"> |
| 944 // <p id="n3_1"></p> |
| 945 // <p id="n3_2"></p> |
| 946 // <p id="n3_4">Hello</p> |
| 947 // </div> |
| 948 // <div id="n4"> |
| 949 // <p id="n4_1"></p> |
| 950 // <p id="n4_2"></p> |
| 951 // <p id="n4_4">Hello</p> |
| 952 // </div> |
| 953 // </body> |
| 954 for (let i of [1, 2, 3, 4]) |
| 955 { |
| 956 let n = createElement(null, "div", `n${i}`); |
| 957 for (let [j, text] of [[1], [2], [4, "Hello"]]) |
| 958 createElement(n, "p", `n${i}_${j}`, text); |
| 959 } |
| 960 |
| 961 applyElemHideEmulation( |
| 962 ["p:-abp-contains(Hello)", |
| 963 "div:-abp-contains(Try me!)", |
| 964 "div:-abp-has(p:-abp-contains(This is good))"] |
| 965 ).then(() => timeout(REFRESH_INTERVAL) |
| 966 ).then(() => |
| 967 { |
| 968 // This is only a sanity check to make sure everything else is working |
| 969 // before we do the actual test. |
| 970 for (let i of [1, 2, 3, 4]) |
| 971 { |
| 972 for (let j of [1, 2, 4]) |
| 973 { |
| 974 let id = `n${i}_${j}`; |
| 975 if (j == 4) |
| 976 expectHidden(test, testDocument.getElementById(id), id); |
| 977 else |
| 978 expectVisible(test, testDocument.getElementById(id), id); |
| 979 } |
| 980 } |
| 981 |
| 982 // All <div> and <p> elements should be processed initially. |
| 983 for (let element of [...testDocument.getElementsByTagName("div"), |
| 984 ...testDocument.getElementsByTagName("p")]) |
| 985 { |
| 986 expectProcessed(test, element, element.id); |
| 987 } |
| 988 |
| 989 // Modify the text in <p id="n4_1"> |
| 990 testDocument.getElementById("n4_1").innerText = "Try me!"; |
| 991 |
| 992 return timeout(REFRESH_INTERVAL); |
| 993 }).then(() => |
| 994 { |
| 995 // When an element's text is modified, only the element or one of its |
| 996 // ancestors matching any selector is processed for :-abp-has() and |
| 997 // :-abp-contains() |
| 998 for (let element of [...testDocument.getElementsByTagName("div"), |
| 999 ...testDocument.getElementsByTagName("p")]) |
| 1000 { |
| 1001 if (element.id == "n4" || element.id == "n4_1") |
| 1002 expectProcessed(test, element, element.id); |
| 1003 else |
| 1004 expectNotProcessed(test, element, element.id); |
| 1005 } |
| 1006 |
| 1007 // Create a new <p id="n2_3"> element with no text. |
| 1008 createElement(testDocument.getElementById("n2"), "p", "n2_3"); |
| 1009 |
| 1010 return timeout(REFRESH_INTERVAL); |
| 1011 }).then(() => |
| 1012 { |
| 1013 // When a new element is added, only the element or one of its ancestors |
| 1014 // matching any selector is processed for :-abp-has() and :-abp-contains() |
| 1015 for (let element of [...testDocument.getElementsByTagName("div"), |
| 1016 ...testDocument.getElementsByTagName("p")]) |
| 1017 { |
| 1018 if (element.id == "n2" || element.id == "n2_3") |
| 1019 expectProcessed(test, element, element.id); |
| 1020 else |
| 1021 expectNotProcessed(test, element, element.id); |
| 1022 } |
| 1023 }).catch(unexpectedError.bind(test)).then(() => test.done()); |
| 1024 }; |
OLD | NEW |