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 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 { | 524 { |
525 ext.backgroundPage.sendMessage(message, (errors) => | 525 ext.backgroundPage.sendMessage(message, (errors) => |
526 { | 526 { |
527 if (errors.length > 0) | 527 if (errors.length > 0) |
528 alert(errors.join("\n")); | 528 alert(errors.join("\n")); |
529 else if (onSuccess) | 529 else if (onSuccess) |
530 onSuccess(); | 530 onSuccess(); |
531 }); | 531 }); |
532 } | 532 } |
533 | 533 |
534 function openDocLink(id) | |
535 { | |
536 getDocLink(id, (link) => | |
537 { | |
538 location.href = link; | |
539 }); | |
540 } | |
541 | |
542 function switchTab(id) | 534 function switchTab(id) |
543 { | 535 { |
544 location.hash = id; | 536 location.hash = id; |
545 } | 537 } |
546 | 538 |
547 function execAction(action, element) | 539 function execAction(action, element) |
548 { | 540 { |
549 switch (action) | 541 switch (action) |
550 { | 542 { |
551 case "add-domain-exception": | 543 case "add-domain-exception": |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
603 let listItem = findParentData(element, "access", true); | 595 let listItem = findParentData(element, "access", true); |
604 if (listItem && !listItem.classList.contains("show-context-menu")) | 596 if (listItem && !listItem.classList.contains("show-context-menu")) |
605 listItem.classList.add("show-context-menu"); | 597 listItem.classList.add("show-context-menu"); |
606 break; | 598 break; |
607 } | 599 } |
608 case "open-dialog": { | 600 case "open-dialog": { |
609 let dialog = findParentData(element, "dialog", false); | 601 let dialog = findParentData(element, "dialog", false); |
610 openDialog(dialog); | 602 openDialog(dialog); |
611 break; | 603 break; |
612 } | 604 } |
613 case "open-doclink": { | |
614 let doclink = findParentData(element, "doclink", false); | |
615 openDocLink(doclink); | |
616 break; | |
617 } | |
618 case "remove-filter": | 605 case "remove-filter": |
619 ext.backgroundPage.sendMessage({ | 606 ext.backgroundPage.sendMessage({ |
620 type: "filters.remove", | 607 type: "filters.remove", |
621 text: findParentData(element, "access", false) | 608 text: findParentData(element, "access", false) |
622 }); | 609 }); |
623 break; | 610 break; |
624 case "remove-subscription": | 611 case "remove-subscription": |
625 ext.backgroundPage.sendMessage({ | 612 ext.backgroundPage.sendMessage({ |
626 type: "subscriptions.remove", | 613 type: "subscriptions.remove", |
627 url: findParentData(element, "access", false) | 614 url: findParentData(element, "access", false) |
(...skipping 16 matching lines...) Expand all Loading... |
644 type: value == "privacy" ? "subscriptions.add" : | 631 type: value == "privacy" ? "subscriptions.add" : |
645 "subscriptions.remove", | 632 "subscriptions.remove", |
646 url: acceptableAdsPrivacyUrl | 633 url: acceptableAdsPrivacyUrl |
647 }); | 634 }); |
648 ext.backgroundPage.sendMessage({ | 635 ext.backgroundPage.sendMessage({ |
649 type: value == "ads" ? "subscriptions.add" : "subscriptions.remove", | 636 type: value == "ads" ? "subscriptions.add" : "subscriptions.remove", |
650 url: acceptableAdsUrl | 637 url: acceptableAdsUrl |
651 }); | 638 }); |
652 break; | 639 break; |
653 case "switch-tab": | 640 case "switch-tab": |
654 let tabId = findParentData(element, "tab", false); | 641 switchTab(element.getAttribute("href").substr(1)); |
655 switchTab(tabId); | |
656 break; | 642 break; |
657 case "toggle-disable-subscription": | 643 case "toggle-disable-subscription": |
658 ext.backgroundPage.sendMessage({ | 644 ext.backgroundPage.sendMessage({ |
659 type: "subscriptions.toggle", | 645 type: "subscriptions.toggle", |
660 keepInstalled: true, | 646 keepInstalled: true, |
661 url: findParentData(element, "access", false) | 647 url: findParentData(element, "access", false) |
662 }); | 648 }); |
663 break; | 649 break; |
664 case "toggle-pref": | 650 case "toggle-pref": |
665 ext.backgroundPage.sendMessage({ | 651 ext.backgroundPage.sendMessage({ |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
758 let container = findParentData(element, "action", true); | 744 let container = findParentData(element, "action", true); |
759 if (!container || !container.hasAttribute("data-keys")) | 745 if (!container || !container.hasAttribute("data-keys")) |
760 return; | 746 return; |
761 | 747 |
762 let keys = container.getAttribute("data-keys").split(" "); | 748 let keys = container.getAttribute("data-keys").split(" "); |
763 if (keys.indexOf(key) < 0) | 749 if (keys.indexOf(key) < 0) |
764 return; | 750 return; |
765 | 751 |
766 if (element.getAttribute("role") == "tab") | 752 if (element.getAttribute("role") == "tab") |
767 { | 753 { |
| 754 let parent = element.parentElement; |
768 if (key == "ArrowLeft" || key == "ArrowUp") | 755 if (key == "ArrowLeft" || key == "ArrowUp") |
769 element = element.previousElementSibling || container.lastElementChild; | 756 parent = parent.previousElementSibling || container.lastElementChild; |
770 else if (key == "ArrowRight" || key == "ArrowDown") | 757 else if (key == "ArrowRight" || key == "ArrowDown") |
771 element = element.nextElementSibling || container.firstElementChild; | 758 parent = parent.nextElementSibling || container.firstElementChild; |
| 759 element = parent.firstElementChild; |
772 } | 760 } |
773 | 761 |
774 let actions = container.getAttribute("data-action").split(","); | 762 let actions = container.getAttribute("data-action").split(","); |
775 for (let action of actions) | 763 for (let action of actions) |
776 { | 764 { |
777 execAction(action, element); | 765 execAction(action, element); |
778 } | 766 } |
779 } | 767 } |
780 | 768 |
781 function selectTabItem(tabId, container, focus) | 769 function selectTabItem(tabId, container, focus) |
782 { | 770 { |
783 // Show tab content | 771 // Show tab content |
784 document.body.setAttribute("data-tab", tabId); | 772 document.body.setAttribute("data-tab", tabId); |
785 | 773 |
786 // Select tab | 774 // Select tab |
787 let tabList = container.querySelector("[role='tablist']"); | 775 let tabList = container.querySelector("[role='tablist']"); |
788 if (!tabList) | 776 if (!tabList) |
789 return null; | 777 return null; |
790 | 778 |
791 let previousTab = tabList.querySelector("[aria-selected]"); | 779 let previousTab = tabList.querySelector("[aria-selected]"); |
792 previousTab.removeAttribute("aria-selected"); | 780 previousTab.removeAttribute("aria-selected"); |
793 previousTab.setAttribute("tabindex", -1); | 781 previousTab.setAttribute("tabindex", -1); |
794 | 782 |
795 let tab = tabList.querySelector("li[data-tab='" + tabId + "']"); | 783 let tab = tabList.querySelector("a[href='#" + tabId + "']"); |
796 tab.setAttribute("aria-selected", true); | 784 tab.setAttribute("aria-selected", true); |
797 tab.setAttribute("tabindex", 0); | 785 tab.setAttribute("tabindex", 0); |
798 | 786 |
799 let tabContentId = tab.getAttribute("aria-controls"); | 787 let tabContentId = tab.getAttribute("aria-controls"); |
800 let tabContent = document.getElementById(tabContentId); | 788 let tabContent = document.getElementById(tabContentId); |
801 | 789 |
802 if (tab && focus) | 790 if (tab && focus) |
803 tab.focus(); | 791 tab.focus(); |
804 | 792 |
805 return tabContent; | 793 return tabContent; |
(...skipping 21 matching lines...) Expand all Loading... |
827 { | 815 { |
828 populateLists(); | 816 populateLists(); |
829 | 817 |
830 // Initialize navigation sidebar | 818 // Initialize navigation sidebar |
831 ext.backgroundPage.sendMessage({ | 819 ext.backgroundPage.sendMessage({ |
832 type: "app.get", | 820 type: "app.get", |
833 what: "addonVersion" | 821 what: "addonVersion" |
834 }, | 822 }, |
835 (addonVersion) => | 823 (addonVersion) => |
836 { | 824 { |
837 E("abp-version").textContent = addonVersion; | 825 E("abp-version").textContent = getMessage("options_dialog_about_version", |
838 }); | 826 [addonVersion]); |
839 getDocLink("releases", (link) => | |
840 { | |
841 E("link-version").setAttribute("href", link); | |
842 }); | 827 }); |
843 | 828 |
844 updateShareLink(); | |
845 updateTooltips(); | 829 updateTooltips(); |
846 | 830 |
847 // Initialize interactive UI elements | 831 // Initialize interactive UI elements |
848 document.body.addEventListener("click", onClick, false); | 832 document.body.addEventListener("click", onClick, false); |
849 document.body.addEventListener("keyup", onKeyUp, false); | 833 document.body.addEventListener("keyup", onKeyUp, false); |
850 let exampleValue = getMessage("options_whitelist_placeholder_example", | 834 let exampleValue = getMessage("options_whitelist_placeholder_example", |
851 ["www.example.com"]); | 835 ["www.example.com"]); |
852 E("whitelisting-textbox").setAttribute("placeholder", exampleValue); | 836 E("whitelisting-textbox").setAttribute("placeholder", exampleValue); |
853 E("whitelisting-textbox").addEventListener("keyup", (e) => | 837 E("whitelisting-textbox").addEventListener("keyup", (e) => |
854 { | 838 { |
855 E("whitelisting-add-button").disabled = !e.target.value; | 839 E("whitelisting-add-button").disabled = !e.target.value; |
856 }, false); | 840 }, false); |
857 | 841 |
| 842 |
| 843 getDocLink("contribute", (link) => |
| 844 { |
| 845 E("contribute").href = link; |
| 846 }); |
858 getDocLink("acceptable_ads_criteria", (link) => | 847 getDocLink("acceptable_ads_criteria", (link) => |
859 { | 848 { |
860 setLinks("enable-aa-description", link); | 849 setLinks("enable-aa-description", link); |
861 }); | 850 }); |
862 | 851 |
863 // Advanced tab | 852 // Advanced tab |
864 let customize = document.querySelectorAll("#customize li[data-pref]"); | 853 let customize = document.querySelectorAll("#customize li[data-pref]"); |
865 customize = Array.prototype.map.call(customize, (checkbox) => | 854 customize = Array.prototype.map.call(customize, (checkbox) => |
866 { | 855 { |
867 return checkbox.getAttribute("data-pref"); | 856 return checkbox.getAttribute("data-pref"); |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1132 ext.backgroundPage.sendMessage(message); | 1121 ext.backgroundPage.sendMessage(message); |
1133 } | 1122 } |
1134 | 1123 |
1135 function onFilterMessage(action, filter) | 1124 function onFilterMessage(action, filter) |
1136 { | 1125 { |
1137 switch (action) | 1126 switch (action) |
1138 { | 1127 { |
1139 case "added": | 1128 case "added": |
1140 filter[timestampUI] = Date.now(); | 1129 filter[timestampUI] = Date.now(); |
1141 updateFilter(filter); | 1130 updateFilter(filter); |
1142 updateShareLink(); | |
1143 break; | 1131 break; |
1144 case "loaded": | 1132 case "loaded": |
1145 populateLists(); | 1133 populateLists(); |
1146 break; | 1134 break; |
1147 case "removed": | 1135 case "removed": |
1148 let knownFilter = filtersMap[filter.text]; | 1136 let knownFilter = filtersMap[filter.text]; |
1149 if (whitelistedDomainRegexp.test(knownFilter.text)) | 1137 if (whitelistedDomainRegexp.test(knownFilter.text)) |
1150 collections.whitelist.removeItem(knownFilter); | 1138 collections.whitelist.removeItem(knownFilter); |
1151 else | 1139 else |
1152 removeCustomFilter(filter.text); | 1140 removeCustomFilter(filter.text); |
1153 | 1141 |
1154 delete filtersMap[filter.text]; | 1142 delete filtersMap[filter.text]; |
1155 updateShareLink(); | |
1156 break; | 1143 break; |
1157 } | 1144 } |
1158 } | 1145 } |
1159 | 1146 |
1160 function onSubscriptionMessage(action, subscription) | 1147 function onSubscriptionMessage(action, subscription) |
1161 { | 1148 { |
1162 if (subscription.url in subscriptionsMap) | 1149 if (subscription.url in subscriptionsMap) |
1163 { | 1150 { |
1164 let knownSubscription = subscriptionsMap[subscription.url]; | 1151 let knownSubscription = subscriptionsMap[subscription.url]; |
1165 for (let property in subscription) | 1152 for (let property in subscription) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1209 } | 1196 } |
1210 else | 1197 else |
1211 { | 1198 { |
1212 collections.custom.removeItem(subscription); | 1199 collections.custom.removeItem(subscription); |
1213 } | 1200 } |
1214 } | 1201 } |
1215 collections.filterLists.removeItem(subscription); | 1202 collections.filterLists.removeItem(subscription); |
1216 break; | 1203 break; |
1217 } | 1204 } |
1218 | 1205 |
1219 updateShareLink(); | |
1220 } | 1206 } |
1221 | 1207 |
1222 function hidePref(key, value) | 1208 function hidePref(key, value) |
1223 { | 1209 { |
1224 let element = document.querySelector("[data-pref='" + key + "']"); | 1210 let element = document.querySelector("[data-pref='" + key + "']"); |
1225 if (element) | 1211 if (element) |
1226 element.setAttribute("aria-hidden", value); | 1212 element.setAttribute("aria-hidden", value); |
1227 } | 1213 } |
1228 | 1214 |
1229 function getPref(key, callback) | 1215 function getPref(key, callback) |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1270 break; | 1256 break; |
1271 } | 1257 } |
1272 | 1258 |
1273 let checkbox = document.querySelector( | 1259 let checkbox = document.querySelector( |
1274 "[data-pref='" + key + "'] button[role='checkbox']" | 1260 "[data-pref='" + key + "'] button[role='checkbox']" |
1275 ); | 1261 ); |
1276 if (checkbox) | 1262 if (checkbox) |
1277 checkbox.setAttribute("aria-checked", value); | 1263 checkbox.setAttribute("aria-checked", value); |
1278 } | 1264 } |
1279 | 1265 |
1280 function updateShareLink() | |
1281 { | |
1282 let shareResources = [ | |
1283 "https://facebook.com/plugins/like.php?", | |
1284 "https://platform.twitter.com/widgets/", | |
1285 "https://apis.google.com/se/0/_/+1/fastbutton?" | |
1286 ]; | |
1287 let isAnyBlocked = false; | |
1288 let checksRemaining = shareResources.length; | |
1289 | |
1290 function onResult(isBlocked) | |
1291 { | |
1292 isAnyBlocked |= isBlocked; | |
1293 if (!--checksRemaining) | |
1294 { | |
1295 // Hide the share tab if a script on the share page would be blocked | |
1296 E("tab-share").hidden = isAnyBlocked; | |
1297 } | |
1298 } | |
1299 | |
1300 for (let sharedResource of shareResources) | |
1301 checkShareResource(sharedResource, onResult); | |
1302 } | |
1303 | |
1304 function updateTooltips() | 1266 function updateTooltips() |
1305 { | 1267 { |
1306 let anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]"); | 1268 let anchors = document.querySelectorAll(":not(.tooltip) > [data-tooltip]"); |
1307 for (let anchor of anchors) | 1269 for (let anchor of anchors) |
1308 { | 1270 { |
1309 let id = anchor.getAttribute("data-tooltip"); | 1271 let id = anchor.getAttribute("data-tooltip"); |
1310 | 1272 |
1311 let wrapper = document.createElement("div"); | 1273 let wrapper = document.createElement("div"); |
1312 wrapper.className = "tooltip"; | 1274 wrapper.className = "tooltip"; |
1313 anchor.parentNode.replaceChild(wrapper, anchor); | 1275 anchor.parentNode.replaceChild(wrapper, anchor); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1370 }); | 1332 }); |
1371 ext.backgroundPage.sendMessage({ | 1333 ext.backgroundPage.sendMessage({ |
1372 type: "subscriptions.listen", | 1334 type: "subscriptions.listen", |
1373 filter: ["added", "disabled", "homepage", "lastDownload", "removed", | 1335 filter: ["added", "disabled", "homepage", "lastDownload", "removed", |
1374 "title", "downloadStatus", "downloading"] | 1336 "title", "downloadStatus", "downloading"] |
1375 }); | 1337 }); |
1376 | 1338 |
1377 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); | 1339 window.addEventListener("DOMContentLoaded", onDOMLoaded, false); |
1378 window.addEventListener("hashchange", onHashChange, false); | 1340 window.addEventListener("hashchange", onHashChange, false); |
1379 } | 1341 } |
OLD | NEW |