зеркало из https://github.com/mozilla/gecko-dev.git
148 строки
4.9 KiB
JavaScript
148 строки
4.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";
|
||
|
|
||
|
// Don't modify this, instead set services.push.debug.
|
||
|
let gDebuggingEnabled = false;
|
||
|
|
||
|
function debug(s) {
|
||
|
if (gDebuggingEnabled)
|
||
|
dump("-*- Push.js: " + s + "\n");
|
||
|
}
|
||
|
|
||
|
const Cc = Components.classes;
|
||
|
const Ci = Components.interfaces;
|
||
|
const Cu = Components.utils;
|
||
|
|
||
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||
|
Cu.import("resource://gre/modules/Services.jsm");
|
||
|
Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
|
||
|
Cu.import("resource://gre/modules/AppsUtils.jsm");
|
||
|
|
||
|
const PUSH_CID = Components.ID("{cde1d019-fad8-4044-b141-65fb4fb7a245}");
|
||
|
|
||
|
/**
|
||
|
* The Push component runs in the child process and exposes the SimplePush API
|
||
|
* to the web application. The PushService running in the parent process is the
|
||
|
* one actually performing all operations.
|
||
|
*/
|
||
|
function Push() {
|
||
|
debug("Push Constructor");
|
||
|
}
|
||
|
|
||
|
Push.prototype = {
|
||
|
__proto__: DOMRequestIpcHelper.prototype,
|
||
|
|
||
|
contractID: "@mozilla.org/push/PushManager;1",
|
||
|
|
||
|
classID : PUSH_CID,
|
||
|
|
||
|
QueryInterface : XPCOMUtils.generateQI([Ci.nsIDOMGlobalPropertyInitializer,
|
||
|
Ci.nsISupportsWeakReference,
|
||
|
Ci.nsIObserver]),
|
||
|
|
||
|
init: function(aWindow) {
|
||
|
// Set debug first so that all debugging actually works.
|
||
|
// NOTE: We don't add an observer here like in PushService. Flipping the
|
||
|
// pref will require a reload of the app/page, which seems acceptable.
|
||
|
gDebuggingEnabled = Services.prefs.getBoolPref("services.push.debug");
|
||
|
debug("init()");
|
||
|
|
||
|
let principal = aWindow.document.nodePrincipal;
|
||
|
let appsService = Cc["@mozilla.org/AppsService;1"]
|
||
|
.getService(Ci.nsIAppsService);
|
||
|
|
||
|
this._manifestURL = appsService.getManifestURLByLocalId(principal.appId);
|
||
|
this._pageURL = principal.URI;
|
||
|
|
||
|
this.initDOMRequestHelper(aWindow, [
|
||
|
"PushService:Register:OK",
|
||
|
"PushService:Register:KO",
|
||
|
"PushService:Unregister:OK",
|
||
|
"PushService:Unregister:KO",
|
||
|
"PushService:Registrations:OK",
|
||
|
"PushService:Registrations:KO"
|
||
|
]);
|
||
|
|
||
|
this._cpmm = Cc["@mozilla.org/childprocessmessagemanager;1"]
|
||
|
.getService(Ci.nsISyncMessageSender);
|
||
|
},
|
||
|
|
||
|
receiveMessage: function(aMessage) {
|
||
|
debug("receiveMessage()");
|
||
|
let request = this.getRequest(aMessage.data.requestID);
|
||
|
let json = aMessage.data;
|
||
|
if (!request) {
|
||
|
debug("No request " + json.requestID);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
switch (aMessage.name) {
|
||
|
case "PushService:Register:OK":
|
||
|
Services.DOMRequest.fireSuccess(request, json.pushEndpoint);
|
||
|
break;
|
||
|
case "PushService:Register:KO":
|
||
|
Services.DOMRequest.fireError(request, json.error);
|
||
|
break;
|
||
|
case "PushService:Unregister:OK":
|
||
|
Services.DOMRequest.fireSuccess(request, json.pushEndpoint);
|
||
|
break;
|
||
|
case "PushService:Unregister:KO":
|
||
|
Services.DOMRequest.fireError(request, json.error);
|
||
|
break;
|
||
|
case "PushService:Registrations:OK":
|
||
|
Services.DOMRequest.fireSuccess(request, json.registrations);
|
||
|
break;
|
||
|
case "PushService:Registrations:KO":
|
||
|
Services.DOMRequest.fireError(request, json.error);
|
||
|
break;
|
||
|
default:
|
||
|
debug("NOT IMPLEMENTED! receiveMessage for " + aMessage.name);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
register: function() {
|
||
|
debug("register()");
|
||
|
let req = this.createRequest();
|
||
|
if (!Services.prefs.getBoolPref("services.push.connection.enabled")) {
|
||
|
// If push socket is disabled by the user, immediately error rather than
|
||
|
// timing out.
|
||
|
Services.DOMRequest.fireErrorAsync(req, "NetworkError");
|
||
|
return req;
|
||
|
}
|
||
|
|
||
|
this._cpmm.sendAsyncMessage("Push:Register", {
|
||
|
pageURL: this._pageURL.spec,
|
||
|
manifestURL: this._manifestURL,
|
||
|
requestID: this.getRequestId(req)
|
||
|
});
|
||
|
return req;
|
||
|
},
|
||
|
|
||
|
unregister: function(aPushEndpoint) {
|
||
|
debug("unregister(" + aPushEndpoint + ")");
|
||
|
let req = this.createRequest();
|
||
|
this._cpmm.sendAsyncMessage("Push:Unregister", {
|
||
|
pageURL: this._pageURL.spec,
|
||
|
manifestURL: this._manifestURL,
|
||
|
requestID: this.getRequestId(req),
|
||
|
pushEndpoint: aPushEndpoint
|
||
|
});
|
||
|
return req;
|
||
|
},
|
||
|
|
||
|
registrations: function() {
|
||
|
debug("registrations()");
|
||
|
let req = this.createRequest();
|
||
|
this._cpmm.sendAsyncMessage("Push:Registrations", {
|
||
|
manifestURL: this._manifestURL,
|
||
|
requestID: this.getRequestId(req)
|
||
|
});
|
||
|
return req;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.NSGetFactory = XPCOMUtils.generateNSGetFactory([Push]);
|