1
0
mirror of https://github.com/kkapsner/CanvasBlocker synced 2024-11-04 20:28:52 +01:00
CanvasBlocker/lib/notifications.js

144 lines
3.8 KiB
JavaScript

/* jslint moz: true */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
(function(){
"use strict";
var URL = require("sdk/url").URL;
const {parseErrorStack} = require("./callingStack");
const {setTimeout, clearTimeout} = require("sdk/timers");
var tabUtils = require("sdk/tabs/utils");
exports.notify = function({url, errorStack, messageId}, {lists, notificationPref, _, browser, window}){
var callingStackMsg = parseErrorStack(errorStack);
var contentURL = new URL(url);
if (notificationPref.doShow() && !lists.get("ignore").match(contentURL)){
url = contentURL.href;
var domain = contentURL.hostname;
var message = _(messageId).replace(/\{url\}/g, domain || url);
var tab, tabBrowser;
if (browser){
window = tabUtils.getOwnerWindow(browser);
if (!window){
return;
}
tab = tabUtils.getTabForBrowser(browser);
if (!tab){
// page ist displayed in preview
return;
}
tabBrowser = tabUtils.getTabBrowser(window);
}
else if (window){
tab = tabUtils.getTabForContentWindow(window);
tabBrowser = tabUtils.getTabBrowserForTab(tab);
browser = tabUtils.getBrowserForTab(tab);
}
var notifyBox = tabBrowser.getNotificationBox(browser);
var notification = notifyBox.getNotificationWithValue("CanvasBlocker-" + messageId);
if (notification){
notification.label = message;
clearTimeout(notification.hideTimeout);
}
else {
var buttons = [
{
label: _("displayFullURL"),
accessKey: "",
callback: function(){
window.alert(notification.url);
// only way to prevent closing... see https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/appendNotification#Notification_box_events
throw new Error("Do not close notification.");
}
},
{
label: _("displayCallingStack"),
accessKey: "",
callback: function(){
window.alert(notification.callingStackMsg);
// only way to prevent closing... see https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XUL/Method/appendNotification#Notification_box_events
throw new Error("Do not close notification.");
}
},
{
label: _("ignorelistDomain"),
accessKey: "",
callback: function(){
var domain = window.prompt(
_("inputIgnoreDomain"),
notification.domain
);
if (domain){
lists.appendTo("ignore", domain);
}
}
},
{
label: _("whitelistURL"),
accessKey: "",
callback: function(){
var url = window.prompt(
_("inputWhitelistDomain"),
"^" + notification.url.replace(/([\\\+\*\?\[\^\]\$\(\)\{\}\=\!\|\.])/g, "\\$1") + "$"
);
if (url){
lists.appendTo("white", url);
}
}
},
{
label: _("whitelistDomain"),
accessKey: "",
callback: function(){
var domain = window.prompt(
_("inputWhitelistURL"),
notification.domain
);
if (domain){
lists.appendTo("white", domain);
}
}
},
{
label: _("disableNotifications"),
accessKey: "",
callback: function(){
notificationPref.setShow(false);
}
}
];
var priority = notifyBox.PRIORITY_WARNING_MEDIUM;
notification = notifyBox.appendNotification(
message,
"CanvasBlocker-" + messageId,
"chrome://browser/skin/Info.png",
priority,
buttons
);
}
notification.url = url;
notification.domain = domain;
notification.callingStackMsg = callingStackMsg;
var displayTime = notificationPref.displayTime();
if (displayTime){
notification.hideTimeout = setTimeout(function(){
try {
notification.close();
}
catch(e){
// tab is not in focus
}
}, displayTime * 1000);
}
return notification;
}
};
}());