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 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
463 { | 463 { |
464 ext.backgroundPage.sendMessage(message, function(errors) | 464 ext.backgroundPage.sendMessage(message, function(errors) |
465 { | 465 { |
466 if (errors.length > 0) | 466 if (errors.length > 0) |
467 alert(errors.join("\n")); | 467 alert(errors.join("\n")); |
468 else if (onSuccess) | 468 else if (onSuccess) |
469 onSuccess(); | 469 onSuccess(); |
470 }); | 470 }); |
471 } | 471 } |
472 | 472 |
| 473 function openDocLink(id) |
| 474 { |
| 475 getDocLink(id, function(link) |
| 476 { |
| 477 if (id == "share-general") |
| 478 openSharePopup(link); |
| 479 else |
| 480 location.href = link; |
| 481 }); |
| 482 } |
| 483 |
| 484 function switchTab(id) |
| 485 { |
| 486 location.hash = id; |
| 487 } |
| 488 |
473 function onClick(e) | 489 function onClick(e) |
474 { | 490 { |
475 var context = document.querySelector(".show-context-menu"); | 491 var context = document.querySelector(".show-context-menu"); |
476 if (context) | 492 if (context) |
477 context.classList.remove("show-context-menu"); | 493 context.classList.remove("show-context-menu"); |
478 | 494 |
479 var element = e.target; | 495 var element = e.target; |
480 while (true) | 496 while (true) |
481 { | 497 { |
482 if (!element) | 498 if (!element) |
483 return; | 499 return; |
484 | 500 |
485 if (element.hasAttribute("data-action")) | 501 if (element.hasAttribute("data-action")) |
486 break; | 502 break; |
487 | 503 |
488 element = element.parentElement; | 504 element = element.parentElement; |
489 } | 505 } |
490 | 506 |
| 507 var element = findParentData(e.target, "action", true); |
491 var actions = element.getAttribute("data-action").split(","); | 508 var actions = element.getAttribute("data-action").split(","); |
492 for (var i = 0; i < actions.length; i++) | 509 for (var i = 0; i < actions.length; i++) |
493 { | 510 { |
494 switch (actions[i]) | 511 switch (actions[i]) |
495 { | 512 { |
496 case "add-domain-exception": | 513 case "add-domain-exception": |
497 addWhitelistedDomain(); | 514 addWhitelistedDomain(); |
498 break; | 515 break; |
499 case "add-predefined-subscription": | 516 case "add-predefined-subscription": |
500 var dialog = E("dialog-content-predefined"); | 517 var dialog = E("dialog-content-predefined"); |
(...skipping 19 matching lines...) Expand all Loading... |
520 case "edit-domain-exception": | 537 case "edit-domain-exception": |
521 document.querySelector("#whitelisting .controls").classList.add("mode-
edit"); | 538 document.querySelector("#whitelisting .controls").classList.add("mode-
edit"); |
522 E("whitelisting-textbox").focus(); | 539 E("whitelisting-textbox").focus(); |
523 break; | 540 break; |
524 case "import-subscription": | 541 case "import-subscription": |
525 var url = E("blockingList-textbox").value; | 542 var url = E("blockingList-textbox").value; |
526 addEnableSubscription(url); | 543 addEnableSubscription(url); |
527 closeDialog(); | 544 closeDialog(); |
528 break; | 545 break; |
529 case "open-dialog": | 546 case "open-dialog": |
530 openDialog(element.getAttribute("data-dialog")); | 547 var dialog = findParentData(element, "dialog", false); |
| 548 openDialog(dialog); |
| 549 break; |
| 550 case "open-doclink": |
| 551 var doclink = findParentData(element, "doclink", false); |
| 552 openDocLink(doclink); |
531 break; | 553 break; |
532 case "save-custom-filters": | 554 case "save-custom-filters": |
533 sendMessageHandleErrors( | 555 sendMessageHandleErrors( |
534 { | 556 { |
535 type: "filters.importRaw", | 557 type: "filters.importRaw", |
536 text: E("custom-filters-raw").value, | 558 text: E("custom-filters-raw").value, |
537 removeExisting: true | 559 removeExisting: true |
538 }, | 560 }, |
539 function() | 561 function() |
540 { | 562 { |
541 E("custom-filters").classList.remove("mode-edit"); | 563 E("custom-filters").classList.remove("mode-edit"); |
542 }); | 564 }); |
543 break; | 565 break; |
544 case "switch-tab": | 566 case "switch-tab": |
545 document.body.setAttribute("data-tab", | 567 var tabId = findParentData(e.target, "tab", false); |
546 element.getAttribute("data-tab")); | 568 switchTab(tabId); |
547 break; | 569 break; |
548 case "toggle-pref": | 570 case "toggle-pref": |
549 ext.backgroundPage.sendMessage( | 571 ext.backgroundPage.sendMessage( |
550 { | 572 { |
551 type: "prefs.toggle", | 573 type: "prefs.toggle", |
552 key: findParentData(element, "pref", false) | 574 key: findParentData(element, "pref", false) |
553 }); | 575 }); |
554 break; | 576 break; |
555 case "update-all-subscriptions": | 577 case "update-all-subscriptions": |
556 ext.backgroundPage.sendMessage( | 578 ext.backgroundPage.sendMessage( |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
604 ext.backgroundPage.sendMessage( | 626 ext.backgroundPage.sendMessage( |
605 { | 627 { |
606 type: "filters.remove", | 628 type: "filters.remove", |
607 text: findParentData(element, "access", false) | 629 text: findParentData(element, "access", false) |
608 }); | 630 }); |
609 break; | 631 break; |
610 } | 632 } |
611 } | 633 } |
612 } | 634 } |
613 | 635 |
| 636 function getKey(e) |
| 637 { |
| 638 // e.keyCode has been deprecated so we attempt to use e.key |
| 639 if ("key" in e) |
| 640 return e.key; |
| 641 return getKey.keys[e.keyCode]; |
| 642 } |
| 643 getKey.keys = { |
| 644 9: "Tab", |
| 645 13: "Enter", |
| 646 27: "Escape", |
| 647 37: "ArrowLeft", |
| 648 38: "ArrowUp", |
| 649 39: "ArrowRight", |
| 650 40: "ArrowDown" |
| 651 }; |
| 652 |
| 653 function onKeyUp(e) |
| 654 { |
| 655 var key = getKey(e); |
| 656 var element = document.activeElement; |
| 657 if (!key || !element) |
| 658 return; |
| 659 |
| 660 var container = findParentData(element, "action", true); |
| 661 if (!container || !container.hasAttribute("data-keys")) |
| 662 return; |
| 663 |
| 664 var keys = container.getAttribute("data-keys").split(" "); |
| 665 if (keys.indexOf(key) < 0) |
| 666 return; |
| 667 |
| 668 switch (container.getAttribute("data-action")) |
| 669 { |
| 670 case "add-domain-exception": |
| 671 addWhitelistedDomain(); |
| 672 break; |
| 673 case "open-doclink": |
| 674 var doclink = findParentData(element, "doclink", false); |
| 675 openDocLink(doclink); |
| 676 break; |
| 677 case "switch-tab": |
| 678 if (key == "Enter") |
| 679 { |
| 680 var tabId = findParentData(element, "tab", false); |
| 681 switchTab(tabId); |
| 682 } |
| 683 else if (element.hasAttribute("aria-selected")) |
| 684 { |
| 685 if (key == "ArrowLeft" || key == "ArrowUp") |
| 686 { |
| 687 element = element.previousElementSibling |
| 688 || container.lastElementChild; |
| 689 } |
| 690 else if (key == "ArrowRight" || key == "ArrowDown") |
| 691 { |
| 692 element = element.nextElementSibling |
| 693 || container.firstElementChild; |
| 694 } |
| 695 |
| 696 var tabId = findParentData(element, "tab", false); |
| 697 switchTab(tabId); |
| 698 } |
| 699 break; |
| 700 } |
| 701 } |
| 702 |
| 703 function selectTabItem(tabId, container, focus) |
| 704 { |
| 705 // Show tab content |
| 706 document.body.setAttribute("data-tab", tabId); |
| 707 |
| 708 // Select tab |
| 709 var tabList = container.querySelector("[role='tablist']"); |
| 710 if (!tabList) |
| 711 return null; |
| 712 |
| 713 var previousTab = tabList.querySelector("[aria-selected]"); |
| 714 previousTab.removeAttribute("aria-selected"); |
| 715 previousTab.setAttribute("tabindex", -1); |
| 716 |
| 717 var tab = tabList.querySelector("li[data-tab='" + tabId + "']"); |
| 718 tab.setAttribute("aria-selected", true); |
| 719 tab.setAttribute("tabindex", 0); |
| 720 |
| 721 var tabContentId = tab.getAttribute("aria-controls"); |
| 722 var tabContent = document.getElementById(tabContentId); |
| 723 |
| 724 // Select sub tabs |
| 725 if (tab.hasAttribute("data-subtab")) |
| 726 selectTabItem(tab.getAttribute("data-subtab"), tabContent, false); |
| 727 |
| 728 if (tab && focus) |
| 729 tab.focus(); |
| 730 |
| 731 return tabContent; |
| 732 } |
| 733 |
| 734 function onHashChange() |
| 735 { |
| 736 var hash = location.hash.substr(1); |
| 737 if (!hash) |
| 738 return; |
| 739 |
| 740 // Select tab and parent tabs |
| 741 var tabIds = hash.split("-"); |
| 742 var tabContent = document.body; |
| 743 for (var i = 0; i < tabIds.length; i++) |
| 744 { |
| 745 var tabId = tabIds.slice(0, i + 1).join("-"); |
| 746 tabContent = selectTabItem(tabId, tabContent, true); |
| 747 if (!tabContent) |
| 748 break; |
| 749 } |
| 750 } |
| 751 |
614 function onDOMLoaded() | 752 function onDOMLoaded() |
615 { | 753 { |
616 populateLists(); | 754 populateLists(); |
617 function onFindLanguageKeyUp() | 755 function onFindLanguageKeyUp() |
618 { | 756 { |
619 var searchStyle = E("search-style"); | 757 var searchStyle = E("search-style"); |
620 if (!this.value) | 758 if (!this.value) |
621 searchStyle.innerHTML = ""; | 759 searchStyle.innerHTML = ""; |
622 else | 760 else |
623 searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + this
.value.toLowerCase() + "\"]) { display: none; }"; | 761 searchStyle.innerHTML = "#all-lang-table li:not([data-search*=\"" + this
.value.toLowerCase() + "\"]) { display: none; }"; |
624 } | 762 } |
625 | 763 |
626 function getKey(e) | |
627 { | |
628 // e.keyCode has been deprecated so we attempt to use e.key | |
629 if ("key" in e) | |
630 return e.key; | |
631 return getKey.keys[e.keyCode]; | |
632 } | |
633 getKey.keys = { | |
634 9: "Tab", | |
635 13: "Enter", | |
636 27: "Escape" | |
637 }; | |
638 | |
639 // Initialize navigation sidebar | 764 // Initialize navigation sidebar |
640 ext.backgroundPage.sendMessage( | 765 ext.backgroundPage.sendMessage( |
641 { | 766 { |
642 type: "app.get", | 767 type: "app.get", |
643 what: "addonVersion" | 768 what: "addonVersion" |
644 }, | 769 }, |
645 function(addonVersion) | 770 function(addonVersion) |
646 { | 771 { |
647 E("abp-version").textContent = addonVersion; | 772 E("abp-version").textContent = addonVersion; |
648 }); | 773 }); |
649 getDocLink("releases", function(link) | 774 getDocLink("releases", function(link) |
650 { | 775 { |
651 E("link-version").setAttribute("href", link); | 776 E("link-version").setAttribute("href", link); |
652 }); | 777 }); |
653 | 778 |
654 getDocLink("contribute", function(link) | |
655 { | |
656 document.querySelector("#tab-contribute a").setAttribute("href", link); | |
657 }); | |
658 | |
659 updateShareLink(); | 779 updateShareLink(); |
660 updateTooltips(); | 780 updateTooltips(); |
661 | 781 |
662 // Initialize interactive UI elements | 782 // Initialize interactive UI elements |
663 document.body.addEventListener("click", onClick, false); | 783 document.body.addEventListener("click", onClick, false); |
| 784 document.body.addEventListener("keyup", onKeyUp, false); |
664 var placeholderValue = getMessage("options_dialog_language_find"); | 785 var placeholderValue = getMessage("options_dialog_language_find"); |
665 E("find-language").setAttribute("placeholder", placeholderValue); | 786 E("find-language").setAttribute("placeholder", placeholderValue); |
666 E("find-language").addEventListener("keyup", onFindLanguageKeyUp, false); | 787 E("find-language").addEventListener("keyup", onFindLanguageKeyUp, false); |
667 E("whitelisting-textbox").addEventListener("keypress", function(e) | 788 E("whitelisting-textbox").addEventListener("keypress", function(e) |
668 { | 789 { |
669 if (getKey(e) == "Enter") | 790 if (getKey(e) == "Enter") |
670 addWhitelistedDomain(); | 791 addWhitelistedDomain(); |
671 }, false); | 792 }, false); |
672 | 793 |
673 // Advanced tab | 794 // Advanced tab |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 } | 862 } |
742 } | 863 } |
743 else if (e.target.classList.contains("focus-last")) | 864 else if (e.target.classList.contains("focus-last")) |
744 { | 865 { |
745 e.preventDefault(); | 866 e.preventDefault(); |
746 this.querySelector(".focus-first").focus(); | 867 this.querySelector(".focus-first").focus(); |
747 } | 868 } |
748 break; | 869 break; |
749 } | 870 } |
750 }, false); | 871 }, false); |
| 872 |
| 873 onHashChange(); |
751 } | 874 } |
752 | 875 |
753 var focusedBeforeDialog = null; | 876 var focusedBeforeDialog = null; |
754 function openDialog(name) | 877 function openDialog(name) |
755 { | 878 { |
756 var dialog = E("dialog"); | 879 var dialog = E("dialog"); |
757 dialog.setAttribute("aria-hidden", false); | 880 dialog.setAttribute("aria-hidden", false); |
758 dialog.setAttribute("aria-labelledby", "dialog-title-" + name); | 881 dialog.setAttribute("aria-labelledby", "dialog-title-" + name); |
759 document.body.setAttribute("data-dialog", name); | 882 document.body.setAttribute("data-dialog", name); |
760 | 883 |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
998 case "safari_contentblocker": | 1121 case "safari_contentblocker": |
999 E("restart-safari").setAttribute("aria-hidden", value || initial); | 1122 E("restart-safari").setAttribute("aria-hidden", value || initial); |
1000 break; | 1123 break; |
1001 } | 1124 } |
1002 | 1125 |
1003 var checkbox = document.querySelector("[data-pref='" + key + "'] button[role
='checkbox']"); | 1126 var checkbox = document.querySelector("[data-pref='" + key + "'] button[role
='checkbox']"); |
1004 if (checkbox) | 1127 if (checkbox) |
1005 checkbox.setAttribute("aria-checked", value); | 1128 checkbox.setAttribute("aria-checked", value); |
1006 } | 1129 } |
1007 | 1130 |
1008 function onShareLinkClick(e) | |
1009 { | |
1010 e.preventDefault(); | |
1011 | |
1012 getDocLink("share-general", openSharePopup); | |
1013 } | |
1014 | |
1015 function updateShareLink() | 1131 function updateShareLink() |
1016 { | 1132 { |
1017 var shareResources = [ | 1133 var shareResources = [ |
1018 "https://facebook.com/plugins/like.php?", | 1134 "https://facebook.com/plugins/like.php?", |
1019 "https://platform.twitter.com/widgets/", | 1135 "https://platform.twitter.com/widgets/", |
1020 "https://apis.google.com/se/0/_/+1/fastbutton?" | 1136 "https://apis.google.com/se/0/_/+1/fastbutton?" |
1021 ]; | 1137 ]; |
1022 var isAnyBlocked = false; | 1138 var isAnyBlocked = false; |
1023 var checksRemaining = shareResources.length; | 1139 var checksRemaining = shareResources.length; |
1024 | 1140 |
1025 function onResult(isBlocked) | 1141 function onResult(isBlocked) |
1026 { | 1142 { |
1027 isAnyBlocked |= isBlocked; | 1143 isAnyBlocked |= isBlocked; |
1028 if (!--checksRemaining) | 1144 if (!--checksRemaining) |
1029 { | 1145 { |
1030 // Hide the share tab if a script on the share page would be blocked | 1146 // Hide the share tab if a script on the share page would be blocked |
1031 var tab = E("tab-share"); | 1147 E("tab-share").hidden = isAnyBlocked; |
1032 if (isAnyBlocked) | |
1033 { | |
1034 tab.hidden = true; | |
1035 tab.removeEventListener("click", onShareLinkClick, false); | |
1036 } | |
1037 else | |
1038 tab.addEventListener("click", onShareLinkClick, false); | |
1039 } | 1148 } |
1040 } | 1149 } |
1041 | 1150 |
1042 for (var i = 0; i < shareResources.length; i++) | 1151 for (var i = 0; i < shareResources.length; i++) |
1043 checkShareResource(shareResources[i], onResult); | 1152 checkShareResource(shareResources[i], onResult); |
1044 } | 1153 } |
1045 | 1154 |
1046 function getMessages(id) | 1155 function getMessages(id) |
1047 { | 1156 { |
1048 var messages = []; | 1157 var messages = []; |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1170 "shouldShowBlockElementMenu"] | 1279 "shouldShowBlockElementMenu"] |
1171 }); | 1280 }); |
1172 ext.backgroundPage.sendMessage( | 1281 ext.backgroundPage.sendMessage( |
1173 { | 1282 { |
1174 type: "subscriptions.listen", | 1283 type: "subscriptions.listen", |
1175 filter: ["added", "disabled", "homepage", "lastDownload", "removed", | 1284 filter: ["added", "disabled", "homepage", "lastDownload", "removed", |
1176 "title", "downloadStatus", "downloading"] | 1285 "title", "downloadStatus", "downloading"] |
1177 }); | 1286 }); |
1178 | 1287 |
1179 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); | 1288 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); |
| 1289 window.addEventListener("hashchange", onHashChange, false); |
1180 })(); | 1290 })(); |
OLD | NEW |