| 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 11 matching lines...) Expand all  Loading... | 
| 22 | 22 | 
| 23 const shareLinks = { | 23 const shareLinks = { | 
| 24   facebook: ["https://www.facebook.com/dialog/feed", { | 24   facebook: ["https://www.facebook.com/dialog/feed", { | 
| 25     app_id: "475542399197328", | 25     app_id: "475542399197328", | 
| 26     link: shareURL, | 26     link: shareURL, | 
| 27     redirect_uri: "https://www.facebook.com/", | 27     redirect_uri: "https://www.facebook.com/", | 
| 28     ref: "adcounter", | 28     ref: "adcounter", | 
| 29     name: messageMark, | 29     name: messageMark, | 
| 30     actions: JSON.stringify([ | 30     actions: JSON.stringify([ | 
| 31       { | 31       { | 
| 32         name: chrome.i18n.getMessage("stats_share_download"), | 32         name: browser.i18n.getMessage("stats_share_download"), | 
| 33         link: shareURL | 33         link: shareURL | 
| 34       } | 34       } | 
| 35     ]) | 35     ]) | 
| 36   }], | 36   }], | 
| 37   gplus: ["https://plus.google.com/share", { | 37   gplus: ["https://plus.google.com/share", { | 
| 38     url: shareURL | 38     url: shareURL | 
| 39   }], | 39   }], | 
| 40   twitter: ["https://twitter.com/intent/tweet", { | 40   twitter: ["https://twitter.com/intent/tweet", { | 
| 41     text: messageMark, | 41     text: messageMark, | 
| 42     url: shareURL, | 42     url: shareURL, | 
| 43     via: "AdblockPlus" | 43     via: "AdblockPlus" | 
| 44   }] | 44   }] | 
| 45 }; | 45 }; | 
| 46 | 46 | 
| 47 let tab = null; | 47 let tab = null; | 
| 48 | 48 | 
| 49 function getPref(key, callback) | 49 function getPref(key, callback) | 
| 50 { | 50 { | 
| 51   chrome.runtime.sendMessage({type: "prefs.get", key}, callback); | 51   browser.runtime.sendMessage({type: "prefs.get", key}, callback); | 
| 52 } | 52 } | 
| 53 | 53 | 
| 54 function setPref(key, value, callback) | 54 function setPref(key, value, callback) | 
| 55 { | 55 { | 
| 56   chrome.runtime.sendMessage({type: "prefs.set", key, value}, callback); | 56   browser.runtime.sendMessage({type: "prefs.set", key, value}, callback); | 
| 57 } | 57 } | 
| 58 | 58 | 
| 59 function togglePref(key, callback) | 59 function togglePref(key, callback) | 
| 60 { | 60 { | 
| 61   chrome.runtime.sendMessage({type: "prefs.toggle", key}, callback); | 61   browser.runtime.sendMessage({type: "prefs.toggle", key}, callback); | 
| 62 } | 62 } | 
| 63 | 63 | 
| 64 function isPageWhitelisted(callback) | 64 function isPageWhitelisted(callback) | 
| 65 { | 65 { | 
| 66   chrome.runtime.sendMessage({type: "filters.isWhitelisted", tab}, callback); | 66   browser.runtime.sendMessage({type: "filters.isWhitelisted", tab}, callback); | 
| 67 } | 67 } | 
| 68 | 68 | 
| 69 function whenPageReady() | 69 function whenPageReady() | 
| 70 { | 70 { | 
| 71   return new Promise(resolve => | 71   return new Promise(resolve => | 
| 72   { | 72   { | 
| 73     function onMessage(message, sender) | 73     function onMessage(message, sender) | 
| 74     { | 74     { | 
| 75       if (message.type == "composer.ready" && sender.page && | 75       if (message.type == "composer.ready" && sender.page && | 
| 76           sender.page.id == tab.id) | 76           sender.page.id == tab.id) | 
| 77       { | 77       { | 
| 78         chrome.runtime.onMessage.removeListener(onMessage); | 78         browser.runtime.onMessage.removeListener(onMessage); | 
| 79         resolve(); | 79         resolve(); | 
| 80       } | 80       } | 
| 81     } | 81     } | 
| 82 | 82 | 
| 83     chrome.runtime.onMessage.addListener(onMessage); | 83     browser.runtime.onMessage.addListener(onMessage); | 
| 84 | 84 | 
| 85     chrome.runtime.sendMessage({ | 85     browser.runtime.sendMessage({ | 
| 86       type: "composer.isPageReady", | 86       type: "composer.isPageReady", | 
| 87       pageId: tab.id | 87       pageId: tab.id | 
| 88     }, | 88     }, | 
| 89     ready => | 89     ready => | 
| 90     { | 90     { | 
| 91       if (ready) | 91       if (ready) | 
| 92       { | 92       { | 
| 93         chrome.runtime.onMessage.removeListener(onMessage); | 93         browser.runtime.onMessage.removeListener(onMessage); | 
| 94         resolve(); | 94         resolve(); | 
| 95       } | 95       } | 
| 96     }); | 96     }); | 
| 97   }); | 97   }); | 
| 98 } | 98 } | 
| 99 | 99 | 
| 100 function toggleEnabled() | 100 function toggleEnabled() | 
| 101 { | 101 { | 
| 102   let disabled = document.body.classList.toggle("disabled"); | 102   let disabled = document.body.classList.toggle("disabled"); | 
| 103   chrome.runtime.sendMessage({ | 103   browser.runtime.sendMessage({ | 
| 104     type: disabled ? "filters.whitelist" : "filters.unwhitelist", | 104     type: disabled ? "filters.whitelist" : "filters.unwhitelist", | 
| 105     tab | 105     tab | 
| 106   }); | 106   }); | 
| 107 } | 107 } | 
| 108 | 108 | 
| 109 function activateClickHide() | 109 function activateClickHide() | 
| 110 { | 110 { | 
| 111   document.body.classList.add("clickhide-active"); | 111   document.body.classList.add("clickhide-active"); | 
| 112   chrome.tabs.sendMessage(tab.id, { | 112   browser.tabs.sendMessage(tab.id, { | 
| 113     type: "composer.content.startPickingElement" | 113     type: "composer.content.startPickingElement" | 
| 114   }); | 114   }); | 
| 115 | 115 | 
| 116   // Close the popup after a few seconds, so user doesn't have to | 116   // Close the popup after a few seconds, so user doesn't have to | 
| 117   activateClickHide.timeout = window.setTimeout(window.close, 5000); | 117   activateClickHide.timeout = window.setTimeout(window.close, 5000); | 
| 118 } | 118 } | 
| 119 | 119 | 
| 120 function cancelClickHide() | 120 function cancelClickHide() | 
| 121 { | 121 { | 
| 122   if (activateClickHide.timeout) | 122   if (activateClickHide.timeout) | 
| 123   { | 123   { | 
| 124     window.clearTimeout(activateClickHide.timeout); | 124     window.clearTimeout(activateClickHide.timeout); | 
| 125     activateClickHide.timeout = null; | 125     activateClickHide.timeout = null; | 
| 126   } | 126   } | 
| 127   document.body.classList.remove("clickhide-active"); | 127   document.body.classList.remove("clickhide-active"); | 
| 128   chrome.tabs.sendMessage(tab.id, {type: "composer.content.finished"}); | 128   browser.tabs.sendMessage(tab.id, {type: "composer.content.finished"}); | 
| 129 } | 129 } | 
| 130 | 130 | 
| 131 function toggleCollapse(event) | 131 function toggleCollapse(event) | 
| 132 { | 132 { | 
| 133   let collapser = event.currentTarget; | 133   let collapser = event.currentTarget; | 
| 134   let collapsible = document.getElementById(collapser.dataset.collapsible); | 134   let collapsible = document.getElementById(collapser.dataset.collapsible); | 
| 135   collapsible.classList.toggle("collapsed"); | 135   collapsible.classList.toggle("collapsed"); | 
| 136   togglePref(collapser.dataset.option); | 136   togglePref(collapser.dataset.option); | 
| 137 } | 137 } | 
| 138 | 138 | 
| 139 function getDocLinks(notification) | 139 function getDocLinks(notification) | 
| 140 { | 140 { | 
| 141   if (!notification.links) | 141   if (!notification.links) | 
| 142     return Promise.resolve([]); | 142     return Promise.resolve([]); | 
| 143 | 143 | 
| 144   return Promise.all( | 144   return Promise.all( | 
| 145     notification.links.map(link => | 145     notification.links.map(link => | 
| 146     { | 146     { | 
| 147       return new Promise((resolve, reject) => | 147       return new Promise((resolve, reject) => | 
| 148       { | 148       { | 
| 149         chrome.runtime.sendMessage({ | 149         browser.runtime.sendMessage({ | 
| 150           type: "app.get", | 150           type: "app.get", | 
| 151           what: "doclink", | 151           what: "doclink", | 
| 152           link | 152           link | 
| 153         }, resolve); | 153         }, resolve); | 
| 154       }); | 154       }); | 
| 155     }) | 155     }) | 
| 156   ); | 156   ); | 
| 157 } | 157 } | 
| 158 | 158 | 
| 159 function insertMessage(element, text, links) | 159 function insertMessage(element, text, links) | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 184 function createShareLink(network, blockedCount) | 184 function createShareLink(network, blockedCount) | 
| 185 { | 185 { | 
| 186   let url = shareLinks[network][0]; | 186   let url = shareLinks[network][0]; | 
| 187   let params = shareLinks[network][1]; | 187   let params = shareLinks[network][1]; | 
| 188 | 188 | 
| 189   let querystring = []; | 189   let querystring = []; | 
| 190   for (let key in params) | 190   for (let key in params) | 
| 191   { | 191   { | 
| 192     let value = params[key]; | 192     let value = params[key]; | 
| 193     if (value == messageMark) | 193     if (value == messageMark) | 
| 194       value = chrome.i18n.getMessage("stats_share_message", blockedCount); | 194       value = browser.i18n.getMessage("stats_share_message", blockedCount); | 
| 195     querystring.push( | 195     querystring.push( | 
| 196       encodeURIComponent(key) + "=" + encodeURIComponent(value) | 196       encodeURIComponent(key) + "=" + encodeURIComponent(value) | 
| 197     ); | 197     ); | 
| 198   } | 198   } | 
| 199   return url + "?" + querystring.join("&"); | 199   return url + "?" + querystring.join("&"); | 
| 200 } | 200 } | 
| 201 | 201 | 
| 202 function updateStats() | 202 function updateStats() | 
| 203 { | 203 { | 
| 204   let statsPage = document.getElementById("stats-page"); | 204   let statsPage = document.getElementById("stats-page"); | 
| 205   chrome.runtime.sendMessage({ | 205   browser.runtime.sendMessage({ | 
| 206     type: "stats.getBlockedPerPage", | 206     type: "stats.getBlockedPerPage", | 
| 207     tab | 207     tab | 
| 208   }, | 208   }, | 
| 209   blockedPage => | 209   blockedPage => | 
| 210   { | 210   { | 
| 211     ext.i18n.setElementText(statsPage, "stats_label_page", | 211     ext.i18n.setElementText(statsPage, "stats_label_page", | 
| 212                             [blockedPage.toLocaleString()]); | 212                             [blockedPage.toLocaleString()]); | 
| 213   }); | 213   }); | 
| 214 | 214 | 
| 215   let statsTotal = document.getElementById("stats-total"); | 215   let statsTotal = document.getElementById("stats-total"); | 
| 216   getPref("blocked_total", blockedTotal => | 216   getPref("blocked_total", blockedTotal => | 
| 217   { | 217   { | 
| 218     ext.i18n.setElementText(statsTotal, "stats_label_total", | 218     ext.i18n.setElementText(statsTotal, "stats_label_total", | 
| 219                             [blockedTotal.toLocaleString()]); | 219                             [blockedTotal.toLocaleString()]); | 
| 220   }); | 220   }); | 
| 221 } | 221 } | 
| 222 | 222 | 
| 223 function share(event) | 223 function share(event) | 
| 224 { | 224 { | 
| 225   getPref("blocked_total", blockedTotal => | 225   getPref("blocked_total", blockedTotal => | 
| 226   { | 226   { | 
| 227     // Easter Egg | 227     // Easter Egg | 
| 228     if (blockedTotal <= 9000 || blockedTotal >= 10000) | 228     if (blockedTotal <= 9000 || blockedTotal >= 10000) | 
| 229     { | 229     { | 
| 230       blockedTotal = blockedTotal.toLocaleString(); | 230       blockedTotal = blockedTotal.toLocaleString(); | 
| 231     } | 231     } | 
| 232     else | 232     else | 
| 233     { | 233     { | 
| 234       blockedTotal = chrome.i18n.getMessage("stats_over", | 234       blockedTotal = browser.i18n.getMessage("stats_over", | 
| 235                                             (9000).toLocaleString()); | 235                                             (9000).toLocaleString()); | 
| 236     } | 236     } | 
| 237 | 237 | 
| 238     chrome.tabs.create({ | 238     browser.tabs.create({ | 
| 239       url: createShareLink(event.target.dataset.social, blockedTotal) | 239       url: createShareLink(event.target.dataset.social, blockedTotal) | 
| 240     }); | 240     }); | 
| 241   }); | 241   }); | 
| 242 } | 242 } | 
| 243 | 243 | 
| 244 function toggleIconNumber() | 244 function toggleIconNumber() | 
| 245 { | 245 { | 
| 246   togglePref("show_statsinicon", showStatsInIcon => | 246   togglePref("show_statsinicon", showStatsInIcon => | 
| 247   { | 247   { | 
| 248     document.getElementById("show-iconnumber").setAttribute( | 248     document.getElementById("show-iconnumber").setAttribute( | 
| 249       "aria-checked", showStatsInIcon | 249       "aria-checked", showStatsInIcon | 
| 250     ); | 250     ); | 
| 251   }); | 251   }); | 
| 252 } | 252 } | 
| 253 | 253 | 
| 254 document.addEventListener("DOMContentLoaded", () => | 254 document.addEventListener("DOMContentLoaded", () => | 
| 255 { | 255 { | 
| 256   chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => | 256   browser.tabs.query({active: true, lastFocusedWindow: true}, tabs => | 
| 257   { | 257   { | 
| 258     if (tabs.length > 0) | 258     if (tabs.length > 0) | 
| 259       tab = {id: tabs[0].id, url: tabs[0].url}; | 259       tab = {id: tabs[0].id, url: tabs[0].url}; | 
| 260 | 260 | 
| 261     let urlProtocol = tab && tab.url && new URL(tab.url).protocol; | 261     let urlProtocol = tab && tab.url && new URL(tab.url).protocol; | 
| 262 | 262 | 
| 263     // Mark page as 'local' to hide non-relevant elements | 263     // Mark page as 'local' to hide non-relevant elements | 
| 264     if (urlProtocol != "http:" && urlProtocol != "https:") | 264     if (urlProtocol != "http:" && urlProtocol != "https:") | 
| 265     { | 265     { | 
| 266       document.body.classList.add("local"); | 266       document.body.classList.add("local"); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 279     // whether it has cached filters. If so, ask the user whether she | 279     // whether it has cached filters. If so, ask the user whether she | 
| 280     // wants those filters. Otherwise, we are in default state. | 280     // wants those filters. Otherwise, we are in default state. | 
| 281     if (tab) | 281     if (tab) | 
| 282     { | 282     { | 
| 283       isPageWhitelisted(whitelisted => | 283       isPageWhitelisted(whitelisted => | 
| 284       { | 284       { | 
| 285         if (whitelisted) | 285         if (whitelisted) | 
| 286           document.body.classList.add("disabled"); | 286           document.body.classList.add("disabled"); | 
| 287       }); | 287       }); | 
| 288 | 288 | 
| 289       chrome.tabs.sendMessage(tab.id, { | 289       browser.tabs.sendMessage(tab.id, { | 
| 290         type: "composer.content.getState" | 290         type: "composer.content.getState" | 
| 291       }, | 291       }, | 
| 292       response => | 292       response => | 
| 293       { | 293       { | 
| 294         if (response && response.active) | 294         if (response && response.active) | 
| 295           document.body.classList.add("clickhide-active"); | 295           document.body.classList.add("clickhide-active"); | 
| 296       }); | 296       }); | 
| 297     } | 297     } | 
| 298 | 298 | 
| 299     updateStats(); | 299     updateStats(); | 
| 300     document.getElementById("stats-container").removeAttribute("hidden"); | 300     document.getElementById("stats-container").removeAttribute("hidden"); | 
| 301   }); | 301   }); | 
| 302 | 302 | 
| 303   document.getElementById("enabled").addEventListener( | 303   document.getElementById("enabled").addEventListener( | 
| 304     "click", toggleEnabled | 304     "click", toggleEnabled | 
| 305   ); | 305   ); | 
| 306   document.getElementById("clickhide").addEventListener( | 306   document.getElementById("clickhide").addEventListener( | 
| 307     "click", activateClickHide | 307     "click", activateClickHide | 
| 308   ); | 308   ); | 
| 309   document.getElementById("clickhide-cancel").addEventListener( | 309   document.getElementById("clickhide-cancel").addEventListener( | 
| 310     "click", cancelClickHide | 310     "click", cancelClickHide | 
| 311   ); | 311   ); | 
| 312   document.getElementById("options").addEventListener("click", () => | 312   document.getElementById("options").addEventListener("click", () => | 
| 313   { | 313   { | 
| 314     chrome.runtime.sendMessage({type: "app.open", what: "options"}); | 314     browser.runtime.sendMessage({type: "app.open", what: "options"}); | 
| 315     window.close(); | 315     window.close(); | 
| 316   }); | 316   }); | 
| 317 | 317 | 
| 318   // Set up collapsing of menu items | 318   // Set up collapsing of menu items | 
| 319   for (let collapser of document.getElementsByClassName("collapse")) | 319   for (let collapser of document.getElementsByClassName("collapse")) | 
| 320   { | 320   { | 
| 321     collapser.addEventListener("click", toggleCollapse); | 321     collapser.addEventListener("click", toggleCollapse); | 
| 322     getPref(collapser.dataset.option, value => | 322     getPref(collapser.dataset.option, value => | 
| 323     { | 323     { | 
| 324       if (value) | 324       if (value) | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 337     showIconNumber.setAttribute("aria-checked", showStatsInIcon); | 337     showIconNumber.setAttribute("aria-checked", showStatsInIcon); | 
| 338   }); | 338   }); | 
| 339   showIconNumber.addEventListener("click", toggleIconNumber); | 339   showIconNumber.addEventListener("click", toggleIconNumber); | 
| 340   document.querySelector("label[for='show-iconnumber']").addEventListener( | 340   document.querySelector("label[for='show-iconnumber']").addEventListener( | 
| 341     "click", toggleIconNumber | 341     "click", toggleIconNumber | 
| 342   ); | 342   ); | 
| 343 }); | 343 }); | 
| 344 | 344 | 
| 345 window.addEventListener("load", () => | 345 window.addEventListener("load", () => | 
| 346 { | 346 { | 
| 347   chrome.runtime.sendMessage({ | 347   browser.runtime.sendMessage({ | 
| 348     type: "notifications.get", | 348     type: "notifications.get", | 
| 349     displayMethod: "popup" | 349     displayMethod: "popup" | 
| 350   }, notification => | 350   }, notification => | 
| 351   { | 351   { | 
| 352     if (!notification) | 352     if (!notification) | 
| 353       return; | 353       return; | 
| 354 | 354 | 
| 355     let titleElement = document.getElementById("notification-title"); | 355     let titleElement = document.getElementById("notification-title"); | 
| 356     let messageElement = document.getElementById("notification-message"); | 356     let messageElement = document.getElementById("notification-message"); | 
| 357 | 357 | 
| 358     titleElement.textContent = notification.texts.title; | 358     titleElement.textContent = notification.texts.title; | 
| 359 | 359 | 
| 360     getDocLinks(notification).then(docLinks => | 360     getDocLinks(notification).then(docLinks => | 
| 361     { | 361     { | 
| 362       insertMessage(messageElement, notification.texts.message, docLinks); | 362       insertMessage(messageElement, notification.texts.message, docLinks); | 
| 363 | 363 | 
| 364       messageElement.addEventListener("click", event => | 364       messageElement.addEventListener("click", event => | 
| 365       { | 365       { | 
| 366         let link = event.target; | 366         let link = event.target; | 
| 367         while (link && link != messageElement && link.localName != "a") | 367         while (link && link != messageElement && link.localName != "a") | 
| 368           link = link.parentNode; | 368           link = link.parentNode; | 
| 369         if (!link) | 369         if (!link) | 
| 370           return; | 370           return; | 
| 371         event.preventDefault(); | 371         event.preventDefault(); | 
| 372         event.stopPropagation(); | 372         event.stopPropagation(); | 
| 373         chrome.tabs.create({url: link.href}); | 373         browser.tabs.create({url: link.href}); | 
| 374       }); | 374       }); | 
| 375     }); | 375     }); | 
| 376 | 376 | 
| 377     let notificationElement = document.getElementById("notification"); | 377     let notificationElement = document.getElementById("notification"); | 
| 378     notificationElement.className = notification.type; | 378     notificationElement.className = notification.type; | 
| 379     notificationElement.hidden = false; | 379     notificationElement.hidden = false; | 
| 380     notificationElement.addEventListener("click", event => | 380     notificationElement.addEventListener("click", event => | 
| 381     { | 381     { | 
| 382       if (event.target.id == "notification-close") | 382       if (event.target.id == "notification-close") | 
| 383         notificationElement.classList.add("closing"); | 383         notificationElement.classList.add("closing"); | 
| 384       else if (event.target.id == "notification-optout" || | 384       else if (event.target.id == "notification-optout" || | 
| 385                event.target.id == "notification-hide") | 385                event.target.id == "notification-hide") | 
| 386       { | 386       { | 
| 387         if (event.target.id == "notification-optout") | 387         if (event.target.id == "notification-optout") | 
| 388           setPref("notifications_ignoredcategories", true); | 388           setPref("notifications_ignoredcategories", true); | 
| 389 | 389 | 
| 390         notificationElement.hidden = true; | 390         notificationElement.hidden = true; | 
| 391         notification.onClicked(); | 391         notification.onClicked(); | 
| 392       } | 392       } | 
| 393     }, true); | 393     }, true); | 
| 394   }); | 394   }); | 
| 395 }); | 395 }); | 
| OLD | NEW | 
|---|