diff -r 000000000000 -r 6474c204b198 dom/push/src/Push.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/push/src/Push.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,147 @@ +/* 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]);