| 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 | 
| 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 12  * GNU General Public License for more details. | 12  * GNU General Public License for more details. | 
| 13  * | 13  * | 
| 14  * You should have received a copy of the GNU General Public License | 14  * You should have received a copy of the GNU General Public License | 
| 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 16  */ | 16  */ | 
| 17 | 17 | 
| 18 /* globals checkShareResource, getDocLink, i18nFormatDateTime, openSharePopup, | 18 /* globals checkShareResource, getDocLink, i18nFormatDateTime, openSharePopup, | 
| 19            setLinks, E */ | 19            setLinks, E */ | 
| 20 | 20 | 
| 21 "use strict"; | 21 "use strict"; | 
| 22 | 22 | 
| 23 { | 23 { | 
| 24   let subscriptionsMap = Object.create(null); | 24   let subscriptionsMap = Object.create(null); | 
| 25   let filtersMap = Object.create(null); | 25   let filtersMap = Object.create(null); | 
| 26   let collections = Object.create(null); | 26   let collections = Object.create(null); | 
| 27   let acceptableAdsUrl = null; | 27   let acceptableAdsUrl = null; | 
| 28   let acceptableAdsPrivacyUrl = null; | 28   let acceptableAdsPrivacyUrl = null; | 
| 29   let isCustomFiltersLoaded = false; | 29   let isCustomFiltersLoaded = false; | 
| 30   let {getMessage} = chrome.i18n; | 30   let {getMessage} = browser.i18n; | 
| 31   let customFilters = []; | 31   let customFilters = []; | 
| 32   let filterErrors = new Map([ | 32   let filterErrors = new Map([ | 
| 33     ["synchronize_invalid_url", | 33     ["synchronize_invalid_url", | 
| 34      "options_filterList_lastDownload_invalidURL"], | 34      "options_filterList_lastDownload_invalidURL"], | 
| 35     ["synchronize_connection_error", | 35     ["synchronize_connection_error", | 
| 36      "options_filterList_lastDownload_connectionError"], | 36      "options_filterList_lastDownload_connectionError"], | 
| 37     ["synchronize_invalid_data", | 37     ["synchronize_invalid_data", | 
| 38      "options_filterList_lastDownload_invalidData"], | 38      "options_filterList_lastDownload_invalidData"], | 
| 39     ["synchronize_checksum_mismatch", | 39     ["synchronize_checksum_mismatch", | 
| 40      "options_filterList_lastDownload_checksumMismatch"] | 40      "options_filterList_lastDownload_checksumMismatch"] | 
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 536         return element.getAttribute("data-" + dataName); | 536         return element.getAttribute("data-" + dataName); | 
| 537       } | 537       } | 
| 538 | 538 | 
| 539       element = element.parentElement; | 539       element = element.parentElement; | 
| 540     } | 540     } | 
| 541     return null; | 541     return null; | 
| 542   } | 542   } | 
| 543 | 543 | 
| 544   function sendMessageHandleErrors(message, onSuccess) | 544   function sendMessageHandleErrors(message, onSuccess) | 
| 545   { | 545   { | 
| 546     chrome.runtime.sendMessage(message, (errors) => | 546     browser.runtime.sendMessage(message, (errors) => | 
| 547     { | 547     { | 
| 548       if (errors.length > 0) | 548       if (errors.length > 0) | 
| 549         alert(errors.join("\n")); | 549         alert(errors.join("\n")); | 
| 550       else if (onSuccess) | 550       else if (onSuccess) | 
| 551         onSuccess(); | 551         onSuccess(); | 
| 552     }); | 552     }); | 
| 553   } | 553   } | 
| 554 | 554 | 
| 555   function switchTab(id) | 555   function switchTab(id) | 
| 556   { | 556   { | 
| (...skipping 21 matching lines...) Expand all  Loading... | 
| 578       case "cancel-custom-filters": | 578       case "cancel-custom-filters": | 
| 579         setCustomFiltersView("read"); | 579         setCustomFiltersView("read"); | 
| 580         break; | 580         break; | 
| 581       case "change-language-subscription": | 581       case "change-language-subscription": | 
| 582         for (let key in subscriptionsMap) | 582         for (let key in subscriptionsMap) | 
| 583         { | 583         { | 
| 584           let subscription = subscriptionsMap[key]; | 584           let subscription = subscriptionsMap[key]; | 
| 585           let subscriptionType = subscription.recommended; | 585           let subscriptionType = subscription.recommended; | 
| 586           if (subscriptionType == "ads" && subscription.disabled == false) | 586           if (subscriptionType == "ads" && subscription.disabled == false) | 
| 587           { | 587           { | 
| 588             chrome.runtime.sendMessage({ | 588             browser.runtime.sendMessage({ | 
| 589               type: "subscriptions.remove", | 589               type: "subscriptions.remove", | 
| 590               url: subscription.url | 590               url: subscription.url | 
| 591             }); | 591             }); | 
| 592             chrome.runtime.sendMessage({ | 592             browser.runtime.sendMessage({ | 
| 593               type: "subscriptions.add", | 593               type: "subscriptions.add", | 
| 594               url: findParentData(element, "access", false) | 594               url: findParentData(element, "access", false) | 
| 595             }); | 595             }); | 
| 596             break; | 596             break; | 
| 597           } | 597           } | 
| 598         } | 598         } | 
| 599         break; | 599         break; | 
| 600       case "close-dialog": | 600       case "close-dialog": | 
| 601         closeDialog(); | 601         closeDialog(); | 
| 602         break; | 602         break; | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 620         if (listItem && !listItem.classList.contains("show-context-menu")) | 620         if (listItem && !listItem.classList.contains("show-context-menu")) | 
| 621           listItem.classList.add("show-context-menu"); | 621           listItem.classList.add("show-context-menu"); | 
| 622         break; | 622         break; | 
| 623       } | 623       } | 
| 624       case "open-dialog": { | 624       case "open-dialog": { | 
| 625         let dialog = findParentData(element, "dialog", false); | 625         let dialog = findParentData(element, "dialog", false); | 
| 626         openDialog(dialog); | 626         openDialog(dialog); | 
| 627         break; | 627         break; | 
| 628       } | 628       } | 
| 629       case "remove-filter": | 629       case "remove-filter": | 
| 630         chrome.runtime.sendMessage({ | 630         browser.runtime.sendMessage({ | 
| 631           type: "filters.remove", | 631           type: "filters.remove", | 
| 632           text: findParentData(element, "access", false) | 632           text: findParentData(element, "access", false) | 
| 633         }); | 633         }); | 
| 634         break; | 634         break; | 
| 635       case "remove-subscription": | 635       case "remove-subscription": | 
| 636         chrome.runtime.sendMessage({ | 636         browser.runtime.sendMessage({ | 
| 637           type: "subscriptions.remove", | 637           type: "subscriptions.remove", | 
| 638           url: findParentData(element, "access", false) | 638           url: findParentData(element, "access", false) | 
| 639         }); | 639         }); | 
| 640         break; | 640         break; | 
| 641       case "save-custom-filters": | 641       case "save-custom-filters": | 
| 642         sendMessageHandleErrors({ | 642         sendMessageHandleErrors({ | 
| 643           type: "filters.importRaw", | 643           type: "filters.importRaw", | 
| 644           text: E("custom-filters-raw").value, | 644           text: E("custom-filters-raw").value, | 
| 645           removeExisting: true | 645           removeExisting: true | 
| 646         }, | 646         }, | 
| 647         () => | 647         () => | 
| 648         { | 648         { | 
| 649           setCustomFiltersView("read"); | 649           setCustomFiltersView("read"); | 
| 650         }); | 650         }); | 
| 651         break; | 651         break; | 
| 652       case "show-more-filters-section": | 652       case "show-more-filters-section": | 
| 653         E("more-filters").setAttribute("aria-hidden", false); | 653         E("more-filters").setAttribute("aria-hidden", false); | 
| 654         break; | 654         break; | 
| 655       case "switch-acceptable-ads": | 655       case "switch-acceptable-ads": | 
| 656         let value = element.value || element.dataset.value; | 656         let value = element.value || element.dataset.value; | 
| 657         chrome.runtime.sendMessage({ | 657         browser.runtime.sendMessage({ | 
| 658           type: value == "privacy" ? "subscriptions.add" : | 658           type: value == "privacy" ? "subscriptions.add" : | 
| 659             "subscriptions.remove", | 659             "subscriptions.remove", | 
| 660           url: acceptableAdsPrivacyUrl | 660           url: acceptableAdsPrivacyUrl | 
| 661         }); | 661         }); | 
| 662         chrome.runtime.sendMessage({ | 662         browser.runtime.sendMessage({ | 
| 663           type: value == "ads" ? "subscriptions.add" : "subscriptions.remove", | 663           type: value == "ads" ? "subscriptions.add" : "subscriptions.remove", | 
| 664           url: acceptableAdsUrl | 664           url: acceptableAdsUrl | 
| 665         }); | 665         }); | 
| 666         break; | 666         break; | 
| 667       case "switch-tab": | 667       case "switch-tab": | 
| 668         switchTab(element.getAttribute("href").substr(1)); | 668         switchTab(element.getAttribute("href").substr(1)); | 
| 669         break; | 669         break; | 
| 670       case "toggle-disable-subscription": | 670       case "toggle-disable-subscription": | 
| 671         chrome.runtime.sendMessage({ | 671         browser.runtime.sendMessage({ | 
| 672           type: "subscriptions.toggle", | 672           type: "subscriptions.toggle", | 
| 673           keepInstalled: true, | 673           keepInstalled: true, | 
| 674           url: findParentData(element, "access", false) | 674           url: findParentData(element, "access", false) | 
| 675         }); | 675         }); | 
| 676         break; | 676         break; | 
| 677       case "toggle-pref": | 677       case "toggle-pref": | 
| 678         chrome.runtime.sendMessage({ | 678         browser.runtime.sendMessage({ | 
| 679           type: "prefs.toggle", | 679           type: "prefs.toggle", | 
| 680           key: findParentData(element, "pref", false) | 680           key: findParentData(element, "pref", false) | 
| 681         }); | 681         }); | 
| 682         break; | 682         break; | 
| 683       case "toggle-remove-subscription": | 683       case "toggle-remove-subscription": | 
| 684         let subscriptionUrl = findParentData(element, "access", false); | 684         let subscriptionUrl = findParentData(element, "access", false); | 
| 685         if (element.getAttribute("aria-checked") == "true") | 685         if (element.getAttribute("aria-checked") == "true") | 
| 686         { | 686         { | 
| 687           chrome.runtime.sendMessage({ | 687           browser.runtime.sendMessage({ | 
| 688             type: "subscriptions.remove", | 688             type: "subscriptions.remove", | 
| 689             url: subscriptionUrl | 689             url: subscriptionUrl | 
| 690           }); | 690           }); | 
| 691         } | 691         } | 
| 692         else | 692         else | 
| 693           addEnableSubscription(subscriptionUrl); | 693           addEnableSubscription(subscriptionUrl); | 
| 694         break; | 694         break; | 
| 695       case "update-all-subscriptions": | 695       case "update-all-subscriptions": | 
| 696         chrome.runtime.sendMessage({ | 696         browser.runtime.sendMessage({ | 
| 697           type: "subscriptions.update" | 697           type: "subscriptions.update" | 
| 698         }); | 698         }); | 
| 699         break; | 699         break; | 
| 700       case "update-subscription": | 700       case "update-subscription": | 
| 701         chrome.runtime.sendMessage({ | 701         browser.runtime.sendMessage({ | 
| 702           type: "subscriptions.update", | 702           type: "subscriptions.update", | 
| 703           url: findParentData(element, "access", false) | 703           url: findParentData(element, "access", false) | 
| 704         }); | 704         }); | 
| 705         break; | 705         break; | 
| 706       case "validate-import-subscription": | 706       case "validate-import-subscription": | 
| 707         let form = findParentData(element, "validation", true); | 707         let form = findParentData(element, "validation", true); | 
| 708         if (!form) | 708         if (!form) | 
| 709           return; | 709           return; | 
| 710 | 710 | 
| 711         if (form.checkValidity()) | 711         if (form.checkValidity()) | 
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 853       if (!tabContent) | 853       if (!tabContent) | 
| 854         break; | 854         break; | 
| 855     } | 855     } | 
| 856   } | 856   } | 
| 857 | 857 | 
| 858   function onDOMLoaded() | 858   function onDOMLoaded() | 
| 859   { | 859   { | 
| 860     populateLists(); | 860     populateLists(); | 
| 861 | 861 | 
| 862     // Initialize navigation sidebar | 862     // Initialize navigation sidebar | 
| 863     chrome.runtime.sendMessage({ | 863     browser.runtime.sendMessage({ | 
| 864       type: "app.get", | 864       type: "app.get", | 
| 865       what: "addonVersion" | 865       what: "addonVersion" | 
| 866     }, | 866     }, | 
| 867     (addonVersion) => | 867     (addonVersion) => | 
| 868     { | 868     { | 
| 869       E("abp-version").textContent = getMessage("options_dialog_about_version", | 869       E("abp-version").textContent = getMessage("options_dialog_about_version", | 
| 870         [addonVersion]); | 870         [addonVersion]); | 
| 871     }); | 871     }); | 
| 872 | 872 | 
| 873     updateTooltips(); | 873     updateTooltips(); | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 902     { | 902     { | 
| 903       return checkbox.getAttribute("data-pref"); | 903       return checkbox.getAttribute("data-pref"); | 
| 904     }); | 904     }); | 
| 905     for (let key of customize) | 905     for (let key of customize) | 
| 906     { | 906     { | 
| 907       getPref(key, (value) => | 907       getPref(key, (value) => | 
| 908       { | 908       { | 
| 909         onPrefMessage(key, value, true); | 909         onPrefMessage(key, value, true); | 
| 910       }); | 910       }); | 
| 911     } | 911     } | 
| 912     chrome.runtime.sendMessage({ | 912     browser.runtime.sendMessage({ | 
| 913       type: "app.get", | 913       type: "app.get", | 
| 914       what: "features" | 914       what: "features" | 
| 915     }, | 915     }, | 
| 916     (features) => | 916     (features) => | 
| 917     { | 917     { | 
| 918       hidePref("show_devtools_panel", !features.devToolsPanel); | 918       hidePref("show_devtools_panel", !features.devToolsPanel); | 
| 919     }); | 919     }); | 
| 920 | 920 | 
| 921     getDocLink("filterdoc", (link) => | 921     getDocLink("filterdoc", (link) => | 
| 922     { | 922     { | 
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1058   function populateLists() | 1058   function populateLists() | 
| 1059   { | 1059   { | 
| 1060     subscriptionsMap = Object.create(null); | 1060     subscriptionsMap = Object.create(null); | 
| 1061     filtersMap = Object.create(null); | 1061     filtersMap = Object.create(null); | 
| 1062 | 1062 | 
| 1063     // Empty collections and lists | 1063     // Empty collections and lists | 
| 1064     for (let property in collections) | 1064     for (let property in collections) | 
| 1065       collections[property].clearAll(); | 1065       collections[property].clearAll(); | 
| 1066 | 1066 | 
| 1067     setCustomFiltersView("empty"); | 1067     setCustomFiltersView("empty"); | 
| 1068     chrome.runtime.sendMessage({ | 1068     browser.runtime.sendMessage({ | 
| 1069       type: "subscriptions.get", | 1069       type: "subscriptions.get", | 
| 1070       special: true | 1070       special: true | 
| 1071     }, | 1071     }, | 
| 1072     (subscriptions) => | 1072     (subscriptions) => | 
| 1073     { | 1073     { | 
| 1074       // Load filters | 1074       // Load filters | 
| 1075       for (let subscription of subscriptions) | 1075       for (let subscription of subscriptions) | 
| 1076       { | 1076       { | 
| 1077         chrome.runtime.sendMessage({ | 1077         browser.runtime.sendMessage({ | 
| 1078           type: "filters.get", | 1078           type: "filters.get", | 
| 1079           subscriptionUrl: subscription.url | 1079           subscriptionUrl: subscription.url | 
| 1080         }, | 1080         }, | 
| 1081         (filters) => | 1081         (filters) => | 
| 1082         { | 1082         { | 
| 1083           loadCustomFilters(filters); | 1083           loadCustomFilters(filters); | 
| 1084         }); | 1084         }); | 
| 1085       } | 1085       } | 
| 1086     }); | 1086     }); | 
| 1087     loadRecommendations(); | 1087     loadRecommendations(); | 
| 1088     chrome.runtime.sendMessage({ | 1088     browser.runtime.sendMessage({ | 
| 1089       type: "prefs.get", | 1089       type: "prefs.get", | 
| 1090       key: "subscriptions_exceptionsurl" | 1090       key: "subscriptions_exceptionsurl" | 
| 1091     }, | 1091     }, | 
| 1092     (url) => | 1092     (url) => | 
| 1093     { | 1093     { | 
| 1094       acceptableAdsUrl = url; | 1094       acceptableAdsUrl = url; | 
| 1095 | 1095 | 
| 1096       chrome.runtime.sendMessage({ | 1096       browser.runtime.sendMessage({ | 
| 1097         type: "prefs.get", | 1097         type: "prefs.get", | 
| 1098         key: "subscriptions_exceptionsurl_privacy" | 1098         key: "subscriptions_exceptionsurl_privacy" | 
| 1099       }, | 1099       }, | 
| 1100       (urlPrivacy) => | 1100       (urlPrivacy) => | 
| 1101       { | 1101       { | 
| 1102         acceptableAdsPrivacyUrl = urlPrivacy; | 1102         acceptableAdsPrivacyUrl = urlPrivacy; | 
| 1103 | 1103 | 
| 1104         // Load user subscriptions | 1104         // Load user subscriptions | 
| 1105         chrome.runtime.sendMessage({ | 1105         browser.runtime.sendMessage({ | 
| 1106           type: "subscriptions.get", | 1106           type: "subscriptions.get", | 
| 1107           downloadable: true | 1107           downloadable: true | 
| 1108         }, | 1108         }, | 
| 1109         (subscriptions) => | 1109         (subscriptions) => | 
| 1110         { | 1110         { | 
| 1111           for (let subscription of subscriptions) | 1111           for (let subscription of subscriptions) | 
| 1112             onSubscriptionMessage("added", subscription); | 1112             onSubscriptionMessage("added", subscription); | 
| 1113 | 1113 | 
| 1114           setAcceptableAds(); | 1114           setAcceptableAds(); | 
| 1115         }); | 1115         }); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1153 | 1153 | 
| 1154     let message = { | 1154     let message = { | 
| 1155       type: messageType, | 1155       type: messageType, | 
| 1156       url | 1156       url | 
| 1157     }; | 1157     }; | 
| 1158     if (title) | 1158     if (title) | 
| 1159       message.title = title; | 1159       message.title = title; | 
| 1160     if (homepage) | 1160     if (homepage) | 
| 1161       message.homepage = homepage; | 1161       message.homepage = homepage; | 
| 1162 | 1162 | 
| 1163     chrome.runtime.sendMessage(message); | 1163     browser.runtime.sendMessage(message); | 
| 1164   } | 1164   } | 
| 1165 | 1165 | 
| 1166   function onFilterMessage(action, filter) | 1166   function onFilterMessage(action, filter) | 
| 1167   { | 1167   { | 
| 1168     switch (action) | 1168     switch (action) | 
| 1169     { | 1169     { | 
| 1170       case "added": | 1170       case "added": | 
| 1171         filter[timestampUI] = Date.now(); | 1171         filter[timestampUI] = Date.now(); | 
| 1172         updateFilter(filter); | 1172         updateFilter(filter); | 
| 1173         break; | 1173         break; | 
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1264   { | 1264   { | 
| 1265     let checkPref = getPref.checks[key] || getPref.checkNone; | 1265     let checkPref = getPref.checks[key] || getPref.checkNone; | 
| 1266     checkPref((isActive) => | 1266     checkPref((isActive) => | 
| 1267     { | 1267     { | 
| 1268       if (!isActive) | 1268       if (!isActive) | 
| 1269       { | 1269       { | 
| 1270         hidePref(key, !isActive); | 1270         hidePref(key, !isActive); | 
| 1271         return; | 1271         return; | 
| 1272       } | 1272       } | 
| 1273 | 1273 | 
| 1274       chrome.runtime.sendMessage({ | 1274       browser.runtime.sendMessage({ | 
| 1275         type: "prefs.get", | 1275         type: "prefs.get", | 
| 1276         key | 1276         key | 
| 1277       }, callback); | 1277       }, callback); | 
| 1278     }); | 1278     }); | 
| 1279   } | 1279   } | 
| 1280 | 1280 | 
| 1281   getPref.checkNone = function(callback) | 1281   getPref.checkNone = function(callback) | 
| 1282   { | 1282   { | 
| 1283     callback(true); | 1283     callback(true); | 
| 1284   }; | 1284   }; | 
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1358         break; | 1358         break; | 
| 1359       case "prefs.respond": | 1359       case "prefs.respond": | 
| 1360         onPrefMessage(message.action, message.args[0], false); | 1360         onPrefMessage(message.action, message.args[0], false); | 
| 1361         break; | 1361         break; | 
| 1362       case "subscriptions.respond": | 1362       case "subscriptions.respond": | 
| 1363         onSubscriptionMessage(message.action, message.args[0]); | 1363         onSubscriptionMessage(message.action, message.args[0]); | 
| 1364         break; | 1364         break; | 
| 1365     } | 1365     } | 
| 1366   }); | 1366   }); | 
| 1367 | 1367 | 
| 1368   chrome.runtime.sendMessage({ | 1368   browser.runtime.sendMessage({ | 
| 1369     type: "app.listen", | 1369     type: "app.listen", | 
| 1370     filter: ["addSubscription", "focusSection"] | 1370     filter: ["addSubscription", "focusSection"] | 
| 1371   }); | 1371   }); | 
| 1372   chrome.runtime.sendMessage({ | 1372   browser.runtime.sendMessage({ | 
| 1373     type: "filters.listen", | 1373     type: "filters.listen", | 
| 1374     filter: ["added", "loaded", "removed"] | 1374     filter: ["added", "loaded", "removed"] | 
| 1375   }); | 1375   }); | 
| 1376   chrome.runtime.sendMessage({ | 1376   browser.runtime.sendMessage({ | 
| 1377     type: "prefs.listen", | 1377     type: "prefs.listen", | 
| 1378     filter: ["notifications_ignoredcategories", "notifications_showui", | 1378     filter: ["notifications_ignoredcategories", "notifications_showui", | 
| 1379              "show_devtools_panel", "shouldShowBlockElementMenu"] | 1379              "show_devtools_panel", "shouldShowBlockElementMenu"] | 
| 1380   }); | 1380   }); | 
| 1381   chrome.runtime.sendMessage({ | 1381   browser.runtime.sendMessage({ | 
| 1382     type: "subscriptions.listen", | 1382     type: "subscriptions.listen", | 
| 1383     filter: ["added", "disabled", "homepage", "lastDownload", "removed", | 1383     filter: ["added", "disabled", "homepage", "lastDownload", "removed", | 
| 1384              "title", "downloadStatus", "downloading"] | 1384              "title", "downloadStatus", "downloading"] | 
| 1385   }); | 1385   }); | 
| 1386 | 1386 | 
| 1387   window.addEventListener("DOMContentLoaded", onDOMLoaded, false); | 1387   window.addEventListener("DOMContentLoaded", onDOMLoaded, false); | 
| 1388   window.addEventListener("hashchange", onHashChange, false); | 1388   window.addEventListener("hashchange", onHashChange, false); | 
| 1389 } | 1389 } | 
| OLD | NEW | 
|---|