| Index: lib/ui.js |
| =================================================================== |
| --- a/lib/ui.js |
| +++ b/lib/ui.js |
| @@ -25,7 +25,7 @@ |
| let {FilterStorage} = require("filterStorage"); |
| let {FilterNotifier} = require("filterNotifier"); |
| let {RequestNotifier} = require("requestNotifier"); |
| -let {Filter} = require("filterClasses"); |
| +let {Filter, ActiveFilter} = require("filterClasses"); |
| let {Subscription, SpecialSubscription, DownloadableSubscription} = require("subscriptionClasses"); |
| let {Synchronizer} = require("synchronizer"); |
| let {KeySelector} = require("keySelector"); |
| @@ -525,6 +525,79 @@ |
| }.bind(this)); |
| addBrowserClickListener(window, this.onBrowserClick.bind(this, window)); |
| + window.document.getElementById("abp-notification-close").addEventListener("command", function(event) |
| + { |
| + window.document.getElementById("abp-notification").hidePopup(); |
| + }, false); |
| + |
| + // Add "anti-adblock messages" notification |
| + function getDomainsFromSubscription(subscription) |
| + { |
| + let domains = []; |
| + for each (let filter in subscription.filters) |
| + if (filter instanceof ActiveFilter) |
| + for (let domain in filter.domains) |
| + if (domain && domains.indexOf(domain) == -1) |
| + domains.push(domain); |
| + return domains; |
| + } |
| + |
| + let antiadblockNotification = { |
| + id: "antiadblock", |
| + type: "question", |
| + title: Utils.getString("notification_antiadblock_title"), |
| + message: Utils.getString("notification_antiadblock_message"), |
| + domains: [], |
| + onApproved: function() |
| + { |
| + let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
| + if (subscription.url in FilterStorage.knownSubscriptions) |
|
Felix Dahlke
2014/02/11 17:19:44
Shouldn't we add it here if it's not in the knownS
Felix Dahlke
2014/02/11 17:57:17
Actually not, it's fine :)
|
| + subscription.disabled = false; |
| + }, |
| + onDeclined: function() |
| + { |
| + let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
| + if (subscription.url in FilterStorage.knownSubscriptions) |
| + subscription.disabled = true; |
| + } |
| + }; |
| + let antiadblockSubscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
| + if (antiadblockSubscription.lastDownload && antiadblockSubscription.disabled) |
| + { |
| + antiadblockNotification.domains = getDomainsFromSubscription(antiadblockSubscription); |
| + Notification.addNotification(antiadblockNotification); |
| + } |
| + FilterNotifier.addListener(function(action, value, newItem, oldItem) |
| + { |
| + if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl) |
| + return; |
| + |
| + if (action == "subscription.updated") |
| + { |
| + antiadblockNotification.domains = getDomainsFromSubscription(value); |
| + Notification.addNotification(antiadblockNotification); |
| + } |
| + else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled)) |
| + { |
| + Notification.removeNotification(antiadblockNotification); |
| + } |
| + }); |
| + |
| + var httpRequestObserver = { |
| + observe: function(subject, topic, data) |
| + { |
| + if (!(subject instanceof Ci.nsIDOMWindow)) |
| + return; |
| + |
| + this._showNextNotification(subject.location.href); |
| + }.bind(this) |
| + }; |
| + Services.obs.addObserver(httpRequestObserver, "content-document-global-created", false); |
| + onShutdown.add(function() |
| + { |
| + Services.obs.removeObserver(httpRequestObserver, "content-document-global-created", false); |
| + }); |
| + |
| // First-run actions? |
| if (!this.firstRunDone) |
| { |
| @@ -770,6 +843,19 @@ |
| addAcceptable = false; |
| } |
| + // Add "anti-adblock messages" subscription for new users and users updating from old ABP versions. |
| + if (Services.vc.compare(prevVersion, "2.5") < 0) |
|
Felix Dahlke
2014/02/11 10:35:27
I think we should show them to every user once act
Thomas Greiner
2014/02/11 16:53:31
This is just the initial download of the filterlis
|
| + { |
| + let subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
| + if (subscription) |
| + { |
| + subscription.disabled = true; |
| + FilterStorage.addSubscription(subscription); |
| + if (subscription instanceof DownloadableSubscription && !subscription.lastDownload) |
| + Synchronizer.execute(subscription); |
| + } |
| + } |
| + |
| if (!addSubscription && !addAcceptable) |
| return; |
| @@ -1765,7 +1851,7 @@ |
| } |
| }, |
| - _showNextNotification: function() |
| + _showNextNotification: function(url) |
| { |
| let window = this.currentWindow; |
| if (!window) |
| @@ -1776,7 +1862,7 @@ |
| if (!button) |
| return; |
| - let notification = Notification.getNextToShow(); |
| + let notification = Notification.getNextToShow(url); |
| if (!notification) |
| return; |
| @@ -1785,6 +1871,10 @@ |
| _showNotification: function(window, button, notification) |
| { |
| + let panel = window.document.getElementById("abp-notification"); |
| + if (panel.state !== "closed") |
| + return; |
| + |
| function insertMessage(element, text, links) |
| { |
| let match = /^(.*?)<(a|strong)>(.*?)<\/\2>(.*)$/.exec(text); |
| @@ -1811,6 +1901,7 @@ |
| let titleElement = window.document.getElementById("abp-notification-title"); |
| titleElement.setAttribute("value", texts.title); |
| let messageElement = window.document.getElementById("abp-notification-message"); |
| + messageElement.innerHTML = ""; |
| let docLinks = []; |
| for each (let link in notification.links) |
| docLinks.push(Utils.getDocLink(link)); |
| @@ -1819,16 +1910,32 @@ |
| messageElement.addEventListener("click", function(event) |
| { |
| let link = event.target; |
| - while (link && link !== messageElement && link.localName !== "a") |
| - link = link.parentNode; |
| - if (!link) |
| + while (!link || link === messageElement || link.localName !== "a") |
| return; |
| event.preventDefault(); |
| event.stopPropagation(); |
| this.loadInBrowser(link.href, window); |
| }.bind(this)); |
| - let panel = window.document.getElementById("abp-notification"); |
| + if (notification.type === "question") |
| + { |
| + function buttonHandler(event) |
| + { |
| + event.preventDefault(); |
| + event.stopPropagation(); |
| + panel.hidePopup(); |
| + |
| + let action = notification[event.target.getAttribute("action")]; |
| + if (typeof action === "function") |
| + action(); |
| + Notification.markAsShown(notification.id); |
| + } |
| + window.document.getElementById("abp-notification-yes").oncommand = buttonHandler; |
| + window.document.getElementById("abp-notification-no").oncommand = buttonHandler; |
| + } |
| + |
| + panel.setAttribute("class", "abp-" + notification.type); |
| + panel.setAttribute("noautohide", notification.type === "question"); |
| panel.openPopup(button, "bottomcenter topcenter", 0, 0, false, false, null); |
| } |
| }; |