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

Side by Side Diff: test/browser/elemHideEmulation.js

Issue 29383960: Issue 3143 - Filter elements with :-abp-has() (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore
Patch Set: Linter pass Created March 15, 2017, 1:24 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/filterClasses.js ('k') | test/filterClasses.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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-2017 Eyeo GmbH 3 * Copyright (C) 2006-2017 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
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 if (styleElements.length) 78 if (styleElements.length)
79 styleElement = styleElements[0]; 79 styleElement = styleElements[0];
80 else 80 else
81 { 81 {
82 styleElement = document.createElement("style"); 82 styleElement = document.createElement("style");
83 document.head.appendChild(styleElement); 83 document.head.appendChild(styleElement);
84 } 84 }
85 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); 85 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length);
86 } 86 }
87 87
88 function createElementWithStyle(styleBlock) 88 // insert a <div> with a unique id and and empty CSS rule
89 // for the the selector matching the id.
90 function createElementWithStyle(styleBlock, parent)
89 { 91 {
90 var element = document.createElement("div"); 92 var element = document.createElement("div");
91 element.id = findUniqueId(); 93 element.id = findUniqueId();
92 document.body.appendChild(element); 94 if (!parent)
95 document.body.appendChild(element);
96 else
97 parent.appendChild(element);
93 insertStyleRule("#" + element.id + " " + styleBlock); 98 insertStyleRule("#" + element.id + " " + styleBlock);
94 return element; 99 return element;
95 } 100 }
96 101
97 function applyElemHideEmulation(selectors, callback) 102 // Will ensure the class ElemHideEmulation is loaded
103 // and then will call the callback.
104 // NOTE: if it never loads, this will probably hang in an infinite
105 // loop
106 function loadElemHideEmulation(callback)
98 { 107 {
99 if (typeof ElemHideEmulation == "undefined") 108 if (typeof ElemHideEmulation == "undefined")
100 { 109 {
101 loadScript(myUrl + "/../../../lib/common.js", function() 110 loadScript(myUrl + "/../../../lib/common.js", function()
102 { 111 {
103 loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js", 112 loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js",
104 function() 113 function()
105 { 114 {
106 applyElemHideEmulation(selectors, callback); 115 loadElemHideEmulation(callback);
107 }); 116 });
108 }); 117 });
109 return; 118 return;
110 } 119 }
111 120
112 var elemHideEmulation = new ElemHideEmulation(
113 window,
114 function(callback)
115 {
116 var patterns = [];
117 selectors.forEach(function(selector)
118 {
119 patterns.push({selector: selector});
120 });
121 callback(patterns);
122 },
123 function(selectors)
124 {
125 if (!selectors.length)
126 return;
127 var selector = selectors.join(", ");
128 insertStyleRule(selector + "{display: none !important;}");
129 }
130 );
131
132 elemHideEmulation.apply();
133 callback(); 121 callback();
134 } 122 }
135 123
124 // instantiate a ElemHideEmulation with @selectors.
125 function applyElemHideEmulation(selectors, callback)
126 {
127 loadElemHideEmulation(function()
128 {
129 var elemHideEmulation = new ElemHideEmulation(
130 window,
131 function(callback)
132 {
133 var patterns = [];
134 selectors.forEach(function(selector)
135 {
136 patterns.push({selector: selector});
137 });
138 callback(patterns);
139 },
140 function(selectors)
141 {
142 if (!selectors.length)
143 return;
144 var selector = selectors.join(", ");
145 insertStyleRule(selector + "{display: none !important;}");
146 }
147 );
148
149 elemHideEmulation.apply();
150 callback();
151 }.bind(this));
152 }
153
154 exports.testPseudoHasRule = function(test)
155 {
156 loadElemHideEmulation(function()
157 {
158 var selectors = ["div:has(span)"];
159 // testing the regexp
160 var match = pseudoClassHasSelectorRegExp.exec(selectors[0]);
161 test.ok(match);
162 test.equal(match[1], "span");
163
164 test.done();
165 });
166 };
167
168 exports.testSplitStyleRule = function(test)
169 {
170 loadElemHideEmulation(function()
171 {
172 var selectors = splitSelector("div:has(div) > [-abp-properties='background-c olor: rgb(0, 0, 0)'] > span");
173 test.ok(selectors);
174 test.equal(selectors.length, 1, "There is only one selector");
175
176 selectors = splitSelector("div:has(div), [-abp-properties='background-color: rgb(0, 0, 0)']");
177 test.ok(selectors);
178 test.equal(selectors.length, 2, "There are two selectors");
179
180 test.done();
181 });
182 };
183
136 exports.testVerbatimPropertySelector = function(test) 184 exports.testVerbatimPropertySelector = function(test)
137 { 185 {
138 var toHide = createElementWithStyle("{background-color: #000}"); 186 var toHide = createElementWithStyle("{background-color: #000}");
139 applyElemHideEmulation( 187 applyElemHideEmulation(
140 ["[-abp-properties='background-color: rgb(0, 0, 0)']"], 188 ["[-abp-properties='background-color: rgb(0, 0, 0)']"],
141 function() 189 function()
142 { 190 {
143 expectHidden(test, toHide); 191 expectHidden(test, toHide);
144 test.done(); 192 test.done();
145 } 193 }
146 ); 194 );
147 }; 195 };
148 196
197 exports.testVerbatimPropertySelectorWithPrefix = function(test)
198 {
199 var parent = createElementWithStyle("{background-color: #000}");
200 var toHide = createElementWithStyle("{background-color: #000}", parent);
201 applyElemHideEmulation(
202 ["div > [-abp-properties='background-color: rgb(0, 0, 0)']"],
203 function()
204 {
205 expectVisible(test, parent);
206 expectHidden(test, toHide);
207 test.done();
208 }
209 );
210 };
211
212 exports.testVerbatimPropertySelectorWithPrefixNoMatch = function(test)
213 {
214 var parent = createElementWithStyle("{background-color: #000}");
215 var toHide = createElementWithStyle("{background-color: #fff}", parent);
216 applyElemHideEmulation(
217 ["div > [-abp-properties='background-color: rgb(0, 0, 0)']"],
218 function()
219 {
220 expectVisible(test, parent);
221 expectVisible(test, toHide);
222 test.done();
223 }
224 );
225 };
226
227 exports.testVerbatimPropertySelectorWithSuffix = function(test)
228 {
229 var parent = createElementWithStyle("{background-color: #000}");
230 var toHide = createElementWithStyle("{background-color: #000}", parent);
231 applyElemHideEmulation(
232 ["[-abp-properties='background-color: rgb(0, 0, 0)'] > div"],
233 function()
234 {
235 expectVisible(test, parent);
236 expectHidden(test, toHide);
237 test.done();
238 }
239 );
240 };
241
242 exports.testVerbatimPropertySelectorWithPrefixAndSuffix = function(test)
243 {
244 var parent = createElementWithStyle("{background-color: #000}");
245 var middle = createElementWithStyle("{background-color: #000}", parent);
246 var toHide = createElementWithStyle("{background-color: #000}", middle);
247 applyElemHideEmulation(
248 ["div > [-abp-properties='background-color: rgb(0, 0, 0)'] > div"],
249 function()
250 {
251 expectVisible(test, parent);
252 expectVisible(test, middle);
253 expectHidden(test, toHide);
254 test.done();
255 }
256 );
257 };
258
149 exports.testPropertySelectorWithWildcard = function(test) 259 exports.testPropertySelectorWithWildcard = function(test)
150 { 260 {
151 var toHide = createElementWithStyle("{background-color: #000}"); 261 var toHide = createElementWithStyle("{background-color: #000}");
152 applyElemHideEmulation( 262 applyElemHideEmulation(
153 ["[-abp-properties='*color: rgb(0, 0, 0)']"], 263 ["[-abp-properties='*color: rgb(0, 0, 0)']"],
154 function() 264 function()
155 { 265 {
156 expectHidden(test, toHide); 266 expectHidden(test, toHide);
157 test.done(); 267 test.done();
158 } 268 }
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 expectVisible(test, toHide); 318 expectVisible(test, toHide);
209 insertStyleRule("#" + toHide.id + " {background-color: #000}"); 319 insertStyleRule("#" + toHide.id + " {background-color: #000}");
210 window.setTimeout(function() 320 window.setTimeout(function()
211 { 321 {
212 expectHidden(test, toHide); 322 expectHidden(test, toHide);
213 test.done(); 323 test.done();
214 }, 0); 324 }, 0);
215 } 325 }
216 ); 326 );
217 }; 327 };
328
329 exports.testPseudoClassHasMatcher = function(test)
330 {
331 var parent = createElementWithStyle("{}");
332 var toHide = createElementWithStyle("{}", parent);
333 loadElemHideEmulation(function()
334 {
335 var matcher = new PseudoHasMatcher("div");
336 test.equal(matcher.match(parent).length, 1);
337 test.equal(matcher.match(toHide).length, 0);
338
339 var matcher2 = new PseudoHasMatcher("span");
340 test.equal(matcher2.match(parent), 0);
341 test.equal(matcher2.match(toHide), 0);
342
343 test.done();
344 });
345 };
346
347 exports.testPseudoClassHasSelector = function(test)
348 {
349 var toHide = createElementWithStyle("{}");
350 applyElemHideEmulation(
351 ["div:has(div)"],
352 function()
353 {
354 expectVisible(test, toHide);
355 test.done();
356 }
357 );
358 };
359
360 exports.testPseudoClassHasSelectorWithPrefix = function(test)
361 {
362 var parent = createElementWithStyle("{}");
363 var toHide = createElementWithStyle("{}", parent);
364 applyElemHideEmulation(
365 ["div:has(div)"],
366 function()
367 {
368 expectVisible(test, parent);
369 expectHidden(test, toHide);
370 test.done();
371 }
372 );
373 };
OLDNEW
« no previous file with comments | « lib/filterClasses.js ('k') | test/filterClasses.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld