| Index: popup.js |
| =================================================================== |
| --- a/popup.js |
| +++ b/popup.js |
| @@ -12,16 +12,43 @@ |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| "use strict"; |
| +const shareURL = "https://adblockplus.org/"; |
| +const messageMark = {}; |
| + |
| +const shareLinks = { |
| + facebook: ["https://www.facebook.com/dialog/feed", { |
| + app_id: "475542399197328", |
| + link: shareURL, |
| + redirect_uri: "https://www.facebook.com/", |
| + ref: "adcounter", |
| + name: messageMark, |
| + actions: JSON.stringify([ |
| + { |
| + name: chrome.i18n.getMessage("stats_share_download"), |
| + link: shareURL |
| + } |
| + ]) |
| + }], |
| + gplus: ["https://plus.google.com/share", { |
| + url: shareURL |
| + }], |
| + twitter: ["https://twitter.com/intent/tweet", { |
| + text: messageMark, |
| + url: shareURL, |
| + via: "AdblockPlus" |
| + }] |
| +}; |
| + |
| let tab = null; |
| function getPref(key, callback) |
| { |
| chrome.runtime.sendMessage({type: "prefs.get", key}, callback); |
| } |
| function setPref(key, value, callback) |
| @@ -65,17 +92,171 @@ |
| { |
| chrome.runtime.onMessage.removeListener(onMessage); |
| resolve(); |
| } |
| }); |
| }); |
| } |
| -function onLoad() |
| +function toggleEnabled() |
| +{ |
| + let disabled = document.body.classList.toggle("disabled"); |
| + chrome.runtime.sendMessage({ |
| + type: disabled ? "filters.whitelist" : "filters.unwhitelist", |
| + tab |
| + }); |
| +} |
| + |
| +function activateClickHide() |
| +{ |
| + document.body.classList.add("clickhide-active"); |
| + chrome.tabs.sendMessage(tab.id, { |
| + type: "composer.content.startPickingElement" |
| + }); |
| + |
| + // Close the popup after a few seconds, so user doesn't have to |
| + activateClickHide.timeout = window.setTimeout(window.close, 5000); |
| +} |
| + |
| +function cancelClickHide() |
| +{ |
| + if (activateClickHide.timeout) |
| + { |
| + window.clearTimeout(activateClickHide.timeout); |
| + activateClickHide.timeout = null; |
| + } |
| + document.body.classList.remove("clickhide-active"); |
| + chrome.tabs.sendMessage(tab.id, {type: "composer.content.finished"}); |
| +} |
| + |
| +function toggleCollapse(event) |
| +{ |
| + let collapser = event.currentTarget; |
| + let collapsible = document.getElementById(collapser.dataset.collapsible); |
| + collapsible.classList.toggle("collapsed"); |
| + togglePref(collapser.dataset.option); |
| +} |
| + |
| +function getDocLinks(notification) |
| +{ |
| + if (!notification.links) |
| + return Promise.resolve([]); |
| + |
| + return Promise.all( |
| + notification.links.map(link => |
| + { |
| + return new Promise((resolve, reject) => |
| + { |
| + chrome.runtime.sendMessage({ |
| + type: "app.get", |
| + what: "doclink", |
| + link |
| + }, resolve); |
| + }); |
| + }) |
| + ); |
| +} |
| + |
| +function insertMessage(element, text, links) |
| +{ |
| + let match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(text); |
| + if (!match) |
| + { |
| + element.appendChild(document.createTextNode(text)); |
| + return; |
| + } |
| + |
| + let before = match[1]; |
| + let tagName = match[2]; |
| + let value = match[3]; |
| + let after = match[4]; |
| + |
| + insertMessage(element, before, links); |
| + |
| + let newElement = document.createElement(tagName); |
| + if (tagName == "a" && links && links.length) |
| + newElement.href = links.shift(); |
| + insertMessage(newElement, value, links); |
| + element.appendChild(newElement); |
| + |
| + insertMessage(element, after, links); |
| +} |
| + |
| +function createShareLink(network, blockedCount) |
| +{ |
| + let url = shareLinks[network][0]; |
| + let params = shareLinks[network][1]; |
| + |
| + let querystring = []; |
| + for (let key in params) |
| + { |
| + let value = params[key]; |
| + if (value == messageMark) |
| + value = chrome.i18n.getMessage("stats_share_message", blockedCount); |
| + querystring.push( |
| + encodeURIComponent(key) + "=" + encodeURIComponent(value) |
| + ); |
| + } |
| + return url + "?" + querystring.join("&"); |
| +} |
| + |
| +function updateStats() |
| +{ |
| + let statsPage = document.getElementById("stats-page"); |
| + chrome.runtime.sendMessage({ |
| + type: "stats.getBlockedPerPage", |
| + tab |
| + }, |
| + blockedPage => |
| + { |
| + ext.i18n.setElementText(statsPage, "stats_label_page", |
| + [blockedPage.toLocaleString()]); |
| + }); |
| + |
| + let statsTotal = document.getElementById("stats-total"); |
| + getPref("blocked_total", blockedTotal => |
| + { |
| + ext.i18n.setElementText(statsTotal, "stats_label_total", |
| + [blockedTotal.toLocaleString()]); |
| + }); |
| +} |
| + |
| +function share(event) |
| +{ |
| + getPref("blocked_total", blockedTotal => |
| + { |
| + // Easter Egg |
| + if (blockedTotal <= 9000 || blockedTotal >= 10000) |
| + { |
| + blockedTotal = blockedTotal.toLocaleString(); |
| + } |
| + else |
| + { |
| + blockedTotal = chrome.i18n.getMessage("stats_over", |
| + (9000).toLocaleString()); |
| + } |
| + |
| + chrome.tabs.create({ |
| + url: createShareLink(event.target.dataset.social, blockedTotal) |
| + }); |
| + }); |
| +} |
| + |
| +function toggleIconNumber() |
| +{ |
| + togglePref("show_statsinicon", showStatsInIcon => |
| + { |
| + document.getElementById("show-iconnumber").setAttribute( |
| + "aria-checked", showStatsInIcon |
| + ); |
| + }); |
| +} |
| + |
| +document.addEventListener("DOMContentLoaded", () => |
| { |
| chrome.tabs.query({active: true, lastFocusedWindow: true}, tabs => |
| { |
| if (tabs.length > 0) |
| tab = {id: tabs[0].id, url: tabs[0].url}; |
| let urlProtocol = tab && tab.url && new URL(tab.url).protocol; |
| @@ -109,81 +290,106 @@ |
| type: "composer.content.getState" |
| }, |
| response => |
| { |
| if (response && response.active) |
| document.body.classList.add("clickhide-active"); |
| }); |
| } |
| + |
| + updateStats(); |
| + document.getElementById("stats-container").removeAttribute("hidden"); |
| }); |
| document.getElementById("enabled").addEventListener( |
| - "click", toggleEnabled, false |
| + "click", toggleEnabled |
| ); |
| document.getElementById("clickhide").addEventListener( |
| - "click", activateClickHide, false |
| + "click", activateClickHide |
| ); |
| document.getElementById("clickhide-cancel").addEventListener( |
| - "click", cancelClickHide, false |
| + "click", cancelClickHide |
| ); |
| document.getElementById("options").addEventListener("click", () => |
| { |
| chrome.runtime.sendMessage({type: "app.open", what: "options"}); |
| window.close(); |
| - }, false); |
| + }); |
| // Set up collapsing of menu items |
| for (let collapser of document.getElementsByClassName("collapse")) |
| { |
| - collapser.addEventListener("click", toggleCollapse, false); |
| + collapser.addEventListener("click", toggleCollapse); |
| getPref(collapser.dataset.option, value => |
| { |
| if (value) |
| { |
| document.getElementById( |
| collapser.dataset.collapsible |
| ).classList.remove("collapsed"); |
| } |
| }); |
| } |
| -} |
| -function toggleEnabled() |
| -{ |
| - let disabled = document.body.classList.toggle("disabled"); |
| - chrome.runtime.sendMessage({ |
| - type: disabled ? "filters.whitelist" : "filters.unwhitelist", |
| - tab |
| + document.getElementById("share-box").addEventListener("click", share); |
| + let showIconNumber = document.getElementById("show-iconnumber"); |
| + getPref("show_statsinicon", showStatsInIcon => |
| + { |
| + showIconNumber.setAttribute("aria-checked", showStatsInIcon); |
| }); |
| -} |
| + showIconNumber.addEventListener("click", toggleIconNumber); |
| + document.querySelector("label[for='show-iconnumber']").addEventListener( |
| + "click", toggleIconNumber |
| + ); |
| +}); |
| -function activateClickHide() |
| +window.addEventListener("load", () => |
| { |
| - document.body.classList.add("clickhide-active"); |
| - chrome.tabs.sendMessage(tab.id, { |
| - type: "composer.content.startPickingElement" |
| - }); |
| + chrome.runtime.sendMessage({ |
| + type: "notifications.get", |
| + displayMethod: "popup" |
| + }, notification => |
| + { |
| + if (!notification) |
| + return; |
| + |
| + let titleElement = document.getElementById("notification-title"); |
| + let messageElement = document.getElementById("notification-message"); |
| + |
| + titleElement.textContent = notification.texts.title; |
| + |
| + getDocLinks(notification).then(docLinks => |
| + { |
| + insertMessage(messageElement, notification.texts.message, docLinks); |
| - // Close the popup after a few seconds, so user doesn't have to |
| - activateClickHide.timeout = window.setTimeout(window.close, 5000); |
| -} |
| + messageElement.addEventListener("click", event => |
| + { |
| + let link = event.target; |
| + while (link && link != messageElement && link.localName != "a") |
| + link = link.parentNode; |
| + if (!link) |
| + return; |
| + event.preventDefault(); |
| + event.stopPropagation(); |
| + chrome.tabs.create({url: link.href}); |
| + }); |
| + }); |
| -function cancelClickHide() |
| -{ |
| - if (activateClickHide.timeout) |
| - { |
| - window.clearTimeout(activateClickHide.timeout); |
| - activateClickHide.timeout = null; |
| - } |
| - document.body.classList.remove("clickhide-active"); |
| - chrome.tabs.sendMessage(tab.id, {type: "composer.content.finished"}); |
| -} |
| + let notificationElement = document.getElementById("notification"); |
| + notificationElement.className = notification.type; |
| + notificationElement.hidden = false; |
| + notificationElement.addEventListener("click", event => |
| + { |
| + if (event.target.id == "notification-close") |
| + notificationElement.classList.add("closing"); |
| + else if (event.target.id == "notification-optout" || |
| + event.target.id == "notification-hide") |
| + { |
| + if (event.target.id == "notification-optout") |
| + setPref("notifications_ignoredcategories", true); |
| -function toggleCollapse(event) |
| -{ |
| - let collapser = event.currentTarget; |
| - let collapsible = document.getElementById(collapser.dataset.collapsible); |
| - collapsible.classList.toggle("collapsed"); |
| - togglePref(collapser.dataset.option); |
| -} |
| - |
| -document.addEventListener("DOMContentLoaded", onLoad, false); |
| + notificationElement.hidden = true; |
| + notification.onClicked(); |
| + } |
| + }, true); |
| + }); |
| +}); |