summaryrefslogtreecommitdiffstats
path: root/dom/push
diff options
context:
space:
mode:
Diffstat (limited to 'dom/push')
-rw-r--r--dom/push/PushServiceAndroidGCM.jsm275
-rw-r--r--dom/push/PushSubscriptionOptions.cpp1
-rw-r--r--dom/push/moz.build14
3 files changed, 2 insertions, 288 deletions
diff --git a/dom/push/PushServiceAndroidGCM.jsm b/dom/push/PushServiceAndroidGCM.jsm
deleted file mode 100644
index ed07be339..000000000
--- a/dom/push/PushServiceAndroidGCM.jsm
+++ /dev/null
@@ -1,275 +0,0 @@
-/* jshint moz: true, esnext: 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/. */
-
-"use strict";
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-const Cr = Components.results;
-
-const {PushDB} = Cu.import("resource://gre/modules/PushDB.jsm");
-const {PushRecord} = Cu.import("resource://gre/modules/PushRecord.jsm");
-const {PushCrypto} = Cu.import("resource://gre/modules/PushCrypto.jsm");
-Cu.import("resource://gre/modules/Messaging.jsm"); /*global: Messaging */
-Cu.import("resource://gre/modules/Services.jsm"); /*global: Services */
-Cu.import("resource://gre/modules/Preferences.jsm"); /*global: Preferences */
-Cu.import("resource://gre/modules/Promise.jsm"); /*global: Promise */
-Cu.import("resource://gre/modules/XPCOMUtils.jsm"); /*global: XPCOMUtils */
-
-const Log = Cu.import("resource://gre/modules/AndroidLog.jsm", {}).AndroidLog.bind("Push");
-
-this.EXPORTED_SYMBOLS = ["PushServiceAndroidGCM"];
-
-XPCOMUtils.defineLazyGetter(this, "console", () => {
- let {ConsoleAPI} = Cu.import("resource://gre/modules/Console.jsm", {});
- return new ConsoleAPI({
- dump: Log.i,
- maxLogLevelPref: "dom.push.loglevel",
- prefix: "PushServiceAndroidGCM",
- });
-});
-
-const kPUSHANDROIDGCMDB_DB_NAME = "pushAndroidGCM";
-const kPUSHANDROIDGCMDB_DB_VERSION = 5; // Change this if the IndexedDB format changes
-const kPUSHANDROIDGCMDB_STORE_NAME = "pushAndroidGCM";
-
-const FXA_PUSH_SCOPE = "chrome://fxa-push";
-
-const prefs = new Preferences("dom.push.");
-
-/**
- * The implementation of WebPush push backed by Android's GCM
- * delivery.
- */
-this.PushServiceAndroidGCM = {
- _mainPushService: null,
- _serverURI: null,
-
- newPushDB: function() {
- return new PushDB(kPUSHANDROIDGCMDB_DB_NAME,
- kPUSHANDROIDGCMDB_DB_VERSION,
- kPUSHANDROIDGCMDB_STORE_NAME,
- "channelID",
- PushRecordAndroidGCM);
- },
-
- validServerURI: function(serverURI) {
- if (!serverURI) {
- return false;
- }
-
- if (serverURI.scheme == "https") {
- return true;
- }
- if (serverURI.scheme == "http") {
- // Allow insecure server URLs for development and testing.
- return !!prefs.get("testing.allowInsecureServerURL");
- }
- console.info("Unsupported Android GCM dom.push.serverURL scheme", serverURI.scheme);
- return false;
- },
-
- observe: function(subject, topic, data) {
- switch (topic) {
- case "nsPref:changed":
- if (data == "dom.push.debug") {
- // Reconfigure.
- let debug = !!prefs.get("debug");
- console.info("Debug parameter changed; updating configuration with new debug", debug);
- this._configure(this._serverURI, debug);
- }
- break;
- case "PushServiceAndroidGCM:ReceivedPushMessage":
- this._onPushMessageReceived(data);
- break;
- default:
- break;
- }
- },
-
- _onPushMessageReceived(data) {
- // TODO: Use Messaging.jsm for this.
- if (this._mainPushService == null) {
- // Shouldn't ever happen, but let's be careful.
- console.error("No main PushService! Dropping message.");
- return;
- }
- if (!data) {
- console.error("No data from Java! Dropping message.");
- return;
- }
- data = JSON.parse(data);
- console.debug("ReceivedPushMessage with data", data);
-
- let { headers, message } = this._messageAndHeaders(data);
-
- console.debug("Delivering message to main PushService:", message, headers);
- this._mainPushService.receivedPushMessage(
- data.channelID, "", headers, message, (record) => {
- // Always update the stored record.
- return record;
- });
- },
-
- _messageAndHeaders(data) {
- // Default is no data (and no encryption).
- let message = null;
- let headers = null;
-
- if (data.message && data.enc && (data.enckey || data.cryptokey)) {
- headers = {
- encryption_key: data.enckey,
- crypto_key: data.cryptokey,
- encryption: data.enc,
- encoding: data.con,
- };
- // Ciphertext is (urlsafe) Base 64 encoded.
- message = ChromeUtils.base64URLDecode(data.message, {
- // The Push server may append padding.
- padding: "ignore",
- });
- }
- return { headers, message };
- },
-
- _configure: function(serverURL, debug) {
- return Messaging.sendRequestForResult({
- type: "PushServiceAndroidGCM:Configure",
- endpoint: serverURL.spec,
- debug: debug,
- });
- },
-
- init: function(options, mainPushService, serverURL) {
- console.debug("init()");
- this._mainPushService = mainPushService;
- this._serverURI = serverURL;
-
- prefs.observe("debug", this);
- Services.obs.addObserver(this, "PushServiceAndroidGCM:ReceivedPushMessage", false);
-
- return this._configure(serverURL, !!prefs.get("debug")).then(() => {
- Messaging.sendRequestForResult({
- type: "PushServiceAndroidGCM:Initialized"
- });
- });
- },
-
- uninit: function() {
- console.debug("uninit()");
- Messaging.sendRequestForResult({
- type: "PushServiceAndroidGCM:Uninitialized"
- });
-
- this._mainPushService = null;
- Services.obs.removeObserver(this, "PushServiceAndroidGCM:ReceivedPushMessage");
- prefs.ignore("debug", this);
- },
-
- onAlarmFired: function() {
- // No action required.
- },
-
- connect: function(records) {
- console.debug("connect:", records);
- // It's possible for the registration or subscriptions backing the
- // PushService to not be registered with the underlying AndroidPushService.
- // Expire those that are unrecognized.
- return Messaging.sendRequestForResult({
- type: "PushServiceAndroidGCM:DumpSubscriptions",
- })
- .then(subscriptions => {
- console.debug("connect:", subscriptions);
- // subscriptions maps chid => subscription data.
- return Promise.all(records.map(record => {
- if (subscriptions.hasOwnProperty(record.keyID)) {
- console.debug("connect:", "hasOwnProperty", record.keyID);
- return Promise.resolve();
- }
- console.debug("connect:", "!hasOwnProperty", record.keyID);
- // Subscription is known to PushService.jsm but not to AndroidPushService. Drop it.
- return this._mainPushService.dropRegistrationAndNotifyApp(record.keyID)
- .catch(error => {
- console.error("connect: Error dropping registration", record.keyID, error);
- });
- }));
- });
- },
-
- isConnected: function() {
- return this._mainPushService != null;
- },
-
- disconnect: function() {
- console.debug("disconnect");
- },
-
- register: function(record) {
- console.debug("register:", record);
- let ctime = Date.now();
- let appServerKey = record.appServerKey ?
- ChromeUtils.base64URLEncode(record.appServerKey, {
- // The Push server requires padding.
- pad: true,
- }) : null;
- let message = {
- type: "PushServiceAndroidGCM:SubscribeChannel",
- appServerKey: appServerKey,
- }
- if (record.scope == FXA_PUSH_SCOPE) {
- message.service = "fxa";
- }
- // Caller handles errors.
- return Messaging.sendRequestForResult(message)
- .then(data => {
- console.debug("Got data:", data);
- return PushCrypto.generateKeys()
- .then(exportedKeys =>
- new PushRecordAndroidGCM({
- // Straight from autopush.
- channelID: data.channelID,
- pushEndpoint: data.endpoint,
- // Common to all PushRecord implementations.
- scope: record.scope,
- originAttributes: record.originAttributes,
- ctime: ctime,
- systemRecord: record.systemRecord,
- // Cryptography!
- p256dhPublicKey: exportedKeys[0],
- p256dhPrivateKey: exportedKeys[1],
- authenticationSecret: PushCrypto.generateAuthenticationSecret(),
- appServerKey: record.appServerKey,
- })
- );
- });
- },
-
- unregister: function(record) {
- console.debug("unregister: ", record);
- return Messaging.sendRequestForResult({
- type: "PushServiceAndroidGCM:UnsubscribeChannel",
- channelID: record.keyID,
- });
- },
-
- reportDeliveryError: function(messageID, reason) {
- console.warn("reportDeliveryError: Ignoring message delivery error",
- messageID, reason);
- },
-};
-
-function PushRecordAndroidGCM(record) {
- PushRecord.call(this, record);
- this.channelID = record.channelID;
-}
-
-PushRecordAndroidGCM.prototype = Object.create(PushRecord.prototype, {
- keyID: {
- get() {
- return this.channelID;
- },
- },
-});
diff --git a/dom/push/PushSubscriptionOptions.cpp b/dom/push/PushSubscriptionOptions.cpp
index bc4fead1e..39252e9e8 100644
--- a/dom/push/PushSubscriptionOptions.cpp
+++ b/dom/push/PushSubscriptionOptions.cpp
@@ -36,7 +36,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal)
- NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(PushSubscriptionOptions)
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
diff --git a/dom/push/moz.build b/dom/push/moz.build
index 35683120f..7eee8896f 100644
--- a/dom/push/moz.build
+++ b/dom/push/moz.build
@@ -14,20 +14,10 @@ EXTRA_JS_MODULES += [
'PushDB.jsm',
'PushRecord.jsm',
'PushService.jsm',
+ 'PushServiceHttp2.jsm',
+ 'PushServiceWebSocket.jsm',
]
-if not CONFIG['MOZ_FENNEC']:
- # Everything but Fennec.
- EXTRA_JS_MODULES += [
- 'PushServiceHttp2.jsm',
- 'PushServiceWebSocket.jsm',
- ]
-else:
- # Fennec only.
- EXTRA_JS_MODULES += [
- 'PushServiceAndroidGCM.jsm',
- ]
-
MOCHITEST_MANIFESTS += [
'test/mochitest.ini',
]