mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-11-26 06:11:37 +00:00
61d81bcfb0
There are some notifications that we know we don't want to resend. For instance, Voicemail notifications are some, since everytime the network will be ready it will notify us of the status, so we don't have to resend it on reboot. We add a 'showOnlyOnce' key in the MozBehavior dict for this usecase.
127 lines
3.9 KiB
JavaScript
127 lines
3.9 KiB
JavaScript
/* 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/. */
|
|
|
|
"use strict";
|
|
|
|
const DEBUG = false;
|
|
|
|
function debug(s) {
|
|
dump("-*- ChromeNotifications.js: " + s + "\n");
|
|
}
|
|
|
|
const Ci = Components.interfaces;
|
|
const Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "Services",
|
|
"resource://gre/modules/Services.jsm");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
|
|
"@mozilla.org/childprocessmessagemanager;1",
|
|
"nsIMessageSender");
|
|
|
|
XPCOMUtils.defineLazyServiceGetter(this, "appNotifier",
|
|
"@mozilla.org/system-alerts-service;1",
|
|
"nsIAppNotificationService");
|
|
|
|
const CHROMENOTIFICATIONS_CID = "{74f94093-8b37-497e-824f-c3b250a911da}";
|
|
const CHROMENOTIFICATIONS_CONTRACTID = "@mozilla.org/mozChromeNotifications;1";
|
|
|
|
function ChromeNotifications() {
|
|
this.innerWindowID = null;
|
|
this.resendCallback = null;
|
|
}
|
|
|
|
ChromeNotifications.prototype = {
|
|
|
|
init: function(aWindow) {
|
|
let util = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDOMWindowUtils);
|
|
this.innerWindowID = util.currentInnerWindowID;
|
|
Services.obs.addObserver(this, "inner-window-destroyed", false);
|
|
cpmm.addMessageListener("Notification:GetAllCrossOrigin:Return:OK", this);
|
|
},
|
|
|
|
performResend: function(notifications) {
|
|
let resentNotifications = 0;
|
|
|
|
notifications.forEach(function(notification) {
|
|
let behavior;
|
|
try {
|
|
behavior = JSON.parse(notification.mozbehavior);
|
|
} catch(e) {
|
|
behavior = undefined;
|
|
}
|
|
|
|
if (behavior && behavior.showOnlyOnce === true) {
|
|
return;
|
|
}
|
|
|
|
appNotifier.showAppNotification(
|
|
notification.icon,
|
|
notification.title,
|
|
notification.body,
|
|
null,
|
|
{
|
|
manifestURL: notification.origin,
|
|
id: notification.alertName,
|
|
dir: notification.dir,
|
|
lang: notification.lang,
|
|
tag: notification.tag,
|
|
dbId: notification.id,
|
|
timestamp: notification.timestamp,
|
|
data: notification.data,
|
|
mozbehavior: behavior
|
|
}
|
|
);
|
|
resentNotifications++;
|
|
});
|
|
|
|
try {
|
|
this.resendCallback && this.resendCallback(resentNotifications);
|
|
} catch (ex) {
|
|
if (DEBUG) debug("Content sent exception: " + ex);
|
|
}
|
|
},
|
|
|
|
mozResendAllNotifications: function(resendCallback) {
|
|
this.resendCallback = resendCallback;
|
|
cpmm.sendAsyncMessage("Notification:GetAllCrossOrigin", {});
|
|
},
|
|
|
|
receiveMessage: function(message) {
|
|
switch (message.name) {
|
|
case "Notification:GetAllCrossOrigin:Return:OK":
|
|
this.performResend(message.data.notifications);
|
|
break;
|
|
|
|
default:
|
|
if (DEBUG) { debug("Unrecognized message: " + message.name); }
|
|
break;
|
|
}
|
|
},
|
|
|
|
observe: function(aSubject, aTopic, aData) {
|
|
if (DEBUG) debug("Topic: " + aTopic);
|
|
if (aTopic == "inner-window-destroyed") {
|
|
let wId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data;
|
|
if (wId != this.innerWindowID) {
|
|
return;
|
|
}
|
|
Services.obs.removeObserver(this, "inner-window-destroyed");
|
|
cpmm.removeMessageListener("Notification:GetAllCrossOrigin:Return:OK", this);
|
|
}
|
|
},
|
|
|
|
classID : Components.ID(CHROMENOTIFICATIONS_CID),
|
|
contractID : CHROMENOTIFICATIONS_CONTRACTID,
|
|
QueryInterface: XPCOMUtils.generateQI([Ci.nsIChromeNotifications,
|
|
Ci.nsIDOMGlobalPropertyInitializer,
|
|
Ci.nsIObserver,
|
|
Ci.nsIMessageListener]),
|
|
};
|
|
|
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ChromeNotifications]);
|