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: Updated the filter syntax Created April 10, 2017, 10:03 a.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
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 30 matching lines...) Expand all
41 } 41 }
42 42
43 callback(); 43 callback();
44 }; 44 };
45 45
46 exports.tearDown = function(callback) 46 exports.tearDown = function(callback)
47 { 47 {
48 var styleElements = document.head.getElementsByTagName("style"); 48 var styleElements = document.head.getElementsByTagName("style");
49 while (styleElements.length) 49 while (styleElements.length)
50 styleElements[0].parentNode.removeChild(styleElements[0]); 50 styleElements[0].parentNode.removeChild(styleElements[0]);
51 var child;
52 while (child = document.body.firstChild)
53 {
54 document.body.removeChild(child);
55 }
51 callback(); 56 callback();
52 }; 57 };
53 58
54 function expectHidden(test, element) 59 function expectHidden(test, element)
55 { 60 {
56 test.equal(window.getComputedStyle(element).display, "none", 61 test.equal(window.getComputedStyle(element).display, "none",
57 "The element's display property should be set to 'none'"); 62 "The element's display property should be set to 'none'");
58 } 63 }
59 64
60 function expectVisible(test, element) 65 function expectVisible(test, element)
(...skipping 17 matching lines...) Expand all
78 if (styleElements.length) 83 if (styleElements.length)
79 styleElement = styleElements[0]; 84 styleElement = styleElements[0];
80 else 85 else
81 { 86 {
82 styleElement = document.createElement("style"); 87 styleElement = document.createElement("style");
83 document.head.appendChild(styleElement); 88 document.head.appendChild(styleElement);
84 } 89 }
85 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length); 90 styleElement.sheet.insertRule(rule, styleElement.sheet.cssRules.length);
86 } 91 }
87 92
88 function createElementWithStyle(styleBlock) 93 // insert a <div> with a unique id and and empty CSS rule
94 // for the the selector matching the id.
95 function createElementWithStyle(styleBlock, parent)
89 { 96 {
90 var element = document.createElement("div"); 97 var element = document.createElement("div");
91 element.id = findUniqueId(); 98 element.id = findUniqueId();
92 document.body.appendChild(element); 99 if (!parent)
100 document.body.appendChild(element);
101 else
102 parent.appendChild(element);
93 insertStyleRule("#" + element.id + " " + styleBlock); 103 insertStyleRule("#" + element.id + " " + styleBlock);
94 return element; 104 return element;
95 } 105 }
96 106
97 function applyElemHideEmulation(selectors, callback) 107 // Will ensure the class ElemHideEmulation is loaded
108 // and then will call the callback.
109 // NOTE: if it never loads, this will probably hang in an infinite
110 // loop
111 function loadElemHideEmulation(callback)
98 { 112 {
99 if (typeof ElemHideEmulation == "undefined") 113 if (typeof ElemHideEmulation == "undefined")
100 { 114 {
101 loadScript(myUrl + "/../../../lib/common.js", function() 115 loadScript(myUrl + "/../../../lib/common.js", function()
102 { 116 {
103 loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js", 117 loadScript(myUrl + "/../../../chrome/content/elemHideEmulation.js",
104 function() 118 function()
105 { 119 {
106 applyElemHideEmulation(selectors, callback); 120 loadElemHideEmulation(callback);
107 }); 121 });
108 }); 122 });
109 return; 123 return;
110 } 124 }
111 125
112 var elemHideEmulation = new ElemHideEmulation( 126 callback();
113 window, 127 }
114 function(callback) 128
115 { 129 // instantiate a ElemHideEmulation with @selectors.
116 var patterns = []; 130 function applyElemHideEmulation(selectors, callback)
117 selectors.forEach(function(selector) 131 {
132 loadElemHideEmulation(function()
133 {
134 var elemHideEmulation = new ElemHideEmulation(
135 window,
136 function(callback)
118 { 137 {
119 patterns.push({selector: selector}); 138 var patterns = [];
120 }); 139 selectors.forEach(function(selector)
121 callback(patterns); 140 {
122 }, 141 patterns.push({selector: selector});
123 function(selectors) 142 });
124 { 143 callback(patterns);
125 if (!selectors.length) 144 },
126 return; 145 function(selectors)
127 var selector = selectors.join(", "); 146 {
128 insertStyleRule(selector + "{display: none !important;}"); 147 if (!selectors.length)
129 } 148 return;
130 ); 149 var selector = selectors.join(", ");
131 150 insertStyleRule(selector + "{display: none !important;}");
132 elemHideEmulation.apply(); 151 },
133 callback(); 152 function(elements)
153 {
154 if (!elements.length)
155 return;
156 for (var i = 0; i < elements.length; i++)
157 elements[i].style.display = "none";
158 }
159 );
160
161 elemHideEmulation.apply();
162 callback();
163 }.bind(this));
164 }
165
166 exports.testPseudoHasRule = function(test)
167 {
168 loadElemHideEmulation(function()
169 {
170 var selector = "div:has(span)";
171 // testing the regexp
172 var match = pseudoClassHasSelectorRegExp.exec(selector);
173 test.ok(match);
174 test.equal(match[1], "span");
175
176 selector = ":has(div.inside)";
177 match = pseudoClassHasSelectorRegExp.exec(selector);
178 test.ok(match);
179 test.equal(match[1], "div.inside");
180
181 selector = "div[-abp-selector=':has(div.inside)']";
182 match = abpSelectorRegExp.exec(selector);
183 test.ok(match);
184 test.equal(match[2], ":has(div.inside)");
185
186 selector = "[-abp-selector=':has(div.inside)']";
187 match = abpSelectorRegExp.exec(selector);
188 test.ok(match);
189 test.equal(match[2], ":has(div.inside)");
190
191 selector = "div[-abp-selector=':has(:-abp-properties(\"background-color: rgb (0, 0, 0)\"))']";
192 match = abpSelectorRegExp.exec(selector);
193 test.ok(match);
194 test.equal(match[2], ":has(:-abp-properties(\"background-color: rgb(0, 0, 0) \"))");
195
196 test.done();
197 });
198 };
199
200 exports.testSplitStyleRule = function(test)
201 {
202 loadElemHideEmulation(function()
203 {
204 var selectors = splitSelector("div:has(div) > [-abp-properties='background-c olor: rgb(0, 0, 0)'] > span");
205 test.ok(selectors);
206 test.equal(selectors.length, 1, "There is only one selector");
207
208 selectors = splitSelector("div:has(div), [-abp-properties='background-color: rgb(0, 0, 0)']");
209 test.ok(selectors);
210 test.equal(selectors.length, 2, "There are two selectors");
211
212 test.done();
213 });
214 };
215
216 function runTestVerbatimPropertySelector(test, selector)
217 {
218 var toHide = createElementWithStyle("{background-color: #000}");
219 applyElemHideEmulation(
220 [selector],
221 function()
222 {
223 expectHidden(test, toHide);
224 test.done();
225 }
226 );
134 } 227 }
135 228
136 exports.testVerbatimPropertySelector = function(test) 229 exports.testVerbatimPropertySelector = function(test)
137 { 230 {
231 runTestVerbatimPropertySelector(test, "[-abp-properties='background-color: rgb (0, 0, 0)']");
232 };
233
234 /* Testing the new syntax */
235 exports.testVerbatimPropertyPseudoSelector = function(test)
236 {
237 runTestVerbatimPropertySelector(test, "[-abp-selector=':-abp-properties(\"back ground-color: rgb(0, 0, 0)\")']");
238 };
239
240 function runTestVerbatimPropertySelectorWithPrefix(test, selector)
241 {
242 var parent = createElementWithStyle("{background-color: #000}");
243 var toHide = createElementWithStyle("{background-color: #000}", parent);
244 applyElemHideEmulation(
245 [selector],
246 function()
247 {
248 expectVisible(test, parent);
249 expectHidden(test, toHide);
250 test.done();
251 }
252 );
253 }
254
255 exports.testVerbatimPropertySelectorWithPrefix = function(test)
256 {
257 runTestVerbatimPropertySelectorWithPrefix(test, "div > [-abp-properties='backg round-color: rgb(0, 0, 0)']");
258 };
259
260 // testing the new syntax
261 exports.testVerbatimPropertyPseudoSelectorWithPrefix = function(test)
262 {
263 runTestVerbatimPropertySelectorWithPrefix(test, "div > [-abp-selector=':-abp-p roperties(\"background-color: rgb(0, 0, 0)\")']");
264 };
265
266 exports.testVerbatimPropertySelectorWithPrefixNoMatch = function(test)
267 {
268 var parent = createElementWithStyle("{background-color: #000}");
269 var toHide = createElementWithStyle("{background-color: #fff}", parent);
270 applyElemHideEmulation(
271 ["div > [-abp-properties='background-color: rgb(0, 0, 0)']"],
272 function()
273 {
274 expectVisible(test, parent);
275 expectVisible(test, toHide);
276 test.done();
277 }
278 );
279 };
280
281 function runTestVerbatimPropertySelectorWithSuffix(test, selector)
282 {
283 var parent = createElementWithStyle("{background-color: #000}");
284 var toHide = createElementWithStyle("{background-color: #000}", parent);
285 applyElemHideEmulation(
286 [selector],
287 function()
288 {
289 expectVisible(test, parent);
290 expectHidden(test, toHide);
291 test.done();
292 }
293 );
294 }
295
296 exports.testVerbatimPropertySelectorWithSuffix = function(test)
297 {
298 runTestVerbatimPropertySelectorWithSuffix(test, "[-abp-properties='background- color: rgb(0, 0, 0)'] > div");
299 };
300
301 exports.testVerbatimPropertyPseudoSelectorWithSuffix = function(test)
302 {
303 runTestVerbatimPropertySelectorWithSuffix(test, "[-abp-selector=':-abp-propert ies(\"background-color: rgb(0, 0, 0)\")'] > div");
304 };
305
306 function runTestVerbatimPropertySelectorWithPrefixAndSuffix(test, selector)
307 {
308 var parent = createElementWithStyle("{background-color: #000}");
309 var middle = createElementWithStyle("{background-color: #000}", parent);
310 var toHide = createElementWithStyle("{background-color: #000}", middle);
311 applyElemHideEmulation(
312 [selector],
313 function()
314 {
315 expectVisible(test, parent);
316 expectVisible(test, middle);
317 expectHidden(test, toHide);
318 test.done();
319 }
320 );
321 }
322
323 exports.testVerbatimPropertySelectorWithPrefixAndSuffix = function(test)
324 {
325 runTestVerbatimPropertySelectorWithPrefixAndSuffix(test, "div > [-abp-properti es='background-color: rgb(0, 0, 0)'] > div");
326 };
327
328 exports.testVerbatimPropertyPseudoSelectorWithPrefixAndSuffix = function(test)
329 {
330 runTestVerbatimPropertySelectorWithPrefixAndSuffix(test, "div > [-abp-selector =':-abp-properties(\"background-color: rgb(0, 0, 0)\")'] > div");
331 };
332
333 exports.testPropertySelectorWithWildcard = function(test)
334 {
138 var toHide = createElementWithStyle("{background-color: #000}"); 335 var toHide = createElementWithStyle("{background-color: #000}");
139 applyElemHideEmulation( 336 applyElemHideEmulation(
140 ["[-abp-properties='background-color: rgb(0, 0, 0)']"],
141 function()
142 {
143 expectHidden(test, toHide);
144 test.done();
145 }
146 );
147 };
148
149 exports.testPropertySelectorWithWildcard = function(test)
150 {
151 var toHide = createElementWithStyle("{background-color: #000}");
152 applyElemHideEmulation(
153 ["[-abp-properties='*color: rgb(0, 0, 0)']"], 337 ["[-abp-properties='*color: rgb(0, 0, 0)']"],
154 function() 338 function()
155 { 339 {
156 expectHidden(test, toHide); 340 expectHidden(test, toHide);
157 test.done(); 341 test.done();
158 } 342 }
159 ); 343 );
160 }; 344 };
161 345
162 exports.testPropertySelectorWithRegularExpression = function(test) 346 exports.testPropertySelectorWithRegularExpression = function(test)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 expectVisible(test, toHide); 392 expectVisible(test, toHide);
209 insertStyleRule("#" + toHide.id + " {background-color: #000}"); 393 insertStyleRule("#" + toHide.id + " {background-color: #000}");
210 window.setTimeout(function() 394 window.setTimeout(function()
211 { 395 {
212 expectHidden(test, toHide); 396 expectHidden(test, toHide);
213 test.done(); 397 test.done();
214 }, 0); 398 }, 0);
215 } 399 }
216 ); 400 );
217 }; 401 };
402
403 exports.testPseudoClassHasMatcher = function(test)
404 {
405 var parent = createElementWithStyle("{}");
406 var child = createElementWithStyle("{}", parent);
407 loadElemHideEmulation(function()
408 {
409 var matcher = new PseudoHasMatcher("div");
410 test.equal(matcher.match(parent), true, "Parent should contain what is expec ted");
411 test.equal(matcher.match(child), false, "Child shouldn't match");
412
413 var matcher2 = new PseudoHasMatcher("span");
414 test.equal(matcher2.match(parent), false, "Doesn't have a <span> child, shou ldn't match");
415 test.equal(matcher2.match(child), false, "Child shouldn't match");
416
417 test.done();
418 });
419 };
420
421 exports.testPseudoClassHasSelector = function(test)
422 {
423 var toHide = createElementWithStyle("{}");
424 applyElemHideEmulation(
425 ["div[-abp-selector=':has(div)']"],
426 function()
427 {
428 expectVisible(test, toHide);
429 test.done();
430 }
431 );
432 };
433
434 exports.testPseudoClassHasSelectorWithPrefix = function(test)
435 {
436 var parent = createElementWithStyle("{}");
437 var child = createElementWithStyle("{}", parent);
438 applyElemHideEmulation(
439 ["div[-abp-selector=':has(div)']"],
440 function()
441 {
442 expectHidden(test, parent);
443 expectVisible(test, child);
444 test.done();
445 }
446 );
447 };
448
449 exports.testPseudoClassHasSelectorWithSuffix = function(test)
450 {
451 var parent = createElementWithStyle("{}");
452 var middle = createElementWithStyle("{}", parent);
453 var child = createElementWithStyle("{}", middle);
454 applyElemHideEmulation(
455 ["div[-abp-selector=':has(div)'] > div"],
456 function()
457 {
458 expectVisible(test, parent);
459 expectHidden(test, middle);
460 expectHidden(test, child);
461 test.done();
462 }
463 );
464 };
465
466 exports.testPseudoClassHasSelectorWithSuffixSibling = function(test)
467 {
468 var parent = createElementWithStyle("{}");
469 var middle = createElementWithStyle("{}", parent);
470 var toHide = createElementWithStyle("{}");
471 applyElemHideEmulation(
472 ["div[-abp-selector=':has(div)'] + div"],
473 function()
474 {
475 expectVisible(test, parent);
476 expectVisible(test, middle);
477 expectHidden(test, toHide);
478 test.done();
479 }
480 );
481 };
482
483 exports.testPseudoClassHasSelectorWithSuffixSiblingChild = function(test)
484 {
485 // <div>
486 // <div></div>
487 // <div>
488 // <div>to hide</div>
489 // </div>
490 // </div>
491 var parent = createElementWithStyle("{}");
492 var middle = createElementWithStyle("{}", parent);
493 var sibling = createElementWithStyle("{}");
494 var toHide = createElementWithStyle("{}", sibling);
495 applyElemHideEmulation(
496 ["div[-abp-selector=':has(div)'] + div > div"],
497 function()
498 {
499 expectVisible(test, parent);
500 expectVisible(test, middle);
501 expectVisible(test, sibling);
502 expectHidden(test, toHide);
503 test.done();
504 }
505 );
506 };
507
508 function runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, selector )
509 {
510 document.body.innerHTML = '<div id="parent">' +
511 '<div id="middle">' +
512 '<div id="middle.1"><div id="inside" class="inside"></div></div>' +
513 '</div>' +
514 '<div id="sibling">' +
515 '<div id="tohide">to hide</div>' +
516 '</div>' +
517 '<div id="sibling2">' +
518 '<div id="sibling2.1"><div id="sibling2.1.1" class="inside"></div></div>' +
519 '</div>' +
520 '</div>';
521 var parent = document.getElementById("parent");
522 var middle = document.getElementById("middle");
523 var inside = document.getElementById("inside");
524 var sibling = document.getElementById("sibling");
525 var sibling2 = document.getElementById("sibling2");
526 var toHide = document.getElementById("tohide");
527
528 applyElemHideEmulation(
529 [selector],
530 function()
531 {
532 expectVisible(test, parent);
533 expectVisible(test, middle);
534 expectVisible(test, inside);
535 expectVisible(test, sibling);
536 expectVisible(test, sibling2);
537 expectHidden(test, toHide);
538 test.done();
539 }
540 );
541 }
542
543 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling = function(test)
544 {
545 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div[-abp-selec tor=':has(:has(div.inside))'] + div > div");
546 };
547
548 exports.testPseudoClassHasSelectorWithHasAndWithSuffixSibling2 = function(test)
549 {
550 runTestPseudoClassHasSelectorWithHasAndWithSuffixSibling(test, "div[-abp-selec tor=':has(:has(> div.inside))'] + div > div");
551 };
552
553 exports.testPseudoClassHasSelectorWithPropSelector = function(test)
554 {
555 var parent = createElementWithStyle("{}");
556 var child = createElementWithStyle("{background-color: #000}", parent);
557 applyElemHideEmulation(
558 ["div[-abp-selector=':has(:-abp-properties(\"background-color: rgb(0, 0, 0)\ "))']"],
559 function()
560 {
561 expectVisible(test, child);
562 expectHidden(test, parent);
563 test.done();
564 }
565 );
566 };
OLDNEW
« lib/filterClasses.js ('K') | « lib/filterClasses.js ('k') | test/filterClasses.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld