| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * This file is part of Adblock Plus <http://adblockplus.org/>, |    2  * This file is part of Adblock Plus <http://adblockplus.org/>, | 
|    3  * Copyright (C) 2006-2013 Eyeo GmbH |    3  * Copyright (C) 2006-2013 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 with(require("filterClasses")) |   18 with(require("filterClasses")) | 
|   19 { |   19 { | 
|   20   this.Filter = Filter; |   20   this.Filter = Filter; | 
 |   21   this.ActiveFilter = ActiveFilter; | 
|   21   this.RegExpFilter = RegExpFilter; |   22   this.RegExpFilter = RegExpFilter; | 
|   22   this.BlockingFilter = BlockingFilter; |   23   this.BlockingFilter = BlockingFilter; | 
|   23   this.WhitelistFilter = WhitelistFilter; |   24   this.WhitelistFilter = WhitelistFilter; | 
|   24 } |   25 } | 
|   25 with(require("subscriptionClasses")) |   26 with(require("subscriptionClasses")) | 
|   26 { |   27 { | 
|   27   this.Subscription = Subscription; |   28   this.Subscription = Subscription; | 
|   28   this.DownloadableSubscription = DownloadableSubscription; |   29   this.DownloadableSubscription = DownloadableSubscription; | 
|   29 } |   30 } | 
|   30 with(require("whitelisting")) |   31 with(require("whitelisting")) | 
|   31 { |   32 { | 
|   32   this.isWhitelisted = isWhitelisted; |   33   this.isWhitelisted = isWhitelisted; | 
|   33   this.isFrameWhitelisted = isFrameWhitelisted; |   34   this.isFrameWhitelisted = isFrameWhitelisted; | 
|   34   this.processKeyException = processKeyException; |   35   this.processKeyException = processKeyException; | 
|   35 } |   36 } | 
|   36 var FilterStorage = require("filterStorage").FilterStorage; |   37 var FilterStorage = require("filterStorage").FilterStorage; | 
|   37 var ElemHide = require("elemHide").ElemHide; |   38 var ElemHide = require("elemHide").ElemHide; | 
|   38 var defaultMatcher = require("matcher").defaultMatcher; |   39 var defaultMatcher = require("matcher").defaultMatcher; | 
|   39 var Prefs = require("prefs").Prefs; |   40 var Prefs = require("prefs").Prefs; | 
|   40 var Synchronizer = require("synchronizer").Synchronizer; |   41 var Synchronizer = require("synchronizer").Synchronizer; | 
|   41 var Utils = require("utils").Utils; |   42 var Utils = require("utils").Utils; | 
|   42 var Notification = require("notification").Notification; |   43 var Notification = require("notification").Notification; | 
 |   44 var setupAntiAdblockNotification = require("antiadblock-setup").setupAntiAdblock
     Notification; | 
|   43  |   45  | 
|   44 // Some types cannot be distinguished |   46 // Some types cannot be distinguished | 
|   45 RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT; |   47 RegExpFilter.typeMap.OBJECT_SUBREQUEST = RegExpFilter.typeMap.OBJECT; | 
|   46 RegExpFilter.typeMap.MEDIA = RegExpFilter.typeMap.FONT = RegExpFilter.typeMap.OT
     HER; |   48 RegExpFilter.typeMap.MEDIA = RegExpFilter.typeMap.FONT = RegExpFilter.typeMap.OT
     HER; | 
|   47  |   49  | 
|   48 var isFirstRun = false; |   50 var isFirstRun = false; | 
|   49 var seenDataCorruption = false; |   51 var seenDataCorruption = false; | 
|   50 require("filterNotifier").FilterNotifier.addListener(function(action) |   52 require("filterNotifier").FilterNotifier.addListener(function(action) | 
|   51 { |   53 { | 
|   52   if (action == "load") |   54   if (action == "load") | 
|   53   { |   55   { | 
|   54     var importingOldData = importOldData(); |   56     var importingOldData = importOldData(); | 
|   55  |   57  | 
|   56     var addonVersion = require("info").addonVersion; |   58     var addonVersion = require("info").addonVersion; | 
|   57     var prevVersion = localStorage.currentVersion; |   59     var prevVersion = localStorage.currentVersion; | 
|   58     if (prevVersion != addonVersion) |   60     if (prevVersion != addonVersion) | 
|   59     { |   61     { | 
|   60       isFirstRun = !prevVersion; |   62       isFirstRun = !prevVersion; | 
|   61       localStorage.currentVersion = addonVersion; |   63       localStorage.currentVersion = addonVersion; | 
|   62       if (!importingOldData) |   64       if (!importingOldData) | 
|   63         addSubscription(prevVersion); |   65         addSubscription(prevVersion); | 
|   64     } |   66     } | 
 |   67  | 
 |   68     setupAntiAdblockNotification(); | 
|   65   } |   69   } | 
|   66  |   70  | 
|   67   // update browser actions when whitelisting might have changed, |   71   // update browser actions when whitelisting might have changed, | 
|   68   // due to loading filters or saving filter changes |   72   // due to loading filters or saving filter changes | 
|   69   if (action == "load" || action == "save") |   73   if (action == "load" || action == "save") | 
|   70   { |   74   { | 
|   71     ext.windows.getAll(function(windows) |   75     ext.windows.getAll(function(windows) | 
|   72     { |   76     { | 
|   73       for (var i = 0; i < windows.length; i++) |   77       for (var i = 0; i < windows.length; i++) | 
|   74       { |   78       { | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  194     { |  198     { | 
|  195       subscription.title = "Allow non-intrusive advertising"; |  199       subscription.title = "Allow non-intrusive advertising"; | 
|  196       FilterStorage.addSubscription(subscription); |  200       FilterStorage.addSubscription(subscription); | 
|  197       if (subscription instanceof DownloadableSubscription && !subscription.last
     Download) |  201       if (subscription instanceof DownloadableSubscription && !subscription.last
     Download) | 
|  198         Synchronizer.execute(subscription); |  202         Synchronizer.execute(subscription); | 
|  199     } |  203     } | 
|  200     else |  204     else | 
|  201       addAcceptable = false; |  205       addAcceptable = false; | 
|  202   } |  206   } | 
|  203  |  207  | 
 |  208   // Add "anti-adblock messages" subscription | 
 |  209   var subscription = Subscription.fromURL(Prefs.subscriptions_antiadblockurl); | 
 |  210   if (subscription) | 
 |  211   { | 
 |  212     subscription.disabled = true; | 
 |  213     FilterStorage.addSubscription(subscription); | 
 |  214     if (subscription instanceof DownloadableSubscription && !subscription.lastDo
     wnload) | 
 |  215       Synchronizer.execute(subscription); | 
 |  216   } | 
 |  217  | 
|  204   if (!addSubscription && !addAcceptable) |  218   if (!addSubscription && !addAcceptable) | 
|  205     return; |  219     return; | 
|  206  |  220  | 
|  207   function notifyUser() |  221   function notifyUser() | 
|  208   { |  222   { | 
|  209     ext.windows.getLastFocused(function(win) |  223     ext.windows.getLastFocused(function(win) | 
|  210     { |  224     { | 
|  211       win.openTab(ext.getURL("firstRun.html")); |  225       win.openTab(ext.getURL("firstRun.html")); | 
|  212     }); |  226     }); | 
|  213   } |  227   } | 
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  288       win.openTab(optionsUrl, callback && function(tab) |  302       win.openTab(optionsUrl, callback && function(tab) | 
|  289       { |  303       { | 
|  290         tab.onCompleted.addListener(callback); |  304         tab.onCompleted.addListener(callback); | 
|  291       }); |  305       }); | 
|  292     }); |  306     }); | 
|  293   }); |  307   }); | 
|  294 } |  308 } | 
|  295  |  309  | 
|  296 function prepareNotificationIconAndPopup() |  310 function prepareNotificationIconAndPopup() | 
|  297 { |  311 { | 
 |  312   var animateIcon = (activeNotification.type !== "question"); | 
|  298   activeNotification.onClicked = function() |  313   activeNotification.onClicked = function() | 
|  299   { |  314   { | 
|  300     iconAnimation.stop(); |  315     if (animateIcon) | 
 |  316       iconAnimation.stop(); | 
|  301     activeNotification = null; |  317     activeNotification = null; | 
|  302   }; |  318   }; | 
|  303   iconAnimation.update(activeNotification.severity); |  319   if (animateIcon) | 
 |  320     iconAnimation.update(activeNotification.type); | 
|  304 } |  321 } | 
|  305  |  322  | 
|  306 function openNotificationLinks()  |  323 function openNotificationLinks()  | 
|  307 { |  324 { | 
|  308   if (activeNotification.links) |  325   if (activeNotification.links) | 
|  309   { |  326   { | 
|  310     activeNotification.links.forEach(function(link) |  327     activeNotification.links.forEach(function(link) | 
|  311     { |  328     { | 
|  312       ext.windows.getLastFocused(function(win) |  329       ext.windows.getLastFocused(function(win) | 
|  313       { |  330       { | 
|  314         win.openTab(Utils.getDocLink(link)); |  331         win.openTab(Utils.getDocLink(link)); | 
|  315       }); |  332       }); | 
|  316     }); |  333     }); | 
|  317   } |  334   } | 
|  318 } |  335 } | 
|  319  |  336  | 
|  320 function notificationButtonClick(id, index) |  337 function notificationButtonClick(id, index) | 
|  321 { |  338 { | 
|  322   if (activeNotification.links && activeNotification.links[index]) |  339   if (activeNotification.type === "question") | 
 |  340   { | 
 |  341     Notification.triggerQuestionListeners(activeNotification.id, index === 0); | 
 |  342     Notification.markAsShown(activeNotification.id); | 
 |  343     activeNotification.onClicked(); | 
 |  344   } | 
 |  345   else if (activeNotification.links && activeNotification.links[index]) | 
|  323   { |  346   { | 
|  324     ext.windows.getLastFocused(function(win) |  347     ext.windows.getLastFocused(function(win) | 
|  325     { |  348     { | 
|  326       win.openTab(Utils.getDocLink(activeNotification.links[index])); |  349       win.openTab(Utils.getDocLink(activeNotification.links[index])); | 
|  327     }); |  350     }); | 
|  328   } |  351   } | 
|  329 } |  352 } | 
|  330  |  353  | 
|  331 function showNotification(notification) |  354 function showNotification(notification) | 
|  332 { |  355 { | 
 |  356   if (activeNotification && activeNotification.id === notification.id) | 
 |  357     return; | 
 |  358    | 
|  333   activeNotification = notification; |  359   activeNotification = notification; | 
|  334   if (activeNotification.severity === "critical") |  360   if (activeNotification.type === "critical" || activeNotification.type === "que
     stion") | 
|  335   { |  361   { | 
|  336     var hasWebkitNotifications = typeof webkitNotifications !== "undefined"; |  362     var hasWebkitNotifications = typeof webkitNotifications !== "undefined"; | 
|  337     if (hasWebkitNotifications && "createHTMLNotification" in webkitNotification
     s) |  363     if (hasWebkitNotifications && "createHTMLNotification" in webkitNotification
     s) | 
|  338     { |  364     { | 
|  339       var notification = webkitNotifications.createHTMLNotification("notificatio
     n.html"); |  365       var notification = webkitNotifications.createHTMLNotification("notificatio
     n.html"); | 
|  340       notification.show(); |  366       notification.show(); | 
|  341       notification.addEventListener("close", prepareNotificationIconAndPopup, fa
     lse); |  367       prepareNotificationIconAndPopup(); | 
|  342       return; |  368       return; | 
|  343     } |  369     } | 
|  344      |  370      | 
|  345     var texts = Notification.getLocalizedTexts(notification); |  371     var texts = Notification.getLocalizedTexts(notification); | 
|  346     var title = texts.title || ""; |  372     var title = texts.title || ""; | 
|  347     var message = texts.message ? texts.message.replace(/<\/?(a|strong)>/g, "") 
     : ""; |  373     var message = texts.message ? texts.message.replace(/<\/?(a|strong)>/g, "") 
     : ""; | 
|  348     var iconUrl = ext.getURL("icons/abp-128.png"); |  374     var iconUrl = ext.getURL("icons/abp-128.png"); | 
|  349     var hasLinks = activeNotification.links && activeNotification.links.length >
      0; |  375     var hasLinks = activeNotification.links && activeNotification.links.length >
      0; | 
|  350     if ("browserNotifications" in ext)  |  376      | 
 |  377     // Chrome on Linux does not fully support chrome.notifications yet | 
 |  378     // https://code.google.com/p/chromium/issues/detail?id=291485 | 
 |  379     if (chrome && "notifications" in chrome && navigator.platform.indexOf("Linux
     ") === -1) | 
|  351     { |  380     { | 
|  352       var opts = { |  381       var opts = { | 
|  353         type: "basic", |  382         type: "basic", | 
|  354         title: title, |  383         title: title, | 
|  355         message: message, |  384         message: message, | 
|  356         iconUrl: iconUrl, |  385         iconUrl: iconUrl, | 
|  357         buttons: [] |  386         buttons: [], | 
 |  387         priority: 2 // We use the highest priority to prevent the notification f
     rom closing automatically | 
|  358       }; |  388       }; | 
|  359       var regex = /<a>(.*?)<\/a>/g; |  389       if (activeNotification.type === "question") | 
|  360       var plainMessage = texts.message || ""; |  390       { | 
|  361       var match; |  391         opts.buttons.push({title: ext.i18n.getMessage("overlay_notification_butt
     on_yes")}); | 
|  362       while (match = regex.exec(plainMessage)) |  392         opts.buttons.push({title: ext.i18n.getMessage("overlay_notification_butt
     on_no")}); | 
|  363         opts.buttons.push({title: match[1]}); |  393       } | 
 |  394       else | 
 |  395       { | 
 |  396         var regex = /<a>(.*?)<\/a>/g; | 
 |  397         var plainMessage = texts.message || ""; | 
 |  398         var match; | 
 |  399         while (match = regex.exec(plainMessage)) | 
 |  400           opts.buttons.push({title: match[1]}); | 
 |  401       } | 
|  364        |  402        | 
|  365       var notification = ext.browserNotifications; |  403       chrome.notifications.create("", opts, function() {}); | 
|  366       notification.create("", opts, function() {}); |  404       chrome.notifications.onButtonClicked.addListener(notificationButtonClick); | 
|  367       notification.onClosed.addListener(prepareNotificationIconAndPopup); |  | 
|  368       notification.onButtonClicked.addListener(notificationButtonClick); |  | 
|  369     } |  405     } | 
|  370     else if (hasWebkitNotifications && "createNotification" in webkitNotificatio
     ns) |  406     else if (hasWebkitNotifications && "createNotification" in webkitNotificatio
     ns && activeNotification.type !== "question") | 
|  371     { |  407     { | 
|  372       if (hasLinks) |  408       if (hasLinks) | 
|  373         message += " " + ext.i18n.getMessage("notification_without_buttons"); |  409         message += " " + ext.i18n.getMessage("notification_without_buttons"); | 
|  374          |  410          | 
|  375       var notification = webkitNotifications.createNotification(iconUrl, title, 
     message); |  411       var notification = webkitNotifications.createNotification(iconUrl, title, 
     message); | 
|  376       notification.show(); |  412       notification.show(); | 
|  377       notification.addEventListener("close", prepareNotificationIconAndPopup, fa
     lse); |  | 
|  378       notification.addEventListener("click", openNotificationLinks, false); |  413       notification.addEventListener("click", openNotificationLinks, false); | 
|  379     } |  414     } | 
|  380     else |  415     else | 
|  381     { |  416     { | 
|  382       var message = title + "\n" + message; |  417       var message = title + "\n" + message; | 
|  383       if (hasLinks) |  418       if (hasLinks) | 
|  384         message += "\n\n" + ext.i18n.getMessage("notification_with_buttons"); |  419         message += "\n\n" + ext.i18n.getMessage("notification_with_buttons"); | 
|  385          |  420          | 
|  386       if (confirm(message)) |  421       var approved = confirm(message); | 
 |  422       if (activeNotification.type === "question") | 
 |  423         notificationButtonClick(null, approved ? 0 : 1); | 
 |  424       else if (approved) | 
|  387         openNotificationLinks(); |  425         openNotificationLinks(); | 
|  388       prepareNotificationIconAndPopup(); |  | 
|  389     } |  426     } | 
|  390   } |  427   } | 
|  391   else |  428   prepareNotificationIconAndPopup(); | 
|  392     prepareNotificationIconAndPopup(); |  | 
|  393 } |  429 } | 
|  394  |  430  | 
|  395 ext.onMessage.addListener(function (msg, sender, sendResponse) |  431 ext.onMessage.addListener(function (msg, sender, sendResponse) | 
|  396 { |  432 { | 
|  397   switch (msg.type) |  433   switch (msg.type) | 
|  398   { |  434   { | 
|  399     case "get-selectors": |  435     case "get-selectors": | 
|  400       var selectors = null; |  436       var selectors = null; | 
|  401  |  437  | 
|  402       if (!isFrameWhitelisted(sender.tab, sender.frame, "DOCUMENT") && |  438       if (!isFrameWhitelisted(sender.tab, sender.frame, "DOCUMENT") && | 
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  492   tab.sendMessage({type: "clickhide-deactivate"}); |  528   tab.sendMessage({type: "clickhide-deactivate"}); | 
|  493   refreshIconAndContextMenu(tab); |  529   refreshIconAndContextMenu(tab); | 
|  494 }); |  530 }); | 
|  495  |  531  | 
|  496 setTimeout(function() |  532 setTimeout(function() | 
|  497 { |  533 { | 
|  498   var notificationToShow = Notification.getNextToShow(); |  534   var notificationToShow = Notification.getNextToShow(); | 
|  499   if (notificationToShow) |  535   if (notificationToShow) | 
|  500     showNotification(notificationToShow); |  536     showNotification(notificationToShow); | 
|  501 }, 3 * 60 * 1000); |  537 }, 3 * 60 * 1000); | 
| OLD | NEW |