Index: background.js |
=================================================================== |
--- a/background.js |
+++ b/background.js |
@@ -18,6 +18,7 @@ |
with(require("filterClasses")) |
{ |
this.Filter = Filter; |
+ this.ActiveFilter = ActiveFilter; |
this.RegExpFilter = RegExpFilter; |
this.BlockingFilter = BlockingFilter; |
this.WhitelistFilter = WhitelistFilter; |
@@ -62,6 +63,8 @@ |
if (!importingOldData) |
addSubscription(prevVersion); |
} |
+ |
+ initAntiAdblockNotification(); |
} |
// update browser actions when whitelisting might have changed, |
@@ -201,6 +204,16 @@ |
addAcceptable = false; |
} |
+ // Add "anti-adblock messages" subscription |
+ var 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; |
@@ -239,6 +252,60 @@ |
notifyUser(); |
} |
+function initAntiAdblockNotification() |
Felix Dahlke
2014/03/18 14:21:41
This is pretty much the same code we have in Firef
Thomas Greiner
2014/03/19 13:45:40
Done.
|
+{ |
+ var notification = { |
+ id: "antiadblock", |
+ type: "question", |
+ title: ext.i18n.getMessage("global_notification_antiadblock_title"), |
+ message: ext.i18n.getMessage("global_notification_antiadblock_message"), |
+ urlFilters: [] |
+ }; |
+ |
+ function notificationListener(approved) |
+ { |
+ var subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
+ if (subscription.url in FilterStorage.knownSubscriptions) |
+ subscription.disabled = !approved; |
+ } |
+ |
+ function addAntiAdblockNotification(subscription) |
+ { |
+ var urlFilters = []; |
+ subscription.filters.forEach(function(filter) |
+ { |
+ if (filter instanceof ActiveFilter) |
+ for (var domain in filter.domains) |
+ if (domain && urlFilters.indexOf(domain) == -1) |
+ urlFilters.push(domain); |
+ }); |
+ notification.urlFilters = urlFilters; |
+ Notification.addNotification(notification); |
+ Notification.addQuestionListener(notification.id, notificationListener); |
+ } |
+ |
+ function removeAntiAdblockNotification() |
+ { |
+ Notification.removeNotification(notification); |
+ Notification.removeQuestionListener(notification.id, notificationListener); |
+ } |
+ |
+ var subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); |
+ if (subscription.lastDownload && subscription.disabled) |
+ addAntiAdblockNotification(subscription); |
+ |
+ FilterNotifier.addListener(function(action, value, newItem, oldItem) |
+ { |
+ if (!/^subscription\.(updated|removed|disabled)$/.test(action) || value.url != Prefs.subscriptions_antiadblockurl) |
+ return; |
+ |
+ if (action == "subscription.updated") |
+ addAntiAdblockNotification(value); |
+ else if (action == "subscription.removed" || (action == "subscription.disabled" && !value.disabled)) |
+ removeAntiAdblockNotification(); |
+ }); |
+} |
+ |
function setContextMenu() |
{ |
if (Prefs.shouldShowBlockElementMenu) |
@@ -300,7 +367,7 @@ |
iconAnimation.stop(); |
activeNotification = null; |
}; |
- iconAnimation.update(activeNotification.severity); |
+ iconAnimation.update(activeNotification.type); |
} |
function openNotificationLinks() |
@@ -319,7 +386,13 @@ |
function notificationButtonClick(id, index) |
{ |
- if (activeNotification.links && activeNotification.links[index]) |
+ if (activeNotification.type === "question") |
+ { |
+ Notification.triggerQuestionListeners(activeNotification.id, index === 0); |
+ Notification.markAsShown(activeNotification.id); |
+ activeNotification.onClicked(); |
+ } |
+ else if (activeNotification.links && activeNotification.links[index]) |
{ |
ext.windows.getLastFocused(function(win) |
{ |
@@ -330,15 +403,18 @@ |
function showNotification(notification) |
{ |
+ if (activeNotification && activeNotification.id === notification.id) |
+ return; |
+ |
activeNotification = notification; |
- if (activeNotification.severity === "critical") |
+ if (activeNotification.type === "critical" || activeNotification.type === "question") |
{ |
var hasWebkitNotifications = typeof webkitNotifications !== "undefined"; |
if (hasWebkitNotifications && "createHTMLNotification" in webkitNotifications) |
{ |
var notification = webkitNotifications.createHTMLNotification("notification.html"); |
notification.show(); |
- notification.addEventListener("close", prepareNotificationIconAndPopup, false); |
+ prepareNotificationIconAndPopup(); |
return; |
} |
@@ -347,34 +423,43 @@ |
var message = texts.message ? texts.message.replace(/<\/?(a|strong)>/g, "") : ""; |
var iconUrl = ext.getURL("icons/abp-128.png"); |
var hasLinks = activeNotification.links && activeNotification.links.length > 0; |
- if ("browserNotifications" in ext) |
+ |
+ // Chrome on Linux does not fully support chrome.notifications yet |
+ // https://code.google.com/p/chromium/issues/detail?id=291485 |
+ if (chrome && "notifications" in chrome && navigator.platform.indexOf("Linux") === -1) |
{ |
var opts = { |
type: "basic", |
title: title, |
message: message, |
iconUrl: iconUrl, |
- buttons: [] |
+ buttons: [], |
+ priority: 2 // We use the highest priority to prevent the notification from closing automatically |
}; |
- var regex = /<a>(.*?)<\/a>/g; |
- var plainMessage = texts.message || ""; |
- var match; |
- while (match = regex.exec(plainMessage)) |
- opts.buttons.push({title: match[1]}); |
+ if (activeNotification.type === "question") |
+ { |
+ opts.buttons.push({title: ext.i18n.getMessage("overlay_notification_button_yes")}); |
+ opts.buttons.push({title: ext.i18n.getMessage("overlay_notification_button_no")}); |
+ } |
+ else |
+ { |
+ var regex = /<a>(.*?)<\/a>/g; |
+ var plainMessage = texts.message || ""; |
+ var match; |
+ while (match = regex.exec(plainMessage)) |
+ opts.buttons.push({title: match[1]}); |
+ } |
- var notification = ext.browserNotifications; |
- notification.create("", opts, function() {}); |
- notification.onClosed.addListener(prepareNotificationIconAndPopup); |
- notification.onButtonClicked.addListener(notificationButtonClick); |
+ chrome.notifications.create("", opts, function() {}); |
+ chrome.notifications.onButtonClicked.addListener(notificationButtonClick); |
} |
- else if (hasWebkitNotifications && "createNotification" in webkitNotifications) |
+ else if (hasWebkitNotifications && "createNotification" in webkitNotifications && activeNotification.type !== "question") |
{ |
if (hasLinks) |
message += " " + ext.i18n.getMessage("notification_without_buttons"); |
var notification = webkitNotifications.createNotification(iconUrl, title, message); |
notification.show(); |
- notification.addEventListener("close", prepareNotificationIconAndPopup, false); |
notification.addEventListener("click", openNotificationLinks, false); |
} |
else |
@@ -383,13 +468,14 @@ |
if (hasLinks) |
message += "\n\n" + ext.i18n.getMessage("notification_with_buttons"); |
- if (confirm(message)) |
+ var approved = confirm(message); |
+ if (activeNotification.type === "question") |
+ notificationButtonClick(null, approved ? 0 : 1); |
+ else if (approved) |
openNotificationLinks(); |
- prepareNotificationIconAndPopup(); |
} |
} |
- else |
- prepareNotificationIconAndPopup(); |
+ prepareNotificationIconAndPopup(); |
} |
ext.onMessage.addListener(function (msg, sender, sendResponse) |