1
/* ***** BEGIN LICENSE BLOCK *****
2
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
* The contents of this file are subject to the Mozilla Public License Version
5
* 1.1 (the "License"); you may not use this file except in compliance with
6
* the License. You may obtain a copy of the License at
7
* http://www.mozilla.org/MPL/
9
* Software distributed under the License is distributed on an "AS IS" basis,
10
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
11
* for the specific language governing rights and limitations under the
14
* The Original Code is Bookmarks Sync.
16
* The Initial Developer of the Original Code is Mozilla.
17
* Portions created by the Initial Developer are Copyright (C) 2007
18
* the Initial Developer. All Rights Reserved.
21
* Myk Melez <myk@mozilla.org>
23
* Alternatively, the contents of this file may be used under the terms of
24
* either the GNU General Public License Version 2 or later (the "GPL"), or
25
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
26
* in which case the provisions of the GPL or the LGPL are applicable instead
27
* of those above. If you wish to allow use of your version of this file only
28
* under the terms of either the GPL or the LGPL, and not to allow others to
29
* use your version of this file under the terms of the MPL, indicate your
30
* decision by deleting the provisions above and replace them with the notice
31
* and other provisions required by the GPL or the LGPL. If you do not delete
32
* the provisions above, a recipient may use your version of this file under
33
* the terms of any one of the MPL, the GPL or the LGPL.
35
* ***** END LICENSE BLOCK ***** */
37
const EXPORTED_SYMBOLS = ["Notifications", "Notification", "NotificationButton"];
39
const Cc = Components.classes;
40
const Ci = Components.interfaces;
41
const Cr = Components.results;
42
const Cu = Components.utils;
44
Cu.import("resource://services-sync/ext/Observers.js");
45
Cu.import("resource://services-sync/log4moz.js");
46
Cu.import("resource://services-sync/util.js");
49
// Match the referenced values in toolkit/content/widgets/notification.xml.
50
get PRIORITY_INFO() 1, // PRIORITY_INFO_LOW
51
get PRIORITY_WARNING() 4, // PRIORITY_WARNING_LOW
52
get PRIORITY_ERROR() 7, // PRIORITY_CRITICAL_LOW
54
// FIXME: instead of making this public, dress the Notifications object
55
// to behave like an iterator (using generators?) and have callers access
56
// this array through the Notifications object.
61
// XXX Should we have a helper method for adding a simple notification?
62
// I.e. something like |function notify(title, description, priority)|.
64
add: function Notifications_add(notification) {
65
this.notifications.push(notification);
66
Observers.notify("weave:notification:added", notification, null);
69
remove: function Notifications_remove(notification) {
70
let index = this.notifications.indexOf(notification);
73
this.notifications.splice(index, 1);
74
Observers.notify("weave:notification:removed", notification, null);
79
* Replace an existing notification.
81
replace: function Notifications_replace(oldNotification, newNotification) {
82
let index = this.notifications.indexOf(oldNotification);
85
this.notifications.splice(index, 1, newNotification);
87
this.notifications.push(newNotification);
88
// XXX Should we throw because we didn't find the existing notification?
89
// XXX Should we notify observers about weave:notification:added?
92
// XXX Should we notify observers about weave:notification:replaced?
96
* Remove all notifications that match a title. If no title is provided, all
97
* notifications are removed.
99
* @param title [optional]
100
* Title of notifications to remove; falsy value means remove all
102
removeAll: function Notifications_removeAll(title) {
103
this.notifications.filter(function(old) old.title == title || !title).
104
forEach(function(old) this.remove(old), this);
107
// replaces all existing notifications with the same title as the new one
108
replaceTitle: function Notifications_replaceTitle(notification) {
109
this.removeAll(notification.title);
110
this.add(notification);
116
* A basic notification. Subclass this to create more complex notifications.
118
function Notification(title, description, iconURL, priority, buttons) {
120
this.description = description;
123
this.iconURL = iconURL;
126
this.priority = priority;
129
this.buttons = buttons;
132
// We set each prototype property individually instead of redefining
133
// the entire prototype to avoid blowing away existing properties
134
// of the prototype like the the "constructor" property, which we use
135
// to bind notification objects to their XBL representations.
136
Notification.prototype.priority = Notifications.PRIORITY_INFO;
137
Notification.prototype.iconURL = null;
138
Notification.prototype.buttons = [];
141
* A button to display in a notification.
143
function NotificationButton(label, accessKey, callback) {
144
function callbackWrapper() {
146
callback.apply(this, arguments);
148
let logger = Log4Moz.repository.getLogger("Notifications");
149
logger.error("An exception occurred: " + Utils.exceptionStr(e));
150
logger.info(Utils.stackTrace(e));
156
this.accessKey = accessKey;
157
this.callback = callbackWrapper;