Left: | ||
Right: |
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 |
(...skipping 461 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
472 } | 472 } |
473 unhighlightElements(); | 473 unhighlightElements(); |
474 | 474 |
475 let overlays = document.getElementsByClassName("__adblockplus__overlay"); | 475 let overlays = document.getElementsByClassName("__adblockplus__overlay"); |
476 while (overlays.length > 0) | 476 while (overlays.length > 0) |
477 overlays[0].parentNode.removeChild(overlays[0]); | 477 overlays[0].parentNode.removeChild(overlays[0]); |
478 | 478 |
479 ext.onExtensionUnloaded.removeListener(deactivateBlockElement); | 479 ext.onExtensionUnloaded.removeListener(deactivateBlockElement); |
480 } | 480 } |
481 | 481 |
482 if (document instanceof HTMLDocument) | 482 function initializeComposer() |
483 { | 483 { |
484 if (typeof ext == "undefined") | |
485 return false; | |
486 | |
484 // Use a contextmenu handler to save the last element the user right-clicked | 487 // Use a contextmenu handler to save the last element the user right-clicked |
485 // on. To make things easier, we actually save the DOM event. We have to do | 488 // on. To make things easier, we actually save the DOM event. We have to do |
486 // this because the contextMenu API only provides a URL, not the actual DOM | 489 // this because the contextMenu API only provides a URL, not the actual DOM |
487 // element. | 490 // element. |
488 // We also need to make sure that the previous right click event, | 491 // We also need to make sure that the previous right click event, |
489 // if there is one, is removed. We don't know which frame it is in so we must | 492 // if there is one, is removed. We don't know which frame it is in so we must |
490 // send a message to the other frames to clear their old right click events. | 493 // send a message to the other frames to clear their old right click events. |
491 document.addEventListener("contextmenu", event => | 494 document.addEventListener("contextmenu", event => |
492 { | 495 { |
493 lastRightClickEvent = event; | 496 lastRightClickEvent = event; |
494 lastRightClickEventIsMostRecent = true; | 497 lastRightClickEventIsMostRecent = true; |
495 | 498 |
496 browser.runtime.sendMessage({ | 499 browser.runtime.sendMessage({ |
497 type: "forward", | 500 type: "forward", |
498 payload: | 501 payload: |
499 { | 502 { |
500 type: "composer.content.clearPreviousRightClickEvent" | 503 type: "composer.content.clearPreviousRightClickEvent" |
501 } | 504 } |
502 }); | 505 }); |
503 }, true); | 506 }, true); |
504 | 507 |
505 ext.onMessage.addListener((msg, sender, sendResponse) => | 508 ext.onMessage.addListener((message, sender, sendResponse) => |
Manish Jethani
2017/10/17 16:43:16
Unrelated renaming.
| |
506 { | 509 { |
507 switch (msg.type) | 510 switch (message.type) |
508 { | 511 { |
509 case "composer.content.getState": | 512 case "composer.content.getState": |
510 if (window == window.top) | 513 if (window == window.top) |
511 { | 514 { |
512 sendResponse({ | 515 sendResponse({ |
513 active: currentlyPickingElement || blockelementPopupId != null | 516 active: currentlyPickingElement || blockelementPopupId != null |
514 }); | 517 }); |
515 } | 518 } |
516 break; | 519 break; |
517 case "composer.content.startPickingElement": | 520 case "composer.content.startPickingElement": |
518 if (window == window.top) | 521 if (window == window.top) |
519 startPickingElement(); | 522 startPickingElement(); |
520 break; | 523 break; |
521 case "composer.content.contextMenuClicked": | 524 case "composer.content.contextMenuClicked": |
522 let event = lastRightClickEvent; | 525 let event = lastRightClickEvent; |
523 deactivateBlockElement(); | 526 deactivateBlockElement(); |
524 if (event) | 527 if (event) |
525 { | 528 { |
526 getBlockableElementOrAncestor(event.target, element => | 529 getBlockableElementOrAncestor(event.target, element => |
527 { | 530 { |
528 if (element) | 531 if (element) |
529 { | 532 { |
530 currentElement = element; | 533 currentElement = element; |
531 elementPicked(event); | 534 elementPicked(event); |
532 } | 535 } |
533 }); | 536 }); |
534 } | 537 } |
535 break; | 538 break; |
536 case "composer.content.finished": | 539 case "composer.content.finished": |
537 if (currentElement && msg.remove) | 540 if (currentElement && message.remove) |
538 { | 541 { |
539 // Hide the selected element itself if an added blocking | 542 // Hide the selected element itself if an added blocking |
540 // filter is causing it to collapse. Note that this | 543 // filter is causing it to collapse. Note that this |
541 // behavior is incomplete, but the best we can do here, | 544 // behavior is incomplete, but the best we can do here, |
542 // e.g. if an added blocking filter matches other elements, | 545 // e.g. if an added blocking filter matches other elements, |
543 // the effect won't be visible until the page is is reloaded. | 546 // the effect won't be visible until the page is is reloaded. |
544 checkCollapse(currentElement.prisoner || currentElement); | 547 checkCollapse(currentElement.prisoner || currentElement); |
545 | 548 |
546 // Apply added element hiding filters. | 549 // Apply added element hiding filters. |
547 elemhide.apply(); | 550 elemhide.apply(); |
548 } | 551 } |
549 deactivateBlockElement(); | 552 deactivateBlockElement(); |
550 break; | 553 break; |
551 case "composer.content.clearPreviousRightClickEvent": | 554 case "composer.content.clearPreviousRightClickEvent": |
552 if (!lastRightClickEventIsMostRecent) | 555 if (!lastRightClickEventIsMostRecent) |
553 lastRightClickEvent = null; | 556 lastRightClickEvent = null; |
554 lastRightClickEventIsMostRecent = false; | 557 lastRightClickEventIsMostRecent = false; |
555 break; | 558 break; |
556 case "composer.content.dialogOpened": | 559 case "composer.content.dialogOpened": |
557 if (window == window.top) | 560 if (window == window.top) |
558 blockelementPopupId = msg.popupId; | 561 blockelementPopupId = message.popupId; |
559 break; | 562 break; |
560 case "composer.content.dialogClosed": | 563 case "composer.content.dialogClosed": |
561 // The onRemoved hook for the popup can create a race condition, so we | 564 // The onRemoved hook for the popup can create a race condition, so we |
562 // to be careful here. (This is not perfect, but best we can do.) | 565 // to be careful here. (This is not perfect, but best we can do.) |
563 if (window == window.top && blockelementPopupId == msg.popupId) | 566 if (window == window.top && blockelementPopupId == message.popupId) |
564 { | 567 { |
565 browser.runtime.sendMessage({ | 568 browser.runtime.sendMessage({ |
566 type: "forward", | 569 type: "forward", |
567 payload: | 570 payload: |
568 { | 571 { |
569 type: "composer.content.finished" | 572 type: "composer.content.finished" |
570 } | 573 } |
571 }); | 574 }); |
572 } | 575 } |
573 break; | 576 break; |
574 } | 577 } |
575 }); | 578 }); |
576 | 579 |
577 if (window == window.top) | 580 if (window == window.top) |
578 browser.runtime.sendMessage({type: "composer.ready"}); | 581 browser.runtime.sendMessage({type: "composer.ready"}); |
582 | |
583 return true; | |
579 } | 584 } |
585 | |
586 if (document instanceof HTMLDocument) | |
587 { | |
588 // There's a bug in Firefox that causes document_end content scripts to run | |
589 // before document_start content scripts on extension startup. In this case | |
590 // the ext object is undefined, we fail to initialize, and initializeComposer | |
591 // returns false. As a workaround, try again after a timeout. | |
592 // https://bugzilla.mozilla.org/show_bug.cgi?id=1395287 | |
593 if (!initializeComposer()) | |
594 setTimeout(initializeComposer, 2000); | |
Manish Jethani
2017/10/17 16:43:16
Two seconds is probably fine.
| |
595 } | |
OLD | NEW |