| 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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 50     startIconAnimation(activeNotification.type); | 50     startIconAnimation(activeNotification.type); | 
| 51 } | 51 } | 
| 52 | 52 | 
| 53 function getNotificationButtons(notificationType, message) | 53 function getNotificationButtons(notificationType, message) | 
| 54 { | 54 { | 
| 55   let buttons = []; | 55   let buttons = []; | 
| 56   if (notificationType == "question") | 56   if (notificationType == "question") | 
| 57   { | 57   { | 
| 58     buttons.push({ | 58     buttons.push({ | 
| 59       type: "question", | 59       type: "question", | 
| 60       title: chrome.i18n.getMessage("overlay_notification_button_yes") | 60       title: browser.i18n.getMessage("overlay_notification_button_yes") | 
| 61     }); | 61     }); | 
| 62     buttons.push({ | 62     buttons.push({ | 
| 63       type: "question", | 63       type: "question", | 
| 64       title: chrome.i18n.getMessage("overlay_notification_button_no") | 64       title: browser.i18n.getMessage("overlay_notification_button_no") | 
| 65     }); | 65     }); | 
| 66   } | 66   } | 
| 67   else | 67   else | 
| 68   { | 68   { | 
| 69     let regex = /<a>(.*?)<\/a>/g; | 69     let regex = /<a>(.*?)<\/a>/g; | 
| 70     let match; | 70     let match; | 
| 71     while (match = regex.exec(message)) | 71     while (match = regex.exec(message)) | 
| 72     { | 72     { | 
| 73       buttons.push({ | 73       buttons.push({ | 
| 74         type: "link", | 74         type: "link", | 
| 75         title: match[1] | 75         title: match[1] | 
| 76       }); | 76       }); | 
| 77     } | 77     } | 
| 78 | 78 | 
| 79     // Chrome only allows two notification buttons so we need to fall back | 79     // Chrome only allows two notification buttons so we need to fall back | 
| 80     // to a single button to open all links if there are more than two. | 80     // to a single button to open all links if there are more than two. | 
| 81     let maxButtons = (notificationType == "critical") ? 2 : 1; | 81     let maxButtons = (notificationType == "critical") ? 2 : 1; | 
| 82     if (buttons.length > maxButtons) | 82     if (buttons.length > maxButtons) | 
| 83     { | 83     { | 
| 84       buttons = [ | 84       buttons = [ | 
| 85         { | 85         { | 
| 86           type: "open-all", | 86           type: "open-all", | 
| 87           title: chrome.i18n.getMessage("notification_open_all") | 87           title: browser.i18n.getMessage("notification_open_all") | 
| 88         } | 88         } | 
| 89       ]; | 89       ]; | 
| 90     } | 90     } | 
| 91     if (!["critical", "relentless"].includes(notificationType)) | 91     if (!["critical", "relentless"].includes(notificationType)) | 
| 92     { | 92     { | 
| 93       buttons.push({ | 93       buttons.push({ | 
| 94         type: "configure", | 94         type: "configure", | 
| 95         title: chrome.i18n.getMessage("notification_configure") | 95         title: browser.i18n.getMessage("notification_configure") | 
| 96       }); | 96       }); | 
| 97     } | 97     } | 
| 98   } | 98   } | 
| 99 | 99 | 
| 100   return buttons; | 100   return buttons; | 
| 101 } | 101 } | 
| 102 | 102 | 
| 103 function openNotificationLinks() | 103 function openNotificationLinks() | 
| 104 { | 104 { | 
| 105   if (activeNotification.links) | 105   if (activeNotification.links) | 
| 106   { | 106   { | 
| 107     for (let link of activeNotification.links) | 107     for (let link of activeNotification.links) | 
| 108       chrome.tabs.create({url: Utils.getDocLink(link)}); | 108       browser.tabs.create({url: Utils.getDocLink(link)}); | 
| 109   } | 109   } | 
| 110 } | 110 } | 
| 111 | 111 | 
| 112 function notificationButtonClick(buttonIndex) | 112 function notificationButtonClick(buttonIndex) | 
| 113 { | 113 { | 
| 114   if (!(activeButtons && buttonIndex in activeButtons)) | 114   if (!(activeButtons && buttonIndex in activeButtons)) | 
| 115     return; | 115     return; | 
| 116 | 116 | 
| 117   switch (activeButtons[buttonIndex].type) | 117   switch (activeButtons[buttonIndex].type) | 
| 118   { | 118   { | 
| 119     case "link": | 119     case "link": | 
| 120       chrome.tabs.create({ | 120       browser.tabs.create({ | 
| 121         url: Utils.getDocLink(activeNotification.links[buttonIndex]) | 121         url: Utils.getDocLink(activeNotification.links[buttonIndex]) | 
| 122       }); | 122       }); | 
| 123       break; | 123       break; | 
| 124     case "open-all": | 124     case "open-all": | 
| 125       openNotificationLinks(); | 125       openNotificationLinks(); | 
| 126       break; | 126       break; | 
| 127     case "configure": | 127     case "configure": | 
| 128       Prefs.notifications_showui = true; | 128       Prefs.notifications_showui = true; | 
| 129       showOptions(page => | 129       showOptions(page => | 
| 130       { | 130       { | 
| (...skipping 22 matching lines...) Expand all  Loading... | 
| 153 { | 153 { | 
| 154   // Chrome hides notifications in notification center when clicked so | 154   // Chrome hides notifications in notification center when clicked so | 
| 155   // we need to clear them. | 155   // we need to clear them. | 
| 156   function clearActiveNotification(notificationId) | 156   function clearActiveNotification(notificationId) | 
| 157   { | 157   { | 
| 158     if (activeNotification && | 158     if (activeNotification && | 
| 159         activeNotification.type != "question" && | 159         activeNotification.type != "question" && | 
| 160         !("links" in activeNotification)) | 160         !("links" in activeNotification)) | 
| 161       return; | 161       return; | 
| 162 | 162 | 
| 163     chrome.notifications.clear(notificationId, wasCleared => | 163     browser.notifications.clear(notificationId, wasCleared => | 
| 164     { | 164     { | 
| 165       if (wasCleared) | 165       if (wasCleared) | 
| 166         notificationClosed(); | 166         notificationClosed(); | 
| 167     }); | 167     }); | 
| 168   } | 168   } | 
| 169 | 169 | 
| 170   chrome.notifications.onButtonClicked.addListener( | 170   browser.notifications.onButtonClicked.addListener( | 
| 171     (notificationId, buttonIndex) => | 171     (notificationId, buttonIndex) => | 
| 172     { | 172     { | 
| 173       notificationButtonClick(buttonIndex); | 173       notificationButtonClick(buttonIndex); | 
| 174       clearActiveNotification(notificationId); | 174       clearActiveNotification(notificationId); | 
| 175     } | 175     } | 
| 176   ); | 176   ); | 
| 177   chrome.notifications.onClicked.addListener(clearActiveNotification); | 177   browser.notifications.onClicked.addListener(clearActiveNotification); | 
| 178   chrome.notifications.onClosed.addListener(notificationClosed); | 178   browser.notifications.onClosed.addListener(notificationClosed); | 
| 179 } | 179 } | 
| 180 | 180 | 
| 181 function showNotification(notification) | 181 function showNotification(notification) | 
| 182 { | 182 { | 
| 183   if (activeNotification && activeNotification.id == notification.id) | 183   if (activeNotification && activeNotification.id == notification.id) | 
| 184     return; | 184     return; | 
| 185 | 185 | 
| 186   activeNotification = notification; | 186   activeNotification = notification; | 
| 187   if (shouldDisplay("notification", activeNotification.type)) | 187   if (shouldDisplay("notification", activeNotification.type)) | 
| 188   { | 188   { | 
| 189     let texts = NotificationStorage.getLocalizedTexts(notification); | 189     let texts = NotificationStorage.getLocalizedTexts(notification); | 
| 190     let title = texts.title || ""; | 190     let title = texts.title || ""; | 
| 191     let message = (texts.message || "").replace(/<\/?(a|strong)>/g, ""); | 191     let message = (texts.message || "").replace(/<\/?(a|strong)>/g, ""); | 
| 192     let iconUrl = ext.getURL("icons/detailed/abp-128.png"); | 192     let iconUrl = ext.getURL("icons/detailed/abp-128.png"); | 
| 193     let linkCount = (activeNotification.links || []).length; | 193     let linkCount = (activeNotification.links || []).length; | 
| 194 | 194 | 
| 195     if ("notifications" in chrome) | 195     if ("notifications" in browser) | 
| 196     { | 196     { | 
| 197       activeButtons = getNotificationButtons(activeNotification.type, | 197       activeButtons = getNotificationButtons(activeNotification.type, | 
| 198                                              texts.message); | 198                                              texts.message); | 
| 199       chrome.notifications.create("", { | 199       browser.notifications.create("", { | 
| 200         type: "basic", | 200         type: "basic", | 
| 201         title, | 201         title, | 
| 202         iconUrl, | 202         iconUrl, | 
| 203         message, | 203         message, | 
| 204         buttons: activeButtons.map(button => ({title: button.title})), | 204         buttons: activeButtons.map(button => ({title: button.title})), | 
| 205         // We use the highest priority to prevent the notification | 205         // We use the highest priority to prevent the notification | 
| 206         // from closing automatically. | 206         // from closing automatically. | 
| 207         priority: 2 | 207         priority: 2 | 
| 208       }); | 208       }); | 
| 209     } | 209     } | 
| 210     else if ("Notification" in window && activeNotification.type != "question") | 210     else if ("Notification" in window && activeNotification.type != "question") | 
| 211     { | 211     { | 
| 212       if (linkCount > 0) | 212       if (linkCount > 0) | 
| 213         message += " " + chrome.i18n.getMessage("notification_without_buttons"); | 213       { | 
|  | 214         message += " " + browser.i18n.getMessage( | 
|  | 215           "notification_without_buttons"); | 
|  | 216       } | 
| 214 | 217 | 
| 215       let widget = new Notification( | 218       let widget = new Notification( | 
| 216         title, | 219         title, | 
| 217         { | 220         { | 
| 218           lang: Utils.appLocale, | 221           lang: Utils.appLocale, | 
| 219           dir: Utils.readingDirection, | 222           dir: Utils.readingDirection, | 
| 220           body: message, | 223           body: message, | 
| 221           icon: iconUrl | 224           icon: iconUrl | 
| 222         } | 225         } | 
| 223       ); | 226       ); | 
| 224 | 227 | 
| 225       widget.addEventListener("click", openNotificationLinks); | 228       widget.addEventListener("click", openNotificationLinks); | 
| 226       widget.addEventListener("close", notificationClosed); | 229       widget.addEventListener("close", notificationClosed); | 
| 227     } | 230     } | 
| 228     else | 231     else | 
| 229     { | 232     { | 
| 230       message = title + "\n" + message; | 233       message = title + "\n" + message; | 
| 231       if (linkCount > 0) | 234       if (linkCount > 0) | 
| 232         message += "\n\n" + chrome.i18n.getMessage("notification_with_buttons"); | 235       { | 
|  | 236         message += "\n\n" + browser.i18n.getMessage( | 
|  | 237           "notification_with_buttons"); | 
|  | 238       } | 
| 233 | 239 | 
| 234       let approved = confirm(message); | 240       let approved = confirm(message); | 
| 235       if (activeNotification.type == "question") | 241       if (activeNotification.type == "question") | 
| 236         notificationButtonClick(approved ? 0 : 1); | 242         notificationButtonClick(approved ? 0 : 1); | 
| 237       else if (approved) | 243       else if (approved) | 
| 238         openNotificationLinks(); | 244         openNotificationLinks(); | 
| 239     } | 245     } | 
| 240   } | 246   } | 
| 241   prepareNotificationIconAndPopup(); | 247   prepareNotificationIconAndPopup(); | 
| 242 | 248 | 
| 243   if (notification.type !== "question") | 249   if (notification.type !== "question") | 
| 244     NotificationStorage.markAsShown(notification.id); | 250     NotificationStorage.markAsShown(notification.id); | 
| 245 } | 251 } | 
| 246 | 252 | 
| 247 /** | 253 /** | 
| 248  * Initializes the notification system. | 254  * Initializes the notification system. | 
| 249  */ | 255  */ | 
| 250 exports.initNotifications = () => | 256 exports.initNotifications = () => | 
| 251 { | 257 { | 
| 252   if ("notifications" in chrome) | 258   if ("notifications" in browser) | 
| 253     initChromeNotifications(); | 259     initChromeNotifications(); | 
| 254   initAntiAdblockNotification(); | 260   initAntiAdblockNotification(); | 
| 255 }; | 261 }; | 
| 256 | 262 | 
| 257 /** | 263 /** | 
| 258  * Gets the active notification to be shown if any. | 264  * Gets the active notification to be shown if any. | 
| 259  * | 265  * | 
| 260  * @return {?object} | 266  * @return {?object} | 
| 261  */ | 267  */ | 
| 262 exports.getActiveNotification = () => activeNotification; | 268 exports.getActiveNotification = () => activeNotification; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 275   let methods = displayMethods[notificationType] || defaultDisplayMethods; | 281   let methods = displayMethods[notificationType] || defaultDisplayMethods; | 
| 276   return methods.includes(method); | 282   return methods.includes(method); | 
| 277 }; | 283 }; | 
| 278 | 284 | 
| 279 ext.pages.onLoading.addListener(page => | 285 ext.pages.onLoading.addListener(page => | 
| 280 { | 286 { | 
| 281   NotificationStorage.showNext(stringifyURL(page.url)); | 287   NotificationStorage.showNext(stringifyURL(page.url)); | 
| 282 }); | 288 }); | 
| 283 | 289 | 
| 284 NotificationStorage.addShowListener(showNotification); | 290 NotificationStorage.addShowListener(showNotification); | 
| OLD | NEW | 
|---|