| 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-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 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 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 stylesheet.addRule(selector, "display: none !important;"); | 374 stylesheet.addRule(selector, "display: none !important;"); |
| 375 } | 375 } |
| 376 } | 376 } |
| 377 ); | 377 ); |
| 378 }); | 378 }); |
| 379 | 379 |
| 380 observer.observe(style.parentNode, {childList: true}); | 380 observer.observe(style.parentNode, {childList: true}); |
| 381 return observer; | 381 return observer; |
| 382 } | 382 } |
| 383 | 383 |
| 384 function convertSelectorsForShadowDOM(selectors) | |
| 385 { | |
| 386 var result = []; | |
| 387 var prefix = "::content "; | |
| 388 | |
| 389 for (var i = 0; i < selectors.length; i++) | |
| 390 { | |
| 391 var selector = selectors[i]; | |
| 392 if (selector.indexOf(",") == -1) | |
| 393 { | |
| 394 result.push(prefix + selector); | |
| 395 continue; | |
| 396 } | |
| 397 | |
| 398 var start = 0; | |
| 399 var sep = ""; | |
| 400 for (var j = 0; j < selector.length; j++) | |
| 401 { | |
| 402 var chr = selector[j]; | |
| 403 if (chr == "\\") | |
| 404 j++; | |
| 405 else if (chr == sep) | |
| 406 sep = ""; | |
| 407 else if (sep == "") | |
| 408 { | |
| 409 if (chr == '"' || chr == "'") | |
| 410 sep = chr; | |
| 411 else if (chr == ",") | |
| 412 { | |
| 413 result.push(prefix + selector.substring(start, j)); | |
| 414 start = j + 1; | |
| 415 } | |
| 416 } | |
| 417 } | |
| 418 | |
| 419 result.push(prefix + selector.substring(start)); | |
| 420 } | |
| 421 | |
| 422 return result; | |
| 423 } | |
| 424 | |
| 425 function init(document) | 384 function init(document) |
| 426 { | 385 { |
| 427 var shadow = null; | 386 var shadow = null; |
| 428 var style = null; | 387 var style = null; |
| 429 var observer = null; | 388 var observer = null; |
| 430 var tracer = null; | 389 var tracer = null; |
| 431 var propertyFilters = new CSSPropertyFilters(window, addElemHideSelectors); | 390 var propertyFilters = new CSSPropertyFilters(window, addElemHideSelectors); |
| 432 | 391 |
| 433 // Use Shadow DOM if available to don't mess with web pages that rely on | 392 // Use Shadow DOM if available to don't mess with web pages that rely on |
| 434 // the order of their own <style> tags (#309). | 393 // the order of their own <style> tags (#309). |
| (...skipping 30 matching lines...) Expand all Loading... |
| 465 if (!style.sheet) | 424 if (!style.sheet) |
| 466 return; | 425 return; |
| 467 | 426 |
| 468 observer = reinjectRulesWhenRemoved(document, style); | 427 observer = reinjectRulesWhenRemoved(document, style); |
| 469 } | 428 } |
| 470 | 429 |
| 471 // If using shadow DOM, we have to add the ::content pseudo-element | 430 // If using shadow DOM, we have to add the ::content pseudo-element |
| 472 // before each selector, in order to match elements within the | 431 // before each selector, in order to match elements within the |
| 473 // insertion point. | 432 // insertion point. |
| 474 if (shadow) | 433 if (shadow) |
| 475 selectors = convertSelectorsForShadowDOM(selectors); | 434 { |
| 435 var preparedSelectors = []; |
| 436 for (var i = 0; i < selectors.length; i++) |
| 437 { |
| 438 var subSelectors = splitSelector(selectors[i]); |
| 439 for (var j = 0; j < subSelectors.length; j++) |
| 440 preparedSelectors.push("::content " + subSelectors[j]); |
| 441 } |
| 442 selectors = preparedSelectors; |
| 443 } |
| 476 | 444 |
| 477 // WebKit (and Blink?) apparently chokes when the selector list in a | 445 // WebKit (and Blink?) apparently chokes when the selector list in a |
| 478 // CSS rule is huge. So we split the elemhide selectors into groups. | 446 // CSS rule is huge. So we split the elemhide selectors into groups. |
| 479 while (selectors.length > 0) | 447 while (selectors.length > 0) |
| 480 { | 448 { |
| 481 var selector = selectors.splice(0, SELECTOR_GROUP_SIZE).join(", "); | 449 var selector = selectors.splice(0, SELECTOR_GROUP_SIZE).join(", "); |
| 482 style.sheet.addRule(selector, "display: none !important;"); | 450 style.sheet.addRule(selector, "display: none !important;"); |
| 483 } | 451 } |
| 484 }; | 452 }; |
| 485 | 453 |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 569 }, true); | 537 }, true); |
| 570 | 538 |
| 571 return updateStylesheet; | 539 return updateStylesheet; |
| 572 } | 540 } |
| 573 | 541 |
| 574 if (document instanceof HTMLDocument) | 542 if (document instanceof HTMLDocument) |
| 575 { | 543 { |
| 576 checkSitekey(); | 544 checkSitekey(); |
| 577 window.updateStylesheet = init(document); | 545 window.updateStylesheet = init(document); |
| 578 } | 546 } |
| OLD | NEW |