| 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 |