Bug 1296579 - Remove the SimplePush API r=kitcambridge,baku
authorGabriele Svelto <gsvelto@mozilla.com>
Thu, 01 Sep 2016 20:17:03 +0200
changeset 312341 4e2ee40eaefc9a1e31196ac3fec28f62601e8050
parent 312321 bf74e1c6268091d4a2c8f1c3af1f182ad33fa392
child 312342 247a05cd82408233e48898c7d1fecd08c6ae897d
push id20447
push userkwierso@gmail.com
push dateFri, 02 Sep 2016 20:36:44 +0000
treeherderfx-team@969397f22187 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerskitcambridge, baku
bugs1296579
milestone51.0a1
Bug 1296579 - Remove the SimplePush API r=kitcambridge,baku
b2g/app/b2g.js
b2g/confvars.sh
b2g/installer/package-manifest.in
dom/bindings/moz.build
dom/ipc/ContentChild.cpp
dom/ipc/ContentParent.cpp
dom/moz.build
dom/notification/Notification.cpp
dom/push/Push.js
dom/push/PushService.jsm
dom/simplepush/Push.js
dom/simplepush/Push.manifest
dom/simplepush/PushService.jsm
dom/simplepush/PushServiceLauncher.js
dom/simplepush/moz.build
dom/simplepush/test/mochitest.ini
dom/simplepush/test/test_permissions.html
dom/simplepush/test/test_prefs.html
dom/simplepush/test/test_register.html
dom/webidl/ServiceWorkerRegistration.webidl
dom/webidl/SimplePushManager.webidl
dom/webidl/moz.build
dom/workers/ServiceWorkerEvents.cpp
dom/workers/ServiceWorkerEvents.h
dom/workers/ServiceWorkerManager.cpp
dom/workers/ServiceWorkerPrivate.cpp
dom/workers/ServiceWorkerRegistration.cpp
layout/build/nsLayoutModule.cpp
mobile/android/app/mobile.js
old-configure.in
--- a/b2g/app/b2g.js
+++ b/b2g/app/b2g.js
@@ -401,50 +401,16 @@ pref("dom.phonenumber.substringmatching.
 pref("dom.phonenumber.substringmatching.CO", 10);
 pref("dom.phonenumber.substringmatching.VE", 7);
 pref("dom.phonenumber.substringmatching.CL", 8);
 pref("dom.phonenumber.substringmatching.PE", 7);
 
 // WebAlarms
 pref("dom.mozAlarms.enabled", true);
 
-// SimplePush
-pref("services.push.enabled", true);
-// Debugging enabled.
-pref("services.push.debug", false);
-// Is the network connection allowed to be up?
-// This preference should be used in UX to enable/disable push.
-pref("services.push.connection.enabled", true);
-// serverURL to be assigned by services team
-pref("services.push.serverURL", "wss://push.services.mozilla.com/");
-pref("services.push.userAgentID", "");
-// Exponential back-off start is 5 seconds like in HTTP/1.1.
-// Maximum back-off is pingInterval.
-pref("services.push.retryBaseInterval", 5000);
-// Interval at which to ping PushServer to check connection status. In
-// milliseconds. If no reply is received within requestTimeout, the connection
-// is considered closed.
-pref("services.push.pingInterval", 1800000); // 30 minutes
-// How long before a DOMRequest errors as timeout
-pref("services.push.requestTimeout", 10000);
-pref("services.push.pingInterval.default", 180000);// 3 min
-pref("services.push.pingInterval.mobile", 180000); // 3 min
-pref("services.push.pingInterval.wifi", 180000);  // 3 min
-// Adaptive ping
-pref("services.push.adaptive.enabled", true);
-pref("services.push.adaptive.lastGoodPingInterval", 180000);// 3 min
-pref("services.push.adaptive.lastGoodPingInterval.mobile", 180000);// 3 min
-pref("services.push.adaptive.lastGoodPingInterval.wifi", 180000);// 3 min
-// Valid gap between the biggest good ping and the bad ping
-pref("services.push.adaptive.gap", 60000); // 1 minute
-// We limit the ping to this maximum value
-pref("services.push.adaptive.upperLimit", 1740000); // 29 min
-// enable udp wakeup support
-pref("services.push.udp.wakeupEnabled", true);
-
 // NetworkStats
 #ifdef MOZ_WIDGET_GONK
 pref("dom.mozNetworkStats.enabled", true);
 pref("dom.webapps.firstRunWithSIM", true);
 #endif
 
 // ResourceStats
 #ifdef MOZ_WIDGET_GONK
--- a/b2g/confvars.sh
+++ b/b2g/confvars.sh
@@ -31,17 +31,16 @@ fi
 MOZ_USE_NATIVE_POPUP_WINDOWS=1
 
 MOZ_XULRUNNER=
 
 MOZ_APP_ID={3c2e2abc-06d4-11e1-ac3b-374f68613e61}
 
 MOZ_TIME_MANAGER=1
 
-MOZ_SIMPLEPUSH=1
 MOZ_TOOLKIT_SEARCH=
 MOZ_B2G=1
 
 MOZ_JSDOWNLOADS=1
 
 MOZ_BUNDLED_FONTS=1
 
 export JS_GC_SMALL_CHUNK_SIZE=1
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -599,21 +599,17 @@
 @RESPATH@/components/XULStore.js
 @RESPATH@/components/XULStore.manifest
 @RESPATH@/components/Webapps.js
 @RESPATH@/components/Webapps.manifest
 @RESPATH@/components/AppsService.js
 @RESPATH@/components/AppsService.manifest
 @RESPATH@/components/Push.js
 @RESPATH@/components/Push.manifest
-#ifdef MOZ_SIMPLEPUSH
-@RESPATH@/components/PushServiceLauncher.js
-#else
 @RESPATH@/components/PushComponents.js
-#endif
 
 @RESPATH@/components/nsDOMIdentity.js
 @RESPATH@/components/nsIDService.js
 @RESPATH@/components/Identity.manifest
 
 @RESPATH@/components/SystemMessageInternal.js
 @RESPATH@/components/SystemMessageManager.js
 @RESPATH@/components/SystemMessageCache.js
--- a/dom/bindings/moz.build
+++ b/dom/bindings/moz.build
@@ -139,19 +139,16 @@ FINAL_LIBRARY = 'xul'
 SPHINX_TREES['webidl'] = 'docs'
 SPHINX_PYTHON_PACKAGE_DIRS += ['mozwebidlcodegen']
 
 if CONFIG['MOZ_BUILD_APP'] in ['browser', 'mobile/android', 'xulrunner']:
     # This is needed for Window.webidl
     DEFINES['HAVE_SIDEBAR'] = True
 
 
-if CONFIG['MOZ_SIMPLEPUSH']:
-    DEFINES['MOZ_SIMPLEPUSH'] = True
-
 PYTHON_UNIT_TESTS += [
     'mozwebidlcodegen/test/test_mozwebidlcodegen.py',
 ]
 
 if CONFIG['GNU_CXX']:
     CXXFLAGS += ['-Wno-error=shadow']
 
 if CONFIG['COMPILE_ENVIRONMENT']:
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -27,16 +27,17 @@
 #include "mozilla/dom/ContentParent.h"
 #include "mozilla/dom/DataTransfer.h"
 #include "mozilla/dom/DOMStorageIPC.h"
 #include "mozilla/dom/ExternalHelperAppChild.h"
 #include "mozilla/dom/FlyWebPublishedServerIPC.h"
 #include "mozilla/dom/GetFilesHelper.h"
 #include "mozilla/dom/PCrashReporterChild.h"
 #include "mozilla/dom/ProcessGlobal.h"
+#include "mozilla/dom/PushNotifier.h"
 #include "mozilla/dom/workers/ServiceWorkerManager.h"
 #include "mozilla/dom/nsIContentChild.h"
 #include "mozilla/gfx/gfxVars.h"
 #include "mozilla/psm/PSMContentListener.h"
 #include "mozilla/hal_sandbox/PHalChild.h"
 #include "mozilla/ipc/BackgroundChild.h"
 #include "mozilla/ipc/FileDescriptorSetChild.h"
 #include "mozilla/ipc/FileDescriptorUtils.h"
@@ -162,20 +163,16 @@
 #ifdef MOZ_X11
 #include "mozilla/X11Util.h"
 #endif
 
 #ifdef ACCESSIBILITY
 #include "nsAccessibilityService.h"
 #endif
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/PushNotifier.h"
-#endif
-
 #include "mozilla/dom/File.h"
 #include "mozilla/dom/cellbroadcast/CellBroadcastIPCService.h"
 #include "mozilla/dom/icc/IccChild.h"
 #include "mozilla/dom/mobileconnection/MobileConnectionChild.h"
 #include "mozilla/dom/mobilemessage/SmsChild.h"
 #include "mozilla/dom/devicestorage/DeviceStorageRequestChild.h"
 #include "mozilla/dom/bluetooth/PBluetoothChild.h"
 #include "mozilla/dom/PFMRadioChild.h"
@@ -3250,66 +3247,56 @@ ContentChild::RecvEndDragSession(const b
   return true;
 }
 
 bool
 ContentChild::RecvPush(const nsCString& aScope,
                        const IPC::Principal& aPrincipal,
                        const nsString& aMessageId)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Nothing());
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObserversAndWorkers()));
-#endif
   return true;
 }
 
 bool
 ContentChild::RecvPushWithData(const nsCString& aScope,
                                const IPC::Principal& aPrincipal,
                                const nsString& aMessageId,
                                InfallibleTArray<uint8_t>&& aData)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Some(aData));
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObserversAndWorkers()));
-#endif
   return true;
 }
 
 bool
 ContentChild::RecvPushSubscriptionChange(const nsCString& aScope,
                                          const IPC::Principal& aPrincipal)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushSubscriptionChangeDispatcher dispatcher(aScope, aPrincipal);
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObserversAndWorkers()));
-#endif
   return true;
 }
 
 bool
 ContentChild::RecvPushError(const nsCString& aScope, const IPC::Principal& aPrincipal,
                             const nsString& aMessage, const uint32_t& aFlags)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushErrorDispatcher dispatcher(aScope, aPrincipal, aMessage, aFlags);
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObserversAndWorkers()));
-#endif
   return true;
 }
 
 bool
 ContentChild::RecvNotifyPushSubscriptionModifiedObservers(const nsCString& aScope,
                                                           const IPC::Principal& aPrincipal)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushSubscriptionModifiedDispatcher dispatcher(aScope, aPrincipal);
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
-#endif
   return true;
 }
 
 bool
 ContentChild::RecvBlobURLRegistration(const nsCString& aURI, PBlobChild* aBlobChild,
                                       const IPC::Principal& aPrincipal)
 {
   RefPtr<BlobImpl> blobImpl = static_cast<BlobChild*>(aBlobChild)->GetBlobImpl();
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -61,16 +61,17 @@
 #include "mozilla/dom/devicestorage/DeviceStorageRequestParent.h"
 #include "mozilla/dom/icc/IccParent.h"
 #include "mozilla/dom/mobileconnection/MobileConnectionParent.h"
 #include "mozilla/dom/mobilemessage/SmsParent.h"
 #include "mozilla/dom/power/PowerManagerService.h"
 #include "mozilla/dom/Permissions.h"
 #include "mozilla/dom/PresentationParent.h"
 #include "mozilla/dom/PPresentationParent.h"
+#include "mozilla/dom/PushNotifier.h"
 #include "mozilla/dom/FlyWebPublishedServerIPC.h"
 #include "mozilla/dom/quota/QuotaManagerService.h"
 #include "mozilla/dom/telephony/TelephonyParent.h"
 #include "mozilla/dom/time/DateCacheCleaner.h"
 #include "mozilla/dom/voicemail/VoicemailParent.h"
 #include "mozilla/embedding/printingui/PrintingParent.h"
 #include "mozilla/gfx/gfxVars.h"
 #include "mozilla/gfx/GPUProcessManager.h"
@@ -258,20 +259,16 @@ using namespace mozilla::system;
 #include "nsIBrowserSearchService.h"
 #endif
 
 #ifdef MOZ_ENABLE_PROFILER_SPS
 #include "nsIProfiler.h"
 #include "nsIProfileSaveEvent.h"
 #endif
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/PushNotifier.h"
-#endif
-
 #ifdef XP_WIN
 #include "mozilla/widget/AudioSession.h"
 #endif
 
 #ifdef MOZ_CRASHREPORTER
 #include "nsThread.h"
 #endif
 
@@ -5271,55 +5268,47 @@ ContentParent::StartProfiler(nsIProfiler
 #endif
 }
 
 bool
 ContentParent::RecvNotifyPushObservers(const nsCString& aScope,
                                        const IPC::Principal& aPrincipal,
                                        const nsString& aMessageId)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Nothing());
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
-#endif
   return true;
 }
 
 bool
 ContentParent::RecvNotifyPushObserversWithData(const nsCString& aScope,
                                                const IPC::Principal& aPrincipal,
                                                const nsString& aMessageId,
                                                InfallibleTArray<uint8_t>&& aData)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushMessageDispatcher dispatcher(aScope, aPrincipal, aMessageId, Some(aData));
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
-#endif
   return true;
 }
 
 bool
 ContentParent::RecvNotifyPushSubscriptionChangeObservers(const nsCString& aScope,
                                                          const IPC::Principal& aPrincipal)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushSubscriptionChangeDispatcher dispatcher(aScope, aPrincipal);
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
-#endif
   return true;
 }
 
 bool
 ContentParent::RecvNotifyPushSubscriptionModifiedObservers(const nsCString& aScope,
                                                            const IPC::Principal& aPrincipal)
 {
-#ifndef MOZ_SIMPLEPUSH
   PushSubscriptionModifiedDispatcher dispatcher(aScope, aPrincipal);
   Unused << NS_WARN_IF(NS_FAILED(dispatcher.NotifyObservers()));
-#endif
   return true;
 }
 
 bool
 ContentParent::RecvNotifyLowMemory()
 {
 #ifdef MOZ_CRASHREPORTER
   nsThread::SaveMemoryReportNearOOM(nsThread::ShouldSaveMemoryReport::kForceReport);
--- a/dom/moz.build
+++ b/dom/moz.build
@@ -70,16 +70,17 @@ DIRS += [
     'jsurl',
     'asmjscache',
     'mathml',
     'media',
     'mobileconnection',
     'notification',
     'offline',
     'power',
+    'push',
     'quota',
     'security',
     'settings',
     'storage',
     'svg',
     'mobilemessage',
     'time',
     'locales',
@@ -130,21 +131,16 @@ if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'gonk
 if CONFIG['MOZ_B2G_RIL']:
     DIRS += [
         'wappush',
     ]
 
 if CONFIG['MOZ_NFC']:
     DIRS += ['nfc']
 
-if CONFIG['MOZ_SIMPLEPUSH']:
-    DIRS += ['simplepush']
-else:
-    DIRS += ['push']
-
 if CONFIG['MOZ_SECUREELEMENT']:
     DIRS += ['secureelement']
 
 if CONFIG['MOZ_B2G']:
     DIRS += [
         'downloads',
         'identity'
     ]
--- a/dom/notification/Notification.cpp
+++ b/dom/notification/Notification.cpp
@@ -33,16 +33,17 @@
 #include "nsIAlertsService.h"
 #include "nsIAppsService.h"
 #include "nsIContentPermissionPrompt.h"
 #include "nsIDocument.h"
 #include "nsILoadContext.h"
 #include "nsINotificationStorage.h"
 #include "nsIPermissionManager.h"
 #include "nsIPermission.h"
+#include "nsIPushService.h"
 #include "nsIScriptSecurityManager.h"
 #include "nsIServiceWorkerManager.h"
 #include "nsISimpleEnumerator.h"
 #include "nsIUUIDGenerator.h"
 #include "nsIXPConnect.h"
 #include "nsNetUtil.h"
 #include "nsProxyRelease.h"
 #include "nsServiceManagerUtils.h"
@@ -54,20 +55,16 @@
 #include "WorkerPrivate.h"
 #include "WorkerRunnable.h"
 #include "WorkerScope.h"
 
 #ifdef MOZ_B2G
 #include "nsIDOMDesktopNotification.h"
 #endif
 
-#ifndef MOZ_SIMPLEPUSH
-#include "nsIPushService.h"
-#endif
-
 namespace mozilla {
 namespace dom {
 
 using namespace workers;
 
 struct NotificationStrings
 {
   const nsString mID;
@@ -1441,36 +1438,32 @@ NotificationObserver::Observe(nsISupport
   }
 
   return mObserver->Observe(aSubject, aTopic, aData);
 }
 
 nsresult
 NotificationObserver::AdjustPushQuota(const char* aTopic)
 {
-#ifdef MOZ_SIMPLEPUSH
-  return NS_ERROR_NOT_IMPLEMENTED;
-#else
   nsCOMPtr<nsIPushQuotaManager> pushQuotaManager =
     do_GetService("@mozilla.org/push/Service;1");
   if (!pushQuotaManager) {
     return NS_ERROR_FAILURE;
   }
 
   nsAutoCString origin;
   nsresult rv = mPrincipal->GetOrigin(origin);
   if (NS_FAILED(rv)) {
     return rv;
   }
 
   if (!strcmp("alertshow", aTopic)) {
     return pushQuotaManager->NotificationForOriginShown(origin.get());
   }
   return pushQuotaManager->NotificationForOriginClosed(origin.get());
-#endif
 }
 
 NS_IMETHODIMP
 MainThreadNotificationObserver::Observe(nsISupports* aSubject, const char* aTopic,
                                         const char16_t* aData)
 {
   AssertIsOnMainThread();
   MOZ_ASSERT(mNotificationRef);
--- a/dom/push/Push.js
+++ b/dom/push/Push.js
@@ -22,17 +22,17 @@ XPCOMUtils.defineLazyGetter(this, "conso
 });
 
 XPCOMUtils.defineLazyServiceGetter(this, "PushService",
   "@mozilla.org/push/Service;1", "nsIPushService");
 
 const PUSH_CID = Components.ID("{cde1d019-fad8-4044-b141-65fb4fb7a245}");
 
 /**
- * The Push component runs in the child process and exposes the SimplePush API
+ * The Push component runs in the child process and exposes the Push API
  * to the web application. The PushService running in the parent process is the
  * one actually performing all operations.
  */
 function Push() {
   console.debug("Push()");
 }
 
 Push.prototype = {
--- a/dom/push/PushService.jsm
+++ b/dom/push/PushService.jsm
@@ -1053,17 +1053,17 @@ this.PushService = {
           return this._service.unregister(...params);
       }
       return Promise.reject(new Error("Unknown request type: " + action));
     });
   },
 
   /**
    * Called on message from the child process. aPageRecord is an object sent by
-   * navigator.push, identifying the sending page and other fields.
+   * the push manager, identifying the sending page and other fields.
    */
   _registerWithServer: function(aPageRecord) {
     console.debug("registerWithServer()", aPageRecord);
 
     Services.telemetry.getHistogramById("PUSH_API_SUBSCRIBE_ATTEMPT").add();
     return this._sendRequest("register", aPageRecord)
       .then(record => this._onRegisterSuccess(record),
             err => this._onRegisterError(err))
deleted file mode 100644
--- a/dom/simplepush/Push.js
+++ /dev/null
@@ -1,147 +0,0 @@
-/* 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.
-var 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]);
deleted file mode 100644
--- a/dom/simplepush/Push.manifest
+++ /dev/null
@@ -1,8 +0,0 @@
-# DOM API
-component {cde1d019-fad8-4044-b141-65fb4fb7a245} Push.js
-contract @mozilla.org/push/PushManager;1 {cde1d019-fad8-4044-b141-65fb4fb7a245}
-
-# Component to initialize PushService on startup.
-component {4b8caa3b-3c58-4f3c-a7f5-7bd9cb24c11d} PushServiceLauncher.js
-contract @mozilla.org/push/ServiceLauncher;1 {4b8caa3b-3c58-4f3c-a7f5-7bd9cb24c11d}
-category app-startup PushServiceLauncher @mozilla.org/push/ServiceLauncher;1
deleted file mode 100644
--- a/dom/simplepush/PushService.jsm
+++ /dev/null
@@ -1,1851 +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";
-
-// Don't modify this, instead set services.push.debug.
-var gDebuggingEnabled = false;
-
-function debug(s) {
-  if (gDebuggingEnabled)
-    dump("-*- PushService.jsm: " + s + "\n");
-}
-
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-const Cu = Components.utils;
-const Cr = Components.results;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/IndexedDBHelper.jsm");
-Cu.import("resource://gre/modules/Timer.jsm");
-Cu.import("resource://gre/modules/Preferences.jsm");
-Cu.import("resource://gre/modules/Promise.jsm");
-Cu.importGlobalProperties(["indexedDB"]);
-
-XPCOMUtils.defineLazyServiceGetter(this, "gDNSService",
-                                   "@mozilla.org/network/dns-service;1",
-                                   "nsIDNSService");
-
-XPCOMUtils.defineLazyModuleGetter(this, "AlarmService",
-                                  "resource://gre/modules/AlarmService.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "gPowerManagerService",
-                                   "@mozilla.org/power/powermanagerservice;1",
-                                   "nsIPowerManagerService");
-
-var threadManager = Cc["@mozilla.org/thread-manager;1"].getService(Ci.nsIThreadManager);
-
-this.EXPORTED_SYMBOLS = ["PushService"];
-
-const prefs = new Preferences("services.push.");
-// Set debug first so that all debugging actually works.
-gDebuggingEnabled = prefs.get("debug");
-
-const kPUSHDB_DB_NAME = "push";
-const kPUSHDB_DB_VERSION = 1; // Change this if the IndexedDB format changes
-const kPUSHDB_STORE_NAME = "push";
-
-const kUDP_WAKEUP_WS_STATUS_CODE = 4774;  // WebSocket Close status code sent
-                                          // by server to signal that it can
-                                          // wake client up using UDP.
-
-const kCHILD_PROCESS_MESSAGES = ["Push:Register", "Push:Unregister",
-                                 "Push:Registrations"];
-
-// This is a singleton
-this.PushDB = function PushDB() {
-  debug("PushDB()");
-
-  // set the indexeddb database
-  this.initDBHelper(kPUSHDB_DB_NAME, kPUSHDB_DB_VERSION,
-                    [kPUSHDB_STORE_NAME]);
-};
-
-this.PushDB.prototype = {
-  __proto__: IndexedDBHelper.prototype,
-
-  upgradeSchema: function(aTransaction, aDb, aOldVersion, aNewVersion) {
-    debug("PushDB.upgradeSchema()");
-
-    let objectStore = aDb.createObjectStore(kPUSHDB_STORE_NAME,
-                                            { keyPath: "channelID" });
-
-    // index to fetch records based on endpoints. used by unregister
-    objectStore.createIndex("pushEndpoint", "pushEndpoint", { unique: true });
-
-    // index to fetch records per manifest, so we can identify endpoints
-    // associated with an app. Since an app can have multiple endpoints
-    // uniqueness cannot be enforced
-    objectStore.createIndex("manifestURL", "manifestURL", { unique: false });
-  },
-
-  /*
-   * @param aChannelRecord
-   *        The record to be added.
-   * @param aSuccessCb
-   *        Callback function to invoke with result ID.
-   * @param aErrorCb [optional]
-   *        Callback function to invoke when there was an error.
-   */
-  put: function(aChannelRecord, aSuccessCb, aErrorCb) {
-    debug("put()");
-
-    this.newTxn(
-      "readwrite",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        debug("Going to put " + aChannelRecord.channelID);
-        aStore.put(aChannelRecord).onsuccess = function setTxnResult(aEvent) {
-          debug("Request successful. Updated record ID: " +
-                aEvent.target.result);
-        };
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  /*
-   * @param aChannelID
-   *        The ID of record to be deleted.
-   * @param aSuccessCb
-   *        Callback function to invoke with result.
-   * @param aErrorCb [optional]
-   *        Callback function to invoke when there was an error.
-   */
-  delete: function(aChannelID, aSuccessCb, aErrorCb) {
-    debug("delete()");
-
-    this.newTxn(
-      "readwrite",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        debug("Going to delete " + aChannelID);
-        aStore.delete(aChannelID);
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  getByPushEndpoint: function(aPushEndpoint, aSuccessCb, aErrorCb) {
-    debug("getByPushEndpoint()");
-
-    this.newTxn(
-      "readonly",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        aTxn.result = undefined;
-
-        let index = aStore.index("pushEndpoint");
-        index.get(aPushEndpoint).onsuccess = function setTxnResult(aEvent) {
-          aTxn.result = aEvent.target.result;
-          debug("Fetch successful " + aEvent.target.result);
-        }
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  getByChannelID: function(aChannelID, aSuccessCb, aErrorCb) {
-    debug("getByChannelID()");
-
-    this.newTxn(
-      "readonly",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        aTxn.result = undefined;
-
-        aStore.get(aChannelID).onsuccess = function setTxnResult(aEvent) {
-          aTxn.result = aEvent.target.result;
-          debug("Fetch successful " + aEvent.target.result);
-        }
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  getAllByManifestURL: function(aManifestURL, aSuccessCb, aErrorCb) {
-    debug("getAllByManifestURL()");
-    if (!aManifestURL) {
-      if (typeof aErrorCb == "function") {
-        aErrorCb("PushDB.getAllByManifestURL: Got undefined aManifestURL");
-      }
-      return;
-    }
-
-    let self = this;
-    this.newTxn(
-      "readonly",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        let index = aStore.index("manifestURL");
-        let range = IDBKeyRange.only(aManifestURL);
-        aTxn.result = [];
-        index.openCursor(range).onsuccess = function(event) {
-          let cursor = event.target.result;
-          if (cursor) {
-            debug(cursor.value.manifestURL + " " + cursor.value.channelID);
-            aTxn.result.push(cursor.value);
-            cursor.continue();
-          }
-        }
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  getAllChannelIDs: function(aSuccessCb, aErrorCb) {
-    debug("getAllChannelIDs()");
-
-    this.newTxn(
-      "readonly",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        aStore.mozGetAll().onsuccess = function(event) {
-          aTxn.result = event.target.result;
-        }
-      },
-      aSuccessCb,
-      aErrorCb
-    );
-  },
-
-  drop: function(aSuccessCb, aErrorCb) {
-    debug("drop()");
-    this.newTxn(
-      "readwrite",
-      kPUSHDB_STORE_NAME,
-      function txnCb(aTxn, aStore) {
-        aStore.clear();
-      },
-      aSuccessCb(),
-      aErrorCb()
-    );
-  }
-};
-
-/**
- * A proxy between the PushService and the WebSocket. The listener is used so
- * that the PushService can silence messages from the WebSocket by setting
- * PushWebSocketListener._pushService to null. This is required because
- * a WebSocket can continue to send messages or errors after it has been
- * closed but the PushService may not be interested in these. It's easier to
- * stop listening than to have checks at specific points.
- */
-this.PushWebSocketListener = function(pushService) {
-  this._pushService = pushService;
-}
-
-this.PushWebSocketListener.prototype = {
-  onStart: function(context) {
-    if (!this._pushService)
-        return;
-    this._pushService._wsOnStart(context);
-  },
-
-  onStop: function(context, statusCode) {
-    if (!this._pushService)
-        return;
-    this._pushService._wsOnStop(context, statusCode);
-  },
-
-  onAcknowledge: function(context, size) {
-    // EMPTY
-  },
-
-  onBinaryMessageAvailable: function(context, message) {
-    // EMPTY
-  },
-
-  onMessageAvailable: function(context, message) {
-    if (!this._pushService)
-        return;
-    this._pushService._wsOnMessageAvailable(context, message);
-  },
-
-  onServerClose: function(context, aStatusCode, aReason) {
-    if (!this._pushService)
-        return;
-    this._pushService._wsOnServerClose(context, aStatusCode, aReason);
-  }
-}
-
-// websocket states
-// websocket is off
-const STATE_SHUT_DOWN = 0;
-// Websocket has been opened on client side, waiting for successful open.
-// (_wsOnStart)
-const STATE_WAITING_FOR_WS_START = 1;
-// Websocket opened, hello sent, waiting for server reply (_handleHelloReply).
-const STATE_WAITING_FOR_HELLO = 2;
-// Websocket operational, handshake completed, begin protocol messaging.
-const STATE_READY = 3;
-
-/**
- * The implementation of the SimplePush system. This runs in the B2G parent
- * process and is started on boot. It uses WebSockets to communicate with the
- * server and PushDB (IndexedDB) for persistence.
- */
-this.PushService = {
-  observe: function observe(aSubject, aTopic, aData) {
-    switch (aTopic) {
-      /*
-       * We need to call uninit() on shutdown to clean up things that modules aren't very good
-       * at automatically cleaning up, so we don't get shutdown leaks on browser shutdown.
-       */
-      case "xpcom-shutdown":
-        this.uninit();
-      case "network-active-changed":         /* On B2G. */
-      case "network:offline-status-changed": /* On desktop. */
-        // In case of network-active-changed, always disconnect existing
-        // connections. In case of offline-status changing from offline to
-        // online, it is likely that these statements will be no-ops.
-        if (this._udpServer) {
-          this._udpServer.close();
-          // Set to null since this is checked in _listenForUDPWakeup()
-          this._udpServer = null;
-        }
-
-        this._shutdownWS();
-
-        // Try to connect if network-active-changed or the offline-status
-        // changed to online.
-        if (aTopic === "network-active-changed" || aData === "online") {
-          this._startListeningIfChannelsPresent();
-        }
-        break;
-      case "nsPref:changed":
-        if (aData == "services.push.serverURL") {
-          debug("services.push.serverURL changed! websocket. new value " +
-                prefs.get("serverURL"));
-          this._shutdownWS();
-        } else if (aData == "services.push.connection.enabled") {
-          if (prefs.get("connection.enabled")) {
-            this._startListeningIfChannelsPresent();
-          } else {
-            this._shutdownWS();
-          }
-        } else if (aData == "services.push.debug") {
-          gDebuggingEnabled = prefs.get("debug");
-        }
-        break;
-      case "timer-callback":
-        if (aSubject == this._requestTimeoutTimer) {
-          if (Object.keys(this._pendingRequests).length == 0) {
-            this._requestTimeoutTimer.cancel();
-          }
-
-          // Set to true if at least one request timed out.
-          let requestTimedOut = false;
-          for (let channelID in this._pendingRequests) {
-            let duration = Date.now() - this._pendingRequests[channelID].ctime;
-
-            // If any of the registration requests time out, all the ones after it
-            // also made to fail, since we are going to be disconnecting the socket.
-            if (requestTimedOut || duration > this._requestTimeout) {
-              debug("Request timeout: Removing " + channelID);
-              requestTimedOut = true;
-              this._pendingRequests[channelID]
-                .deferred.reject({status: 0, error: "TimeoutError"});
-
-              delete this._pendingRequests[channelID];
-              for (let i = this._requestQueue.length - 1; i >= 0; --i)
-                if (this._requestQueue[i][1].channelID == channelID)
-                  this._requestQueue.splice(i, 1);
-            }
-          }
-
-          // The most likely reason for a registration request timing out is
-          // that the socket has disconnected. Best to reconnect.
-          if (requestTimedOut) {
-            this._shutdownWS();
-            this._reconnectAfterBackoff();
-          }
-        }
-        break;
-      case "webapps-clear-data":
-        debug("webapps-clear-data");
-
-        let data = aSubject.QueryInterface(Ci.mozIApplicationClearPrivateDataParams);
-        if (!data) {
-          debug("webapps-clear-data: Failed to get information about application");
-          return;
-        }
-
-        // Only remove push registrations for apps.
-        if (data.browserOnly) {
-          return;
-        }
-
-        let appsService = Cc["@mozilla.org/AppsService;1"]
-                            .getService(Ci.nsIAppsService);
-        let manifestURL = appsService.getManifestURLByLocalId(data.appId);
-        if (!manifestURL) {
-          debug("webapps-clear-data: No manifest URL found for " + data.appId);
-          return;
-        }
-
-        this._db.getAllByManifestURL(manifestURL, function(records) {
-          debug("Got " + records.length);
-          for (let i = 0; i < records.length; i++) {
-            this._db.delete(records[i].channelID, null, function() {
-              debug("webapps-clear-data: " + manifestURL +
-                    " Could not delete entry " + records[i].channelID);
-            });
-            // courtesy, but don't establish a connection
-            // just for it
-            if (this._ws) {
-              debug("Had a connection, so telling the server");
-              this._send("unregister", {channelID: records[i].channelID});
-            }
-          }
-        }.bind(this), function() {
-          debug("webapps-clear-data: Error in getAllByManifestURL(" + manifestURL + ")");
-        });
-
-        break;
-    }
-  },
-
-  get _UAID() {
-    return prefs.get("userAgentID");
-  },
-
-  set _UAID(newID) {
-    if (typeof(newID) !== "string") {
-      debug("Got invalid, non-string UAID " + newID +
-            ". Not updating userAgentID");
-      return;
-    }
-    debug("New _UAID: " + newID);
-    prefs.set("userAgentID", newID);
-  },
-
-  // keeps requests buffered if the websocket disconnects or is not connected
-  _requestQueue: [],
-  _ws: null,
-  _pendingRequests: {},
-  _currentState: STATE_SHUT_DOWN,
-  _requestTimeout: 0,
-  _requestTimeoutTimer: null,
-  _retryFailCount: 0,
-
-  /**
-   * According to the WS spec, servers should immediately close the underlying
-   * TCP connection after they close a WebSocket. This causes wsOnStop to be
-   * called with error NS_BASE_STREAM_CLOSED. Since the client has to keep the
-   * WebSocket up, it should try to reconnect. But if the server closes the
-   * WebSocket because it will wake up the client via UDP, then the client
-   * shouldn't re-establish the connection. If the server says that it will
-   * wake up the client over UDP, this is set to true in wsOnServerClose. It is
-   * checked in wsOnStop.
-   */
-  _willBeWokenUpByUDP: false,
-
-  /**
-   * Holds if the adaptive ping is enabled. This is read on init().
-   * If adaptive ping is enabled, a new ping is calculed each time we receive
-   * a pong message, trying to maximize network resources while minimizing
-   * cellular signalling storms.
-   */
-  _adaptiveEnabled: false,
-
-  /**
-   * This saves a flag about if we need to recalculate a new ping, based on:
-   *   1) the gap between the maximum working ping and the first ping that
-   *      gives an error (timeout) OR
-   *   2) we have reached the pref of the maximum value we allow for a ping
-   *      (services.push.adaptive.upperLimit)
-   */
-  _recalculatePing: true,
-
-  /**
-   * This map holds a (pingInterval, triedTimes) of each pingInterval tried.
-   * It is used to check if the pingInterval has been tested enough to know that
-   * is incorrect and is above the limit the network allow us to keep the
-   * connection open.
-   */
-  _pingIntervalRetryTimes: {},
-
-  /**
-   * Holds the lastGoodPingInterval for our current connection.
-   */
-  _lastGoodPingInterval: 0,
-
-  /**
-   * Maximum ping interval that we can reach.
-   */
-  _upperLimit: 0,
-
-  /**
-   * Sends a message to the Push Server through an open websocket.
-   * typeof(msg) shall be an object
-   */
-  _wsSendMessage: function(msg) {
-    if (!this._ws) {
-      debug("No WebSocket initialized. Cannot send a message.");
-      return;
-    }
-    msg = JSON.stringify(msg);
-    debug("Sending message: " + msg);
-    this._ws.sendMsg(msg);
-  },
-
-  init: function() {
-    debug("init()");
-    if (!prefs.get("enabled"))
-        return null;
-
-    this._db = new PushDB();
-
-    let ppmm = Cc["@mozilla.org/parentprocessmessagemanager;1"]
-                 .getService(Ci.nsIMessageBroadcaster);
-
-    kCHILD_PROCESS_MESSAGES.forEach(function addMessage(msgName) {
-        ppmm.addMessageListener(msgName, this);
-    }.bind(this));
-
-    this._alarmID = null;
-
-    this._requestTimeout = prefs.get("requestTimeout");
-    this._adaptiveEnabled = prefs.get('adaptive.enabled');
-    this._upperLimit = prefs.get('adaptive.upperLimit');
-
-    this._startListeningIfChannelsPresent();
-
-    Services.obs.addObserver(this, "xpcom-shutdown", false);
-    Services.obs.addObserver(this, "webapps-clear-data", false);
-
-    // On B2G the NetworkManager interface fires a network-active-changed
-    // event.
-    //
-    // The "active network" is based on priority - i.e. Wi-Fi has higher
-    // priority than data. The PushService should just use the preferred
-    // network, and not care about all interface changes.
-    // network-active-changed is not fired when the network goes offline, but
-    // socket connections time out. The check for Services.io.offline in
-    // _beginWSSetup() prevents unnecessary retries.  When the network comes
-    // back online, network-active-changed is fired.
-    //
-    // On non-B2G platforms, the offline-status-changed event is used to know
-    // when to (dis)connect. It may not fire if the underlying OS changes
-    // networks; in such a case we rely on timeout.
-    //
-    // On B2G both events fire, one after the other, when the network goes
-    // online, so we explicitly check for the presence of NetworkManager and
-    // don't add an observer for offline-status-changed on B2G.
-    Services.obs.addObserver(this, this._getNetworkStateChangeEventName(), false);
-
-    // This is only used for testing. Different tests require connecting to
-    // slightly different URLs.
-    prefs.observe("serverURL", this);
-    // Used to monitor if the user wishes to disable Push.
-    prefs.observe("connection.enabled", this);
-    // Debugging
-    prefs.observe("debug", this);
-
-    this._started = true;
-  },
-
-  _shutdownWS: function() {
-    debug("shutdownWS()");
-    this._currentState = STATE_SHUT_DOWN;
-    this._willBeWokenUpByUDP = false;
-
-    if (this._wsListener)
-      this._wsListener._pushService = null;
-    try {
-        this._ws.close(0, null);
-    } catch (e) {}
-    this._ws = null;
-
-    this._waitingForPong = false;
-    this._stopAlarm();
-  },
-
-  uninit: function() {
-    if (!this._started)
-      return;
-
-    debug("uninit()");
-
-    prefs.ignore("debug", this);
-    prefs.ignore("connection.enabled", this);
-    prefs.ignore("serverURL", this);
-    Services.obs.removeObserver(this, this._getNetworkStateChangeEventName());
-    Services.obs.removeObserver(this, "webapps-clear-data", false);
-    Services.obs.removeObserver(this, "xpcom-shutdown", false);
-
-    if (this._db) {
-      this._db.close();
-      this._db = null;
-    }
-
-    if (this._udpServer) {
-      this._udpServer.close();
-      this._udpServer = null;
-    }
-
-    // All pending requests (ideally none) are dropped at this point. We
-    // shouldn't have any applications performing registration/unregistration
-    // or receiving notifications.
-    this._shutdownWS();
-
-    // At this point, profile-change-net-teardown has already fired, so the
-    // WebSocket has been closed with NS_ERROR_ABORT (if it was up) and will
-    // try to reconnect. Stop the timer.
-    this._stopAlarm();
-
-    if (this._requestTimeoutTimer) {
-      this._requestTimeoutTimer.cancel();
-    }
-
-    debug("shutdown complete!");
-  },
-
-  /**
-   * How retries work:  The goal is to ensure websocket is always up on
-   * networks not supporting UDP. So the websocket should only be shutdown if
-   * onServerClose indicates UDP wakeup.  If WS is closed due to socket error,
-   * _reconnectAfterBackoff() is called.  The retry alarm is started and when
-   * it times out, beginWSSetup() is called again.
-   *
-   * On a successful connection, the alarm is cancelled in
-   * wsOnMessageAvailable() when the ping alarm is started.
-   *
-   * If we are in the middle of a timeout (i.e. waiting), but
-   * a register/unregister is called, we don't want to wait around anymore.
-   * _sendRequest will automatically call beginWSSetup(), which will cancel the
-   * timer. In addition since the state will have changed, even if a pending
-   * timer event comes in (because the timer fired the event before it was
-   * cancelled), so the connection won't be reset.
-   */
-  _reconnectAfterBackoff: function() {
-    debug("reconnectAfterBackoff()");
-    //Calculate new ping interval
-    this._calculateAdaptivePing(true /* wsWentDown */);
-
-    // Calculate new timeout, but cap it to pingInterval.
-    let retryTimeout = prefs.get("retryBaseInterval") *
-                       Math.pow(2, this._retryFailCount);
-    retryTimeout = Math.min(retryTimeout, prefs.get("pingInterval"));
-
-    this._retryFailCount++;
-
-    debug("Retry in " + retryTimeout + " Try number " + this._retryFailCount);
-    this._setAlarm(retryTimeout);
-  },
-
-  /**
-   * We need to calculate a new ping based on:
-   *  1) Latest good ping
-   *  2) A safe gap between 1) and the calculated new ping (which is
-   *  by default, 1 minute)
-   *
-   * This is for 3G networks, whose connections keepalives differ broadly,
-   * for example:
-   *  1) Movistar Spain: 29 minutes
-   *  2) VIVO Brazil: 5 minutes
-   *  3) Movistar Colombia: XXX minutes
-   *
-   * So a fixed ping is not good for us for two reasons:
-   *  1) We might lose the connection, so we need to reconnect again (wasting
-   *  resources)
-   *  2) We use a lot of network signaling just for pinging.
-   *
-   * This algorithm tries to search the best value between a disconnection and a
-   * valid ping, to ensure better battery life and network resources usage.
-   *
-   * The value is saved in services.push.pingInterval
-   * @param wsWentDown [Boolean] if the WebSocket was closed or it is still alive
-   *
-   */
-  _calculateAdaptivePing: function(wsWentDown) {
-    debug('_calculateAdaptivePing()');
-    if (!this._adaptiveEnabled) {
-      debug('Adaptive ping is disabled');
-      return;
-    }
-
-    if (this._retryFailCount > 0) {
-      debug('Push has failed to connect to the Push Server ' +
-        this._retryFailCount + ' times. ' +
-        'Do not calculate a new pingInterval now');
-      return;
-    }
-
-    if (!this._recalculatePing && !wsWentDown) {
-      debug('We do not need to recalculate the ping now, based on previous data');
-      return;
-    }
-
-    // Save actual state of the network
-    let ns = this._getNetworkInformation();
-
-    if (ns.ip) {
-      // mobile
-      debug('mobile');
-      let oldNetwork = prefs.get('adaptive.mobile');
-      let newNetwork = 'mobile-' + ns.mcc + '-' + ns.mnc;
-
-      // Mobile networks differ, reset all intervals and pings
-      if (oldNetwork !== newNetwork) {
-        // Network differ, reset all values
-        debug('Mobile networks differ. Old network is ' + oldNetwork +
-              ' and new is ' + newNetwork);
-        prefs.set('adaptive.mobile', newNetwork);
-        //We reset the upper bound member
-        this._recalculatePing = true;
-        this._pingIntervalRetryTimes = {};
-
-        // Put default values
-        let defaultPing = prefs.get('pingInterval.default');
-        prefs.set('pingInterval', defaultPing);
-        this._lastGoodPingInterval = defaultPing;
-
-      } else {
-        // Mobile network is the same, let's just update things
-        prefs.set('pingInterval', prefs.get('pingInterval.mobile'));
-        this._lastGoodPingInterval = prefs.get('adaptive.lastGoodPingInterval.mobile');
-      }
-
-    } else {
-      // wifi
-      debug('wifi');
-      prefs.set('pingInterval', prefs.get('pingInterval.wifi'));
-      this._lastGoodPingInterval = prefs.get('adaptive.lastGoodPingInterval.wifi');
-    }
-
-    let nextPingInterval;
-    let lastTriedPingInterval = prefs.get('pingInterval');
-
-    if (wsWentDown) {
-      debug('The WebSocket was disconnected, calculating next ping');
-
-      // If we have not tried this pingInterval yet, initialize
-      this._pingIntervalRetryTimes[lastTriedPingInterval] =
-           (this._pingIntervalRetryTimes[lastTriedPingInterval] || 0) + 1;
-
-       // Try the pingInterval at least 3 times, just to be sure that the
-       // calculated interval is not valid.
-       if (this._pingIntervalRetryTimes[lastTriedPingInterval] < 2) {
-         debug('pingInterval= ' + lastTriedPingInterval + ' tried only ' +
-           this._pingIntervalRetryTimes[lastTriedPingInterval] + ' times');
-         return;
-       }
-
-       // Latest ping was invalid, we need to lower the limit to limit / 2
-       nextPingInterval = Math.floor(lastTriedPingInterval / 2);
-
-      // If the new ping interval is close to the last good one, we are near
-      // optimum, so stop calculating.
-      if (nextPingInterval - this._lastGoodPingInterval < prefs.get('adaptive.gap')) {
-        debug('We have reached the gap, we have finished the calculation');
-        debug('nextPingInterval=' + nextPingInterval);
-        debug('lastGoodPing=' + this._lastGoodPingInterval);
-        nextPingInterval = this._lastGoodPingInterval;
-        this._recalculatePing = false;
-      } else {
-        debug('We need to calculate next time');
-        this._recalculatePing = true;
-      }
-
-    } else {
-      debug('The WebSocket is still up');
-      this._lastGoodPingInterval = lastTriedPingInterval;
-      nextPingInterval = Math.floor(lastTriedPingInterval * 1.5);
-    }
-
-    // Check if we have reached the upper limit
-    if (this._upperLimit < nextPingInterval) {
-      debug('Next ping will be bigger than the configured upper limit, capping interval');
-      this._recalculatePing = false;
-      this._lastGoodPingInterval = lastTriedPingInterval;
-      nextPingInterval = lastTriedPingInterval;
-    }
-
-    debug('Setting the pingInterval to ' + nextPingInterval);
-    prefs.set('pingInterval', nextPingInterval);
-
-    //Save values for our current network
-    if (ns.ip) {
-      prefs.set('pingInterval.mobile', nextPingInterval);
-      prefs.set('adaptive.lastGoodPingInterval.mobile', this._lastGoodPingInterval);
-    } else {
-      prefs.set('pingInterval.wifi', nextPingInterval);
-      prefs.set('adaptive.lastGoodPingInterval.wifi', this._lastGoodPingInterval);
-    }
-  },
-
-  _beginWSSetup: function() {
-    debug("beginWSSetup()");
-    if (this._currentState != STATE_SHUT_DOWN) {
-      debug("_beginWSSetup: Not in shutdown state! Current state " +
-            this._currentState);
-      return;
-    }
-
-    if (!prefs.get("connection.enabled")) {
-      debug("_beginWSSetup: connection.enabled is not set to true. Aborting.");
-      return;
-    }
-
-    // Stop any pending reconnects scheduled for the near future.
-    this._stopAlarm();
-
-    if (Services.io.offline) {
-      debug("Network is offline.");
-      return;
-    }
-
-    let serverURL = prefs.get("serverURL");
-    if (!serverURL) {
-      debug("No services.push.serverURL found!");
-      return;
-    }
-
-    let uri;
-    try {
-      uri = Services.io.newURI(serverURL, null, null);
-    } catch(e) {
-      debug("Error creating valid URI from services.push.serverURL (" +
-            serverURL + ")");
-      return;
-    }
-
-    if (uri.scheme === "wss") {
-      this._ws = Cc["@mozilla.org/network/protocol;1?name=wss"]
-                   .createInstance(Ci.nsIWebSocketChannel);
-
-      this._ws.initLoadInfo(null, // aLoadingNode
-                            Services.scriptSecurityManager.getSystemPrincipal(),
-                            null, // aTriggeringPrincipal
-                            Ci.nsILoadInfo.SEC_ALLOW_CROSS_ORIGIN_DATA_IS_NULL,
-                            Ci.nsIContentPolicy.TYPE_WEBSOCKET);
-    }
-    else if (uri.scheme === "ws") {
-      debug("Push over an insecure connection (ws://) is not allowed!");
-      return;
-    }
-    else {
-      debug("Unsupported websocket scheme " + uri.scheme);
-      return;
-    }
-
-    debug("serverURL: " + uri.spec);
-    this._wsListener = new PushWebSocketListener(this);
-    this._ws.protocol = "push-notification";
-
-    try {
-      // Grab a wakelock before we open the socket to ensure we don't go to sleep
-      // before connection the is opened.
-      this._ws.asyncOpen(uri, serverURL, 0, this._wsListener, null);
-      this._acquireWakeLock();
-      this._currentState = STATE_WAITING_FOR_WS_START;
-    } catch(e) {
-      debug("Error opening websocket. asyncOpen failed!");
-      this._shutdownWS();
-      this._reconnectAfterBackoff();
-    }
-  },
-
-  _startListeningIfChannelsPresent: function() {
-    // Check to see if we need to do anything.
-    this._db.getAllChannelIDs(function(channelIDs) {
-      if (channelIDs.length > 0) {
-        this._beginWSSetup();
-      }
-    }.bind(this));
-  },
-
-  /** |delay| should be in milliseconds. */
-  _setAlarm: function(delay) {
-    // Bug 909270: Since calls to AlarmService.add() are async, calls must be
-    // 'queued' to ensure only one alarm is ever active.
-    if (this._settingAlarm) {
-        // onSuccess will handle the set. Overwriting the variable enforces the
-        // last-writer-wins semantics.
-        this._queuedAlarmDelay = delay;
-        this._waitingForAlarmSet = true;
-        return;
-    }
-
-    // Stop any existing alarm.
-    this._stopAlarm();
-
-    this._settingAlarm = true;
-    AlarmService.add(
-      {
-        date: new Date(Date.now() + delay),
-        ignoreTimezone: true
-      },
-      this._onAlarmFired.bind(this),
-      function onSuccess(alarmID) {
-        this._alarmID = alarmID;
-        debug("Set alarm " + delay + " in the future " + this._alarmID);
-        this._settingAlarm = false;
-
-        if (this._waitingForAlarmSet) {
-          this._waitingForAlarmSet = false;
-          this._setAlarm(this._queuedAlarmDelay);
-        }
-      }.bind(this)
-    )
-  },
-
-  _stopAlarm: function() {
-    if (this._alarmID !== null) {
-      debug("Stopped existing alarm " + this._alarmID);
-      AlarmService.remove(this._alarmID);
-      this._alarmID = null;
-    }
-  },
-
-  /**
-   * There is only one alarm active at any time. This alarm has 3 intervals
-   * corresponding to 3 tasks.
-   *
-   * 1) Reconnect on ping timeout.
-   *    If we haven't received any messages from the server by the time this
-   *    alarm fires, the connection is closed and PushService tries to
-   *    reconnect, repurposing the alarm for (3).
-   *
-   * 2) Send a ping.
-   *    The protocol sends a ping ({}) on the wire every pingInterval ms. Once
-   *    it sends the ping, the alarm goes to task (1) which is waiting for
-   *    a pong. If data is received after the ping is sent,
-   *    _wsOnMessageAvailable() will reset the ping alarm (which cancels
-   *    waiting for the pong). So as long as the connection is fine, pong alarm
-   *    never fires.
-   *
-   * 3) Reconnect after backoff.
-   *    The alarm is set by _reconnectAfterBackoff() and increases in duration
-   *    every time we try and fail to connect.  When it triggers, websocket
-   *    setup begins again. On successful socket setup, the socket starts
-   *    receiving messages. The alarm now goes to (2) where it monitors the
-   *    WebSocket by sending a ping.  Since incoming data is a sign of the
-   *    connection being up, the ping alarm is reset every time data is
-   *    received.
-   */
-  _onAlarmFired: function() {
-    // Conditions are arranged in decreasing specificity.
-    // i.e. when _waitingForPong is true, other conditions are also true.
-    if (this._waitingForPong) {
-      debug("Did not receive pong in time. Reconnecting WebSocket.");
-      this._shutdownWS();
-      this._reconnectAfterBackoff();
-    }
-    else if (this._currentState == STATE_READY) {
-      // Send a ping.
-      // Bypass the queue; we don't want this to be kept pending.
-      // Watch out for exception in case the socket has disconnected.
-      // When this happens, we pretend the ping was sent and don't specially
-      // handle the exception, as the lack of a pong will lead to the socket
-      // being reset.
-      try {
-        this._wsSendMessage({});
-      } catch (e) {
-      }
-
-      this._waitingForPong = true;
-      this._setAlarm(prefs.get("requestTimeout"));
-    }
-    else if (this._alarmID !== null) {
-      debug("reconnect alarm fired.");
-      // Reconnect after back-off.
-      // The check for a non-null _alarmID prevents a situation where the alarm
-      // fires, but _shutdownWS() is called from another code-path (e.g.
-      // network state change) and we don't want to reconnect.
-      //
-      // It also handles the case where _beginWSSetup() is called from another
-      // code-path.
-      //
-      // alarmID will be non-null only when no shutdown/connect is
-      // called between _reconnectAfterBackoff() setting the alarm and the
-      // alarm firing.
-
-      // Websocket is shut down. Backoff interval expired, try to connect.
-      this._beginWSSetup();
-    }
-  },
-
-  _acquireWakeLock: function() {
-    if (!this._socketWakeLock) {
-      debug("Acquiring Socket Wakelock");
-      this._socketWakeLock = gPowerManagerService.newWakeLock("cpu");
-    }
-    if (!this._socketWakeLockTimer) {
-      debug("Creating Socket WakeLock Timer");
-      this._socketWakeLockTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
-    }
-
-    debug("Setting Socket WakeLock Timer");
-    this._socketWakeLockTimer
-      .initWithCallback(this._releaseWakeLock.bind(this),
-                        // Allow the same time for socket setup as we do for
-                        // requests after the setup. Fudge it a bit since
-                        // timers can be a little off and we don't want to go
-                        // to sleep just as the socket connected.
-                        this._requestTimeout + 1000,
-                        Ci.nsITimer.ONE_SHOT);
-  },
-
-  _releaseWakeLock: function() {
-    debug("Releasing Socket WakeLock");
-    if (this._socketWakeLockTimer) {
-      this._socketWakeLockTimer.cancel();
-    }
-    if (this._socketWakeLock) {
-      this._socketWakeLock.unlock();
-      this._socketWakeLock = null;
-    }
-  },
-
-  /**
-   * Protocol handler invoked by server message.
-   */
-  _handleHelloReply: function(reply) {
-    debug("handleHelloReply()");
-    if (this._currentState != STATE_WAITING_FOR_HELLO) {
-      debug("Unexpected state " + this._currentState +
-            "(expected STATE_WAITING_FOR_HELLO)");
-      this._shutdownWS();
-      return;
-    }
-
-    if (typeof reply.uaid !== "string") {
-      debug("No UAID received or non string UAID received");
-      this._shutdownWS();
-      return;
-    }
-
-    if (reply.uaid === "") {
-      debug("Empty UAID received!");
-      this._shutdownWS();
-      return;
-    }
-
-    // To avoid sticking extra large values sent by an evil server into prefs.
-    if (reply.uaid.length > 128) {
-      debug("UAID received from server was too long: " +
-            reply.uaid);
-      this._shutdownWS();
-      return;
-    }
-
-    function finishHandshake() {
-      this._UAID = reply.uaid;
-      this._currentState = STATE_READY;
-      this._processNextRequestInQueue();
-    }
-
-    // By this point we've got a UAID from the server that we are ready to
-    // accept.
-    //
-    // If we already had a valid UAID before, we have to ask apps to
-    // re-register.
-    if (this._UAID && this._UAID != reply.uaid) {
-      debug("got new UAID: all re-register");
-
-      this._notifyAllAppsRegister()
-          .then(this._dropRegistrations.bind(this))
-          .then(finishHandshake.bind(this));
-
-      return;
-    }
-
-    // otherwise we are good to go
-    finishHandshake.bind(this)();
-  },
-
-  /**
-   * Protocol handler invoked by server message.
-   */
-  _handleRegisterReply: function(reply) {
-    debug("handleRegisterReply()");
-    if (typeof reply.channelID !== "string" ||
-        typeof this._pendingRequests[reply.channelID] !== "object")
-      return;
-
-    let tmp = this._pendingRequests[reply.channelID];
-    delete this._pendingRequests[reply.channelID];
-    if (Object.keys(this._pendingRequests).length == 0 &&
-        this._requestTimeoutTimer)
-      this._requestTimeoutTimer.cancel();
-
-    if (reply.status == 200) {
-      tmp.deferred.resolve(reply);
-    } else {
-      tmp.deferred.reject(reply);
-    }
-  },
-
-  /**
-   * Protocol handler invoked by server message.
-   */
-  _handleNotificationReply: function(reply) {
-    debug("handleNotificationReply()");
-    if (typeof reply.updates !== 'object') {
-      debug("No 'updates' field in response. Type = " + typeof reply.updates);
-      return;
-    }
-
-    debug("Reply updates: " + reply.updates.length);
-    for (let i = 0; i < reply.updates.length; i++) {
-      let update = reply.updates[i];
-      debug("Update: " + update.channelID + ": " + update.version);
-      if (typeof update.channelID !== "string") {
-        debug("Invalid update literal at index " + i);
-        continue;
-      }
-
-      if (update.version === undefined) {
-        debug("update.version does not exist");
-        continue;
-      }
-
-      let version = update.version;
-
-      if (typeof version === "string") {
-        version = parseInt(version, 10);
-      }
-
-      if (typeof version === "number" && version >= 0) {
-        // FIXME(nsm): this relies on app update notification being infallible!
-        // eventually fix this
-        this._receivedUpdate(update.channelID, version);
-        this._sendAck(update.channelID, version);
-      }
-    }
-  },
-
-  // FIXME(nsm): batch acks for efficiency reasons.
-  _sendAck: function(channelID, version) {
-    debug("sendAck()");
-    this._send('ack', {
-      updates: [{channelID: channelID, version: version}]
-    });
-  },
-
-  /*
-   * Must be used only by request/response style calls over the websocket.
-   */
-  _sendRequest: function(action, data) {
-    debug("sendRequest() " + action);
-    if (typeof data.channelID !== "string") {
-      debug("Received non-string channelID");
-      return Promise.reject("Received non-string channelID");
-    }
-
-    let deferred = Promise.defer();
-
-    if (Object.keys(this._pendingRequests).length == 0) {
-      // start the timer since we now have at least one request
-      if (!this._requestTimeoutTimer)
-        this._requestTimeoutTimer = Cc["@mozilla.org/timer;1"]
-                                      .createInstance(Ci.nsITimer);
-      this._requestTimeoutTimer.init(this,
-                                     this._requestTimeout,
-                                     Ci.nsITimer.TYPE_REPEATING_SLACK);
-    }
-
-    this._pendingRequests[data.channelID] = { deferred: deferred,
-                                              ctime: Date.now() };
-
-    this._send(action, data);
-    return deferred.promise;
-  },
-
-  _send: function(action, data) {
-    debug("send()");
-    this._requestQueue.push([action, data]);
-    debug("Queued " + action);
-    this._processNextRequestInQueue();
-  },
-
-  _processNextRequestInQueue: function() {
-    debug("_processNextRequestInQueue()");
-
-    if (this._requestQueue.length == 0) {
-      debug("Request queue empty");
-      return;
-    }
-
-    if (this._currentState != STATE_READY) {
-      if (!this._ws) {
-        // This will end up calling processNextRequestInQueue().
-        this._beginWSSetup();
-      }
-      else {
-        // We have a socket open so we are just waiting for hello to finish.
-        // That will call processNextRequestInQueue().
-      }
-      return;
-    }
-
-    let [action, data] = this._requestQueue.shift();
-    data.messageType = action;
-    if (!this._ws) {
-      // If our websocket is not ready and our state is STATE_READY we may as
-      // well give up all assumptions about the world and start from scratch
-      // again.  Discard the message itself, let the timeout notify error to
-      // the app.
-      debug("This should never happen!");
-      this._shutdownWS();
-    }
-
-    this._wsSendMessage(data);
-    // Process the next one as soon as possible.
-    setTimeout(this._processNextRequestInQueue.bind(this), 0);
-  },
-
-  _receivedUpdate: function(aChannelID, aLatestVersion) {
-    debug("Updating: " + aChannelID + " -> " + aLatestVersion);
-
-    let compareRecordVersionAndNotify = function(aPushRecord) {
-      debug("compareRecordVersionAndNotify()");
-      if (!aPushRecord) {
-        debug("No record for channel ID " + aChannelID);
-        return;
-      }
-
-      if (aPushRecord.version == null ||
-          aPushRecord.version < aLatestVersion) {
-        debug("Version changed, notifying app and updating DB");
-        aPushRecord.version = aLatestVersion;
-        this._notifyApp(aPushRecord);
-        this._updatePushRecord(aPushRecord)
-          .then(
-            null,
-            function(e) {
-              debug("Error updating push record");
-            }
-          );
-      }
-      else {
-        debug("No significant version change: " + aLatestVersion);
-      }
-    }
-
-    let recoverNoSuchChannelID = function(aChannelIDFromServer) {
-      debug("Could not get channelID " + aChannelIDFromServer + " from DB");
-    }
-
-    this._db.getByChannelID(aChannelID,
-                            compareRecordVersionAndNotify.bind(this),
-                            recoverNoSuchChannelID.bind(this));
-  },
-
-  // Fires a push-register system message to all applications that have
-  // registrations.
-  _notifyAllAppsRegister: function() {
-    debug("notifyAllAppsRegister()");
-    let deferred = Promise.defer();
-
-    // records are objects describing the registrations as stored in IndexedDB.
-    function wakeupRegisteredApps(records) {
-      // Pages to be notified.
-      // wakeupTable[manifestURL] -> [ pageURL ]
-      let wakeupTable = {};
-      for (let i = 0; i < records.length; i++) {
-        let record = records[i];
-        if (!(record.manifestURL in wakeupTable))
-          wakeupTable[record.manifestURL] = [];
-
-        wakeupTable[record.manifestURL].push(record.pageURL);
-      }
-
-      let messenger = Cc["@mozilla.org/system-message-internal;1"]
-                        .getService(Ci.nsISystemMessagesInternal);
-
-      for (let manifestURL in wakeupTable) {
-        wakeupTable[manifestURL].forEach(function(pageURL) {
-          messenger.sendMessage('push-register', {},
-                                Services.io.newURI(pageURL, null, null),
-                                Services.io.newURI(manifestURL, null, null));
-        });
-      }
-
-      deferred.resolve();
-    }
-
-    this._db.getAllChannelIDs(wakeupRegisteredApps, deferred.reject);
-
-    return deferred.promise;
-  },
-
-  _notifyApp: function(aPushRecord) {
-    if (!aPushRecord || !aPushRecord.pageURL || !aPushRecord.manifestURL) {
-      debug("notifyApp() something is undefined.  Dropping notification");
-      return;
-    }
-
-    debug("notifyApp() " + aPushRecord.pageURL +
-          "  " + aPushRecord.manifestURL);
-    let pageURI = Services.io.newURI(aPushRecord.pageURL, null, null);
-    let manifestURI = Services.io.newURI(aPushRecord.manifestURL, null, null);
-    let message = {
-      pushEndpoint: aPushRecord.pushEndpoint,
-      version: aPushRecord.version
-    };
-    let messenger = Cc["@mozilla.org/system-message-internal;1"]
-                      .getService(Ci.nsISystemMessagesInternal);
-    messenger.sendMessage('push', message, pageURI, manifestURI);
-  },
-
-  _updatePushRecord: function(aPushRecord) {
-    debug("updatePushRecord()");
-    let deferred = Promise.defer();
-    this._db.put(aPushRecord, deferred.resolve, deferred.reject);
-    return deferred.promise;
-  },
-
-  _dropRegistrations: function() {
-    let deferred = Promise.defer();
-    this._db.drop(deferred.resolve, deferred.reject);
-    return deferred.promise;
-  },
-
-  receiveMessage: function(aMessage) {
-    debug("receiveMessage(): " + aMessage.name);
-
-    if (kCHILD_PROCESS_MESSAGES.indexOf(aMessage.name) == -1) {
-      debug("Invalid message from child " + aMessage.name);
-      return;
-    }
-
-    let mm = aMessage.target.QueryInterface(Ci.nsIMessageSender);
-    let json = aMessage.data;
-    this[aMessage.name.slice("Push:".length).toLowerCase()](json, mm);
-  },
-
-  /**
-   * Called on message from the child process. aPageRecord is an object sent by
-   * navigator.push, identifying the sending page and other fields.
-   */
-  register: function(aPageRecord, aMessageManager) {
-    debug("register()");
-
-    let uuidGenerator = Cc["@mozilla.org/uuid-generator;1"]
-                          .getService(Ci.nsIUUIDGenerator);
-    // generateUUID() gives a UUID surrounded by {...}, slice them off.
-    let channelID = uuidGenerator.generateUUID().toString().slice(1, -1);
-
-    this._sendRequest("register", {channelID: channelID})
-      .then(
-        this._onRegisterSuccess.bind(this, aPageRecord, channelID),
-        this._onRegisterError.bind(this, aPageRecord, aMessageManager)
-      )
-      .then(
-        function(message) {
-          aMessageManager.sendAsyncMessage("PushService:Register:OK", message);
-        },
-        function(message) {
-          aMessageManager.sendAsyncMessage("PushService:Register:KO", message);
-      });
-  },
-
-  /**
-   * Exceptions thrown in _onRegisterSuccess are caught by the promise obtained
-   * from _sendRequest, causing the promise to be rejected instead.
-   */
-  _onRegisterSuccess: function(aPageRecord, generatedChannelID, data) {
-    debug("_onRegisterSuccess()");
-    let deferred = Promise.defer();
-    let message = { requestID: aPageRecord.requestID };
-
-    if (typeof data.channelID !== "string") {
-      debug("Invalid channelID " + message);
-      message["error"] = "Invalid channelID received";
-      throw message;
-    }
-    else if (data.channelID != generatedChannelID) {
-      debug("Server replied with different channelID " + data.channelID +
-            " than what UA generated " + generatedChannelID);
-      message["error"] = "Server sent 200 status code but different channelID";
-      throw message;
-    }
-
-    try {
-      Services.io.newURI(data.pushEndpoint, null, null);
-    }
-    catch (e) {
-      debug("Invalid pushEndpoint " + data.pushEndpoint);
-      message["error"] = "Invalid pushEndpoint " + data.pushEndpoint;
-      throw message;
-    }
-
-    let record = {
-      channelID: data.channelID,
-      pushEndpoint: data.pushEndpoint,
-      pageURL: aPageRecord.pageURL,
-      manifestURL: aPageRecord.manifestURL,
-      version: null
-    };
-
-    this._updatePushRecord(record)
-      .then(
-        function() {
-          message["pushEndpoint"] = data.pushEndpoint;
-          deferred.resolve(message);
-        },
-        function(error) {
-          // Unable to save.
-          this._send("unregister", {channelID: record.channelID});
-          message["error"] = error;
-          deferred.reject(message);
-        }
-      );
-
-    return deferred.promise;
-  },
-
-  /**
-   * Exceptions thrown in _onRegisterError are caught by the promise obtained
-   * from _sendRequest, causing the promise to be rejected instead.
-   */
-  _onRegisterError: function(aPageRecord, aMessageManager, reply) {
-    debug("_onRegisterError()");
-    if (!reply.error) {
-      debug("Called without valid error message!");
-    }
-    throw { requestID: aPageRecord.requestID, error: reply.error };
-  },
-
-  /**
-   * Called on message from the child process.
-   *
-   * Why is the record being deleted from the local database before the server
-   * is told?
-   *
-   * Unregistration is for the benefit of the app and the AppServer
-   * so that the AppServer does not keep pinging a channel the UserAgent isn't
-   * watching The important part of the transaction in this case is left to the
-   * app, to tell its server of the unregistration.  Even if the request to the
-   * PushServer were to fail, it would not affect correctness of the protocol,
-   * and the server GC would just clean up the channelID eventually.  Since the
-   * appserver doesn't ping it, no data is lost.
-   *
-   * If rather we were to unregister at the server and update the database only
-   * on success: If the server receives the unregister, and deletes the
-   * channelID, but the response is lost because of network failure, the
-   * application is never informed. In addition the application may retry the
-   * unregister when it fails due to timeout at which point the server will say
-   * it does not know of this unregistration.  We'll have to make the
-   * registration/unregistration phases have retries and attempts to resend
-   * messages from the server, and have the client acknowledge. On a server,
-   * data is cheap, reliable notification is not.
-   */
-  unregister: function(aPageRecord, aMessageManager) {
-    debug("unregister()");
-
-    let fail = function(error) {
-      debug("unregister() fail() error " + error);
-      let message = {requestID: aPageRecord.requestID, error: error};
-      aMessageManager.sendAsyncMessage("PushService:Unregister:KO", message);
-    }
-
-    this._db.getByPushEndpoint(aPageRecord.pushEndpoint, function(record) {
-      // If the endpoint didn't exist, let's just fail.
-      if (record === undefined) {
-        fail("NotFoundError");
-        return;
-      }
-
-      // Non-owner tried to unregister, say success, but don't do anything.
-      if (record.manifestURL !== aPageRecord.manifestURL) {
-        aMessageManager.sendAsyncMessage("PushService:Unregister:OK", {
-          requestID: aPageRecord.requestID,
-          pushEndpoint: aPageRecord.pushEndpoint
-        });
-        return;
-      }
-
-      this._db.delete(record.channelID, function() {
-        // Let's be nice to the server and try to inform it, but we don't care
-        // about the reply.
-        this._send("unregister", {channelID: record.channelID});
-        aMessageManager.sendAsyncMessage("PushService:Unregister:OK", {
-          requestID: aPageRecord.requestID,
-          pushEndpoint: aPageRecord.pushEndpoint
-        });
-      }.bind(this), fail);
-    }.bind(this), fail);
-  },
-
-  /**
-   * Called on message from the child process
-   */
-  registrations: function(aPageRecord, aMessageManager) {
-    debug("registrations()");
-
-    if (aPageRecord.manifestURL) {
-      this._db.getAllByManifestURL(aPageRecord.manifestURL,
-        this._onRegistrationsSuccess.bind(this, aPageRecord, aMessageManager),
-        this._onRegistrationsError.bind(this, aPageRecord, aMessageManager));
-    }
-    else {
-      this._onRegistrationsError(aPageRecord, aMessageManager);
-    }
-  },
-
-  _onRegistrationsSuccess: function(aPageRecord,
-                                    aMessageManager,
-                                    pushRecords) {
-    let registrations = [];
-    pushRecords.forEach(function(pushRecord) {
-      registrations.push({
-          __exposedProps__: { pushEndpoint: 'r', version: 'r' },
-          pushEndpoint: pushRecord.pushEndpoint,
-          version: pushRecord.version
-      });
-    });
-    aMessageManager.sendAsyncMessage("PushService:Registrations:OK", {
-      requestID: aPageRecord.requestID,
-      registrations: registrations
-    });
-  },
-
-  _onRegistrationsError: function(aPageRecord, aMessageManager) {
-    aMessageManager.sendAsyncMessage("PushService:Registrations:KO", {
-      requestID: aPageRecord.requestID,
-      error: "Database error"
-    });
-  },
-
-  // begin Push protocol handshake
-  _wsOnStart: function(context) {
-    debug("wsOnStart()");
-    this._releaseWakeLock();
-
-    if (this._currentState != STATE_WAITING_FOR_WS_START) {
-      debug("NOT in STATE_WAITING_FOR_WS_START. Current state " +
-            this._currentState + ". Skipping");
-      return;
-    }
-
-    // Since we've had a successful connection reset the retry fail count.
-    this._retryFailCount = 0;
-
-    let data = {
-      messageType: "hello",
-    }
-
-    if (this._UAID)
-      data["uaid"] = this._UAID;
-
-    this._getNetworkState((networkState) => {
-      if (networkState.ip) {
-        // Opening an available UDP port.
-        this._listenForUDPWakeup();
-
-        // Host-port is apparently a thing.
-        data["wakeup_hostport"] = {
-          ip: networkState.ip,
-          port: this._udpServer && this._udpServer.port
-        };
-
-        data["mobilenetwork"] = {
-          mcc: networkState.mcc,
-          mnc: networkState.mnc,
-          netid: networkState.netid
-        };
-      }
-
-      this._wsSendMessage(data);
-      this._currentState = STATE_WAITING_FOR_HELLO;
-    });
-  },
-
-  /**
-   * This statusCode is not the websocket protocol status code, but the TCP
-   * connection close status code.
-   *
-   * If we do not explicitly call ws.close() then statusCode is always
-   * NS_BASE_STREAM_CLOSED, even on a successful close.
-   */
-  _wsOnStop: function(context, statusCode) {
-    debug("wsOnStop()");
-    this._releaseWakeLock();
-
-    if (statusCode != Cr.NS_OK &&
-        !(statusCode == Cr.NS_BASE_STREAM_CLOSED && this._willBeWokenUpByUDP)) {
-      debug("Socket error " + statusCode);
-      this._reconnectAfterBackoff();
-    }
-
-    // Bug 896919. We always shutdown the WebSocket, even if we need to
-    // reconnect. This works because _reconnectAfterBackoff() is "async"
-    // (there is a minimum delay of the pref retryBaseInterval, which by default
-    // is 5000ms), so that function will open the WebSocket again.
-    this._shutdownWS();
-  },
-
-  _wsOnMessageAvailable: function(context, message) {
-    debug("wsOnMessageAvailable() " + message);
-
-    this._waitingForPong = false;
-
-    let reply = undefined;
-    try {
-      reply = JSON.parse(message);
-    } catch(e) {
-      debug("Parsing JSON failed. text : " + message);
-      return;
-    }
-
-    // If we are not waiting for a hello message, reset the retry fail count
-    if (this._currentState != STATE_WAITING_FOR_HELLO) {
-      debug('Reseting _retryFailCount and _pingIntervalRetryTimes');
-      this._retryFailCount = 0;
-      this._pingIntervalRetryTimes = {};
-    }
-
-    let doNotHandle = false;
-    if ((message === '{}') ||
-        (reply.messageType === undefined) ||
-        (reply.messageType === "ping") ||
-        (typeof reply.messageType != "string")) {
-      debug('Pong received');
-      this._calculateAdaptivePing(false);
-      doNotHandle = true;
-    }
-
-    // Reset the ping timer.  Note: This path is executed at every step of the
-    // handshake, so this alarm does not need to be set explicitly at startup.
-    this._setAlarm(prefs.get("pingInterval"));
-
-    // If it is a ping, do not handle the message.
-    if (doNotHandle) {
-      return;
-    }
-
-    // A whitelist of protocol handlers. Add to these if new messages are added
-    // in the protocol.
-    let handlers = ["Hello", "Register", "Notification"];
-
-    // Build up the handler name to call from messageType.
-    // e.g. messageType == "register" -> _handleRegisterReply.
-    let handlerName = reply.messageType[0].toUpperCase() +
-                      reply.messageType.slice(1).toLowerCase();
-
-    if (handlers.indexOf(handlerName) == -1) {
-      debug("No whitelisted handler " + handlerName + ". messageType: " +
-            reply.messageType);
-      return;
-    }
-
-    let handler = "_handle" + handlerName + "Reply";
-
-    if (typeof this[handler] !== "function") {
-      debug("Handler whitelisted but not implemented! " + handler);
-      return;
-    }
-
-    this[handler](reply);
-  },
-
-  /**
-   * The websocket should never be closed. Since we don't call ws.close(),
-   * _wsOnStop() receives error code NS_BASE_STREAM_CLOSED (see comment in that
-   * function), which calls reconnect and re-establishes the WebSocket
-   * connection.
-   *
-   * If the server said it'll use UDP for wakeup, we set _willBeWokenUpByUDP
-   * and stop reconnecting in _wsOnStop().
-   */
-  _wsOnServerClose: function(context, aStatusCode, aReason) {
-    debug("wsOnServerClose() " + aStatusCode + " " + aReason);
-
-    // Switch over to UDP.
-    if (aStatusCode == kUDP_WAKEUP_WS_STATUS_CODE) {
-      debug("Server closed with promise to wake up");
-      this._willBeWokenUpByUDP = true;
-      // TODO: there should be no pending requests
-    }
-  },
-
-  /**
-   * This method should be called only if the device is on a mobile network!
-   */
-  _listenForUDPWakeup: function() {
-    debug("listenForUDPWakeup()");
-
-    if (this._udpServer) {
-      debug("UDP Server already running");
-      return;
-    }
-
-    if (!prefs.get("udp.wakeupEnabled")) {
-      debug("UDP support disabled");
-      return;
-    }
-
-    this._udpServer = Cc["@mozilla.org/network/udp-socket;1"]
-                        .createInstance(Ci.nsIUDPSocket);
-    this._udpServer.init(-1, false, Services.scriptSecurityManager.getSystemPrincipal());
-    this._udpServer.asyncListen(this);
-    debug("listenForUDPWakeup listening on " + this._udpServer.port);
-
-    return this._udpServer.port;
-  },
-
-  /**
-   * Called by UDP Server Socket. As soon as a ping is recieved via UDP,
-   * reconnect the WebSocket and get the actual data.
-   */
-  onPacketReceived: function(aServ, aMessage) {
-    debug("Recv UDP datagram on port: " + this._udpServer.port);
-    this._beginWSSetup();
-  },
-
-  /**
-   * Called by UDP Server Socket if the socket was closed for some reason.
-   *
-   * If this happens, we reconnect the WebSocket to not miss out on
-   * notifications.
-   */
-  onStopListening: function(aServ, aStatus) {
-    debug("UDP Server socket was shutdown. Status: " + aStatus);
-    this._udpServer = undefined;
-    this._beginWSSetup();
-  },
-
-  /**
-   * Returns information about MCC-MNC and the IP of the current connection.
-   */
-  _getNetworkInformation: function() {
-    debug("getNetworkInformation()");
-
-    try {
-      if (!prefs.get("udp.wakeupEnabled")) {
-        debug("UDP support disabled, we do not send any carrier info");
-        throw new Error("UDP disabled");
-      }
-
-      let nm = Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
-      if (nm.activeNetworkInfo &&
-          nm.activeNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
-        let iccService = Cc["@mozilla.org/icc/iccservice;1"].getService(Ci.nsIIccService);
-        // TODO: Bug 927721 - PushService for multi-sim
-        // In Multi-sim, there is more than one client in iccService. Each
-        // client represents a icc handle. To maintain backward compatibility
-        // with single sim, we always use client 0 for now. Adding support
-        // for multiple sim will be addressed in bug 927721, if needed.
-        let clientId = 0;
-        let icc = iccService.getIccByServiceId(clientId);
-        let iccInfo = icc && icc.iccInfo;
-        if (iccInfo) {
-          debug("Running on mobile data");
-
-          let ips = {};
-          let prefixLengths = {};
-          nm.activeNetworkInfo.getAddresses(ips, prefixLengths);
-
-          return {
-            mcc: iccInfo.mcc,
-            mnc: iccInfo.mnc,
-            ip:  ips.value[0]
-          }
-        }
-      }
-    } catch (e) {
-      debug("Error recovering mobile network information: " + e);
-    }
-
-    debug("Running on wifi");
-    return {
-      mcc: 0,
-      mnc: 0,
-      ip: undefined
-    };
-  },
-
-  /**
-   * Get mobile network information to decide if the client is capable of being
-   * woken up by UDP (which currently just means having an mcc and mnc along
-   * with an IP, and optionally a netid).
-   */
-  _getNetworkState: function(callback) {
-    debug("getNetworkState()");
-
-    if (typeof callback !== 'function') {
-      throw new Error("No callback method. Aborting push agent !");
-    }
-
-    var networkInfo = this._getNetworkInformation();
-
-    if (networkInfo.ip) {
-      this._getMobileNetworkId(networkInfo, function(netid) {
-        debug("Recovered netID = " + netid);
-        callback({
-          mcc: networkInfo.mcc,
-          mnc: networkInfo.mnc,
-          ip:  networkInfo.ip,
-          netid: netid
-        });
-      });
-    } else {
-      callback(networkInfo);
-    }
-  },
-
-  // utility function used to add/remove observers in init() and shutdown()
-  _getNetworkStateChangeEventName: function() {
-    try {
-      Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
-      return "network-active-changed";
-    } catch (e) {
-      return "network:offline-status-changed";
-    }
-  },
-
-  /*
-   * Get the mobile network ID (netid)
-   *
-   * @param networkInfo
-   *        Network information object { mcc, mnc, ip, port }
-   * @param callback
-   *        Callback function to invoke with the netid or null if not found
-   */
-  _getMobileNetworkId: function(networkInfo, callback) {
-    if (typeof callback !== 'function') {
-      return;
-    }
-
-    function queryDNSForDomain(domain) {
-      debug("[_getMobileNetworkId:queryDNSForDomain] Querying DNS for " +
-        domain);
-      let netIDDNSListener = {
-        onLookupComplete: function(aRequest, aRecord, aStatus) {
-          if (aRecord) {
-            let netid = aRecord.getNextAddrAsString();
-            debug("[_getMobileNetworkId:queryDNSForDomain] NetID found: " +
-              netid);
-            callback(netid);
-          } else {
-            debug("[_getMobileNetworkId:queryDNSForDomain] NetID not found");
-            callback(null);
-          }
-        }
-      };
-      gDNSService.asyncResolve(domain, 0, netIDDNSListener,
-        threadManager.currentThread);
-      return [];
-    }
-
-    debug("[_getMobileNetworkId:queryDNSForDomain] Getting mobile network ID");
-
-    let netidAddress = "wakeup.mnc" + ("00" + networkInfo.mnc).slice(-3) +
-      ".mcc" + ("00" + networkInfo.mcc).slice(-3) + ".3gppnetwork.org";
-    queryDNSForDomain(netidAddress, callback);
-  }
-}
deleted file mode 100644
--- a/dom/simplepush/PushServiceLauncher.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* 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;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-function PushServiceLauncher() {
-};
-
-PushServiceLauncher.prototype = {
-  classID: Components.ID("{4b8caa3b-3c58-4f3c-a7f5-7bd9cb24c11d}"),
-
-  contractID: "@mozilla.org/push/ServiceLauncher;1",
-
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
-                                         Ci.nsISupportsWeakReference]),
-
-  observe: function observe(subject, topic, data) {
-    switch (topic) {
-      case "app-startup":
-        Services.obs.addObserver(this, "final-ui-startup", true);
-        break;
-      case "final-ui-startup":
-        Services.obs.removeObserver(this, "final-ui-startup");
-        if (!Services.prefs.getBoolPref("services.push.enabled")) {
-          return;
-        }
-        Cu.import("resource://gre/modules/PushService.jsm");
-        PushService.init();
-        break;
-    }
-  }
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PushServiceLauncher]);
deleted file mode 100644
--- a/dom/simplepush/moz.build
+++ /dev/null
@@ -1,18 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-EXTRA_COMPONENTS += [
-    'Push.js',
-    'Push.manifest',
-    'PushServiceLauncher.js',
-]
-
-EXTRA_JS_MODULES += [
-    'PushService.jsm',
-]
-
-MOCHITEST_MANIFESTS += [
-    'test/mochitest.ini',
-]
deleted file mode 100644
--- a/dom/simplepush/test/mochitest.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[DEFAULT]
-run-if = toolkit == "gonk"
-
-[test_permissions.html]
-[test_register.html]
-[test_prefs.html]
deleted file mode 100644
--- a/dom/simplepush/test/test_permissions.html
+++ /dev/null
@@ -1,60 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-Bug 1235050: SimplePush permissions tests.
-
-Any copyright is dedicated to the Public Domain.
-http://creativecommons.org/licenses/publicdomain/
-
--->
-<head>
-  <title>Test for Bug 1235050</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
-</head>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1235050">Mozilla Bug 1235050</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-</pre>
-
-<script class="testbody" type="text/javascript">
-
-
-  function already_has_permission() {
-    return SpecialPowers.hasPermission("push", document);
-  }
-
-  function add_permission() {
-    var allow = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION;
-    SpecialPowers.addPermission("push", allow, document);
-    window.location.reload();
-  }
-
-  function test_no_permission() {
-    ok((!("push" in navigator)), "push object is NOT exposed");
-  }
-
-  function test_has_permission() {
-    ok(("push" in navigator), "push object is exposed");
-  }
-
-  function runTest() {
-    if (already_has_permission()) {
-      test_has_permission();
-      SimpleTest.finish();
-    } else {
-      test_no_permission();
-      add_permission();
-    }
-  }
-
-  SimpleTest.waitForExplicitFinish();
-
-  runTest();
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/dom/simplepush/test/test_prefs.html
+++ /dev/null
@@ -1,63 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-Bug 1235050: SimplePush basics tests.
-
-Any copyright is dedicated to the Public Domain.
-http://creativecommons.org/licenses/publicdomain/
-
--->
-<head>
-  <title>Test for Bug 1235050</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
-</head>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1235050">Mozilla Bug 1235050</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-</pre>
-
-<script class="testbody" type="text/javascript">
-
-  function test_navigator() {
-    ok(("push" in navigator), "push object is exposed");
-  }
-
-  function test_register(expected, next) {
-    var pushReq = navigator.push.register();
-    pushReq.onsuccess = e => {
-      ok(expected, "push.register() triggered onsuccess");
-      next();
-    };
-    pushReq.onerror = e => {
-      ok(!expected, "push.register() triggered onerror");
-      next();
-    };
-  }
-
-  function runTest() {
-    test_navigator();
-    test_register(false, () => {
-      SpecialPowers.pushPrefEnv({"set": [
-        ["services.push.connection.enabled", true],
-      ]}, () => {
-        test_register(true, () => {
-          SimpleTest.finish();
-	});
-      });
-    });
-  }
-
-  SimpleTest.waitForExplicitFinish();
-  SpecialPowers.addPermission("push", true, document);
-
-  SpecialPowers.pushPrefEnv({"set": [
-    ["services.push.connection.enabled", false],
-  ]}, runTest);
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/dom/simplepush/test/test_register.html
+++ /dev/null
@@ -1,57 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-Bug 1235050: SimplePush basics tests.
-
-Any copyright is dedicated to the Public Domain.
-http://creativecommons.org/licenses/publicdomain/
-
--->
-<head>
-  <title>Test for Bug 1235050</title>
-  <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
-  <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
-</head>
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1235050">Mozilla Bug 1235050</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-</pre>
-
-<script class="testbody" type="text/javascript">
-
-  function test_navigator() {
-    ok(("push" in navigator), "push object is exposed");
-    ok(("register" in navigator.push), "push object is exposed with register");
-    ok(("unregister" in navigator.push), "push object is exposed with unregister");
-  }
-
-  function test_register(next) {
-    var pushReq = navigator.push.register();
-    pushReq.onsuccess = e => {
-      ok(true, "push.register() triggered onsuccess");
-      next();
-    };
-    pushReq.onerror = e => {
-      ok(false, "push.register() triggered onerror");
-      next();
-    };
-  }
-
-  function runTest() {
-    test_navigator();
-    test_register(() => {
-      SimpleTest.finish();
-    });
-  }
-
-  SimpleTest.waitForExplicitFinish();
-  SpecialPowers.addPermission("push", true, document);
-
-  runTest();
-</script>
-</body>
-</html>
--- a/dom/webidl/ServiceWorkerRegistration.webidl
+++ b/dom/webidl/ServiceWorkerRegistration.webidl
@@ -23,13 +23,11 @@ interface ServiceWorkerRegistration : Ev
   [Throws, NewObject]
   Promise<boolean> unregister();
 
   // event
   attribute EventHandler onupdatefound;
 };
 
 partial interface ServiceWorkerRegistration {
-#ifndef MOZ_SIMPLEPUSH
   [Throws, Exposed=(Window,Worker), Func="nsContentUtils::PushEnabled"]
   readonly attribute PushManager pushManager;
-#endif
 };
deleted file mode 100644
--- a/dom/webidl/SimplePushManager.webidl
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* 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/.
-*/
-
-[NavigatorProperty="push",
- JSImplementation="@mozilla.org/push/PushManager;1",
- ChromeOnly,
- Pref="services.push.enabled"]
-interface SimplePushManager {
-    DOMRequest register();
-    DOMRequest unregister(DOMString pushEndpoint);
-    DOMRequest registrations();
-};
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -8,17 +8,16 @@ GENERATED_WEBIDL_FILES = [
     'CSS2Properties.webidl',
 ]
 
 PREPROCESSED_WEBIDL_FILES = [
     'HTMLMediaElement.webidl',
     'Navigator.webidl',
     'Promise.webidl',
     'PromiseDebugging.webidl',
-    'ServiceWorkerRegistration.webidl',
     'Window.webidl',
 ]
 
 WEBIDL_FILES = [
     'AbstractWorker.webidl',
     'AccessibleNode.webidl',
     'AddonManager.webidl',
     'AnalyserNode.webidl',
@@ -391,16 +390,22 @@ WEBIDL_FILES = [
     'PresentationAvailability.webidl',
     'PresentationConnection.webidl',
     'PresentationConnectionList.webidl',
     'PresentationDeviceInfoManager.webidl',
     'PresentationReceiver.webidl',
     'PresentationRequest.webidl',
     'ProcessingInstruction.webidl',
     'ProfileTimelineMarker.webidl',
+    'PushEvent.webidl',
+    'PushManager.webidl',
+    'PushManager.webidl',
+    'PushMessageData.webidl',
+    'PushSubscription.webidl',
+    'PushSubscriptionOptions.webidl',
     'RadioNodeList.webidl',
     'Range.webidl',
     'Rect.webidl',
     'Request.webidl',
     'ResourceStats.webidl',
     'ResourceStatsManager.webidl',
     'Response.webidl',
     'RGBColor.webidl',
@@ -410,16 +415,17 @@ WEBIDL_FILES = [
     'ScriptProcessorNode.webidl',
     'ScrollAreaEvent.webidl',
     'ScrollBoxObject.webidl',
     'Selection.webidl',
     'ServiceWorker.webidl',
     'ServiceWorkerContainer.webidl',
     'ServiceWorkerGlobalScope.webidl',
     'ServiceWorkerMessageEvent.webidl',
+    'ServiceWorkerRegistration.webidl',
     'SettingChangeNotification.webidl',
     'SettingsManager.webidl',
     'ShadowRoot.webidl',
     'SharedWorker.webidl',
     'SharedWorkerGlobalScope.webidl',
     'SimpleGestureEvent.webidl',
     'SmsMessage.webidl',
     'SocketCommon.webidl',
@@ -714,30 +720,16 @@ if CONFIG['MOZ_B2G_BT']:
         'BluetoothObexAuthHandle.webidl',
         'BluetoothPairingHandle.webidl',
         'BluetoothPairingListener.webidl',
         'BluetoothPbapParameters.webidl',
         'BluetoothPbapRequestHandle.webidl',
         'BluetoothUUID.webidl',
     ]
 
-if CONFIG['MOZ_SIMPLEPUSH']:
-    WEBIDL_FILES += [
-        'SimplePushManager.webidl'
-    ]
-else:
-    WEBIDL_FILES += [
-        'PushEvent.webidl',
-        'PushManager.webidl',
-        'PushManager.webidl',
-        'PushMessageData.webidl',
-        'PushSubscription.webidl',
-        'PushSubscriptionOptions.webidl',
-    ]
-
 if CONFIG['MOZ_NFC']:
     WEBIDL_FILES += [
          'MozIsoDepTech.webidl',
          'MozNDEFRecord.webidl',
          'MozNFC.webidl',
          'MozNfcATech.webidl',
          'MozNFCPeer.webidl',
          'MozNFCTag.webidl',
--- a/dom/workers/ServiceWorkerEvents.cpp
+++ b/dom/workers/ServiceWorkerEvents.cpp
@@ -7,54 +7,49 @@
 #include "ServiceWorkerEvents.h"
 
 #include "nsAutoPtr.h"
 #include "nsIConsoleReportCollector.h"
 #include "nsIHttpChannelInternal.h"
 #include "nsINetworkInterceptController.h"
 #include "nsIOutputStream.h"
 #include "nsIScriptError.h"
+#include "nsIUnicodeDecoder.h"
+#include "nsIUnicodeEncoder.h"
 #include "nsContentPolicyUtils.h"
 #include "nsContentUtils.h"
 #include "nsComponentManagerUtils.h"
 #include "nsServiceManagerUtils.h"
 #include "nsStreamUtils.h"
 #include "nsNetCID.h"
 #include "nsNetUtil.h"
 #include "nsSerializationHelper.h"
 #include "nsQueryObject.h"
 #include "ServiceWorkerClient.h"
 #include "ServiceWorkerManager.h"
 
 #include "mozilla/ErrorResult.h"
 #include "mozilla/Preferences.h"
+#include "mozilla/dom/BodyUtil.h"
 #include "mozilla/dom/DOMException.h"
 #include "mozilla/dom/DOMExceptionBinding.h"
+#include "mozilla/dom/EncodingUtils.h"
 #include "mozilla/dom/FetchEventBinding.h"
 #include "mozilla/dom/MessagePort.h"
 #include "mozilla/dom/MessagePortList.h"
 #include "mozilla/dom/PromiseNativeHandler.h"
+#include "mozilla/dom/PushEventBinding.h"
+#include "mozilla/dom/PushMessageDataBinding.h"
+#include "mozilla/dom/PushUtil.h"
 #include "mozilla/dom/Request.h"
+#include "mozilla/dom/TypedArray.h"
 #include "mozilla/dom/Response.h"
 #include "mozilla/dom/WorkerScope.h"
 #include "mozilla/dom/workers/bindings/ServiceWorker.h"
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/PushEventBinding.h"
-#include "mozilla/dom/PushMessageDataBinding.h"
-
-#include "nsIUnicodeDecoder.h"
-#include "nsIUnicodeEncoder.h"
-
-#include "mozilla/dom/BodyUtil.h"
-#include "mozilla/dom/EncodingUtils.h"
-#include "mozilla/dom/PushUtil.h"
-#include "mozilla/dom/TypedArray.h"
-#endif
-
 #include "js/Conversions.h"
 #include "js/TypeDecls.h"
 #include "WorkerPrivate.h"
 #include "xpcpublic.h"
 
 using namespace mozilla::dom;
 using namespace mozilla::dom::workers;
 
@@ -957,18 +952,16 @@ ExtendableEvent::GetPromise()
 NS_IMPL_ADDREF_INHERITED(ExtendableEvent, Event)
 NS_IMPL_RELEASE_INHERITED(ExtendableEvent, Event)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ExtendableEvent)
 NS_INTERFACE_MAP_END_INHERITING(Event)
 
 NS_IMPL_CYCLE_COLLECTION_INHERITED(ExtendableEvent, Event, mPromises)
 
-#ifndef MOZ_SIMPLEPUSH
-
 namespace {
 nsresult
 ExtractBytesFromUSVString(const nsAString& aStr, nsTArray<uint8_t>& aBytes)
 {
   MOZ_ASSERT(aBytes.IsEmpty());
   nsCOMPtr<nsIUnicodeEncoder> encoder = EncodingUtils::EncoderForEncoding("UTF-8");
   if (NS_WARN_IF(!encoder)) {
     return NS_ERROR_OUT_OF_MEMORY;
@@ -1157,18 +1150,16 @@ NS_INTERFACE_MAP_END_INHERITING(Extendab
 NS_IMPL_CYCLE_COLLECTION_INHERITED(PushEvent, ExtendableEvent, mData)
 
 JSObject*
 PushEvent::WrapObjectInternal(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
 {
   return mozilla::dom::PushEventBinding::Wrap(aCx, this, aGivenProto);
 }
 
-#endif /* ! MOZ_SIMPLEPUSH */
-
 ExtendableMessageEvent::ExtendableMessageEvent(EventTarget* aOwner)
   : ExtendableEvent(aOwner)
   , mData(JS::UndefinedValue())
 {
   mozilla::HoldJSObjects(this);
 }
 
 ExtendableMessageEvent::~ExtendableMessageEvent()
--- a/dom/workers/ServiceWorkerEvents.h
+++ b/dom/workers/ServiceWorkerEvents.h
@@ -6,24 +6,21 @@
 
 #ifndef mozilla_dom_workers_serviceworkerevents_h__
 #define mozilla_dom_workers_serviceworkerevents_h__
 
 #include "mozilla/dom/Event.h"
 #include "mozilla/dom/ExtendableEventBinding.h"
 #include "mozilla/dom/ExtendableMessageEventBinding.h"
 #include "mozilla/dom/FetchEventBinding.h"
+#include "mozilla/dom/File.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/Response.h"
 #include "mozilla/dom/workers/bindings/ServiceWorker.h"
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/File.h"
-#endif
-
 #include "nsProxyRelease.h"
 #include "nsContentUtils.h"
 
 class nsIInterceptedChannel;
 
 namespace mozilla {
 namespace dom {
 class Blob;
@@ -180,18 +177,16 @@ public:
 
   void
   PreventDefault(JSContext* aCx) override;
 
   void
   ReportCanceled();
 };
 
-#ifndef MOZ_SIMPLEPUSH
-
 class PushMessageData final : public nsISupports,
                               public nsWrapperCache
 {
 public:
   NS_DECL_CYCLE_COLLECTING_ISUPPORTS
   NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PushMessageData)
 
   virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
@@ -250,17 +245,16 @@ public:
   }
 
   PushMessageData*
   GetData() const
   {
     return mData;
   }
 };
-#endif /* ! MOZ_SIMPLEPUSH */
 
 class ExtendableMessageEvent final : public ExtendableEvent
 {
   JS::Heap<JS::Value> mData;
   nsString mOrigin;
   nsString mLastEventId;
   RefPtr<ServiceWorkerClient> mClient;
   RefPtr<ServiceWorker> mServiceWorker;
--- a/dom/workers/ServiceWorkerManager.cpp
+++ b/dom/workers/ServiceWorkerManager.cpp
@@ -40,16 +40,17 @@
 #include "mozilla/dom/ErrorEvent.h"
 #include "mozilla/dom/Headers.h"
 #include "mozilla/dom/InternalHeaders.h"
 #include "mozilla/dom/Navigator.h"
 #include "mozilla/dom/NotificationEvent.h"
 #include "mozilla/dom/PromiseNativeHandler.h"
 #include "mozilla/dom/Request.h"
 #include "mozilla/dom/RootedDictionary.h"
+#include "mozilla/dom/TypedArray.h"
 #include "mozilla/ipc/BackgroundChild.h"
 #include "mozilla/ipc/PBackgroundChild.h"
 #include "mozilla/ipc/PBackgroundSharedTypes.h"
 #include "mozilla/Unused.h"
 #include "mozilla/EnumSet.h"
 
 #include "nsContentPolicyUtils.h"
 #include "nsContentSecurityManager.h"
@@ -76,20 +77,16 @@
 #include "ServiceWorkerUnregisterJob.h"
 #include "ServiceWorkerUpdateJob.h"
 #include "SharedWorker.h"
 #include "WorkerInlines.h"
 #include "WorkerPrivate.h"
 #include "WorkerRunnable.h"
 #include "WorkerScope.h"
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/TypedArray.h"
-#endif
-
 #ifdef PostMessage
 #undef PostMessage
 #endif
 
 using namespace mozilla;
 using namespace mozilla::dom;
 using namespace mozilla::ipc;
 
@@ -922,55 +919,47 @@ ServiceWorkerManager::SendPushEvent(cons
 }
 
 nsresult
 ServiceWorkerManager::SendPushEvent(const nsACString& aOriginAttributes,
                                     const nsACString& aScope,
                                     const nsAString& aMessageId,
                                     const Maybe<nsTArray<uint8_t>>& aData)
 {
-#ifdef MOZ_SIMPLEPUSH
-  return NS_ERROR_NOT_AVAILABLE;
-#else
   PrincipalOriginAttributes attrs;
   if (!attrs.PopulateFromSuffix(aOriginAttributes)) {
     return NS_ERROR_INVALID_ARG;
   }
 
   ServiceWorkerInfo* serviceWorker = GetActiveWorkerInfoForScope(attrs, aScope);
   if (NS_WARN_IF(!serviceWorker)) {
     return NS_ERROR_FAILURE;
   }
 
   RefPtr<ServiceWorkerRegistrationInfo> registration =
     GetRegistration(serviceWorker->GetPrincipal(), aScope);
 
   return serviceWorker->WorkerPrivate()->SendPushEvent(aMessageId, aData,
                                                        registration);
-#endif // MOZ_SIMPLEPUSH
 }
 
 NS_IMETHODIMP
 ServiceWorkerManager::SendPushSubscriptionChangeEvent(const nsACString& aOriginAttributes,
                                                       const nsACString& aScope)
 {
-#ifdef MOZ_SIMPLEPUSH
-  return NS_ERROR_NOT_AVAILABLE;
-#else
   PrincipalOriginAttributes attrs;
   if (!attrs.PopulateFromSuffix(aOriginAttributes)) {
     return NS_ERROR_INVALID_ARG;
   }
 
   ServiceWorkerInfo* info = GetActiveWorkerInfoForScope(attrs, aScope);
   if (!info) {
     return NS_ERROR_FAILURE;
   }
   return info->WorkerPrivate()->SendPushSubscriptionChangeEvent();
-#endif
 }
 
 nsresult
 ServiceWorkerManager::SendNotificationEvent(const nsAString& aEventName,
                                             const nsACString& aOriginSuffix,
                                             const nsACString& aScope,
                                             const nsAString& aID,
                                             const nsAString& aTitle,
--- a/dom/workers/ServiceWorkerPrivate.cpp
+++ b/dom/workers/ServiceWorkerPrivate.cpp
@@ -6,39 +6,36 @@
 
 #include "ServiceWorkerPrivate.h"
 
 #include "ServiceWorkerManager.h"
 #include "nsContentUtils.h"
 #include "nsIHttpChannelInternal.h"
 #include "nsIHttpHeaderVisitor.h"
 #include "nsINetworkInterceptController.h"
+#include "nsIPushErrorReporter.h"
 #include "nsISupportsImpl.h"
 #include "nsIUploadChannel2.h"
 #include "nsNetUtil.h"
 #include "nsProxyRelease.h"
 #include "nsQueryObject.h"
 #include "nsStreamUtils.h"
 #include "nsStringStream.h"
 #include "WorkerRunnable.h"
 #include "WorkerScope.h"
 #include "mozilla/Assertions.h"
 #include "mozilla/dom/FetchUtil.h"
 #include "mozilla/dom/IndexedDatabaseManager.h"
 #include "mozilla/dom/InternalHeaders.h"
 #include "mozilla/dom/NotificationEvent.h"
 #include "mozilla/dom/PromiseNativeHandler.h"
+#include "mozilla/dom/PushEventBinding.h"
 #include "mozilla/dom/RequestBinding.h"
 #include "mozilla/Unused.h"
 
-#ifndef MOZ_SIMPLEPUSH
-#include "nsIPushErrorReporter.h"
-#include "mozilla/dom/PushEventBinding.h"
-#endif
-
 using namespace mozilla;
 using namespace mozilla::dom;
 
 BEGIN_WORKERS_NAMESPACE
 
 NS_IMPL_CYCLE_COLLECTING_ADDREF(ServiceWorkerPrivate)
 NS_IMPL_CYCLE_COLLECTING_RELEASE(ServiceWorkerPrivate)
 NS_IMPL_CYCLE_COLLECTION(ServiceWorkerPrivate, mSupportsArray)
@@ -724,17 +721,16 @@ ServiceWorkerPrivate::SendLifeCycleEvent
                                                               aCallback);
   if (NS_WARN_IF(!r->Dispatch())) {
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
 }
 
-#ifndef MOZ_SIMPLEPUSH
 namespace {
 
 class PushErrorReporter final : public PromiseNativeHandler
 {
   WorkerPrivate* mWorkerPrivate;
   nsString mMessageId;
 
   ~PushErrorReporter()
@@ -890,26 +886,22 @@ public:
     DispatchExtendableEventOnWorkerScope(aCx, aWorkerPrivate->GlobalScope(),
                                          event, nullptr);
 
     return true;
   }
 };
 
 } // anonymous namespace
-#endif // !MOZ_SIMPLEPUSH
 
 nsresult
 ServiceWorkerPrivate::SendPushEvent(const nsAString& aMessageId,
                                     const Maybe<nsTArray<uint8_t>>& aData,
                                     ServiceWorkerRegistrationInfo* aRegistration)
 {
-#ifdef MOZ_SIMPLEPUSH
-  return NS_ERROR_NOT_AVAILABLE;
-#else
   nsresult rv = SpawnWorkerIfNeeded(PushEvent, nullptr);
   NS_ENSURE_SUCCESS(rv, rv);
 
   RefPtr<KeepAliveToken> token = CreateEventKeepAliveToken();
 
   nsMainThreadPtrHandle<ServiceWorkerRegistrationInfo> regInfo(
     new nsMainThreadPtrHolder<ServiceWorkerRegistrationInfo>(aRegistration, false));
 
@@ -926,37 +918,32 @@ ServiceWorkerPrivate::SendPushEvent(cons
 
   MOZ_ASSERT(mInfo->State() == ServiceWorkerState::Activated);
 
   if (NS_WARN_IF(!r->Dispatch())) {
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
-#endif // MOZ_SIMPLEPUSH
 }
 
 nsresult
 ServiceWorkerPrivate::SendPushSubscriptionChangeEvent()
 {
-#ifdef MOZ_SIMPLEPUSH
-  return NS_ERROR_NOT_AVAILABLE;
-#else
   nsresult rv = SpawnWorkerIfNeeded(PushSubscriptionChangeEvent, nullptr);
   NS_ENSURE_SUCCESS(rv, rv);
 
   RefPtr<KeepAliveToken> token = CreateEventKeepAliveToken();
   RefPtr<WorkerRunnable> r =
     new SendPushSubscriptionChangeEventRunnable(mWorkerPrivate, token);
   if (NS_WARN_IF(!r->Dispatch())) {
     return NS_ERROR_FAILURE;
   }
 
   return NS_OK;
-#endif // MOZ_SIMPLEPUSH
 }
 
 namespace {
 
 static void
 DummyNotificationTimerCallback(nsITimer* aTimer, void* aClosure)
 {
   // Nothing.
--- a/dom/workers/ServiceWorkerRegistration.cpp
+++ b/dom/workers/ServiceWorkerRegistration.cpp
@@ -5,16 +5,18 @@
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "ServiceWorkerRegistration.h"
 
 #include "ipc/ErrorIPCUtils.h"
 #include "mozilla/dom/Notification.h"
 #include "mozilla/dom/Promise.h"
 #include "mozilla/dom/PromiseWorkerProxy.h"
+#include "mozilla/dom/PushManagerBinding.h"
+#include "mozilla/dom/PushManager.h"
 #include "mozilla/dom/ServiceWorkerRegistrationBinding.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
 #include "mozilla/Unused.h"
 #include "nsCycleCollectionParticipant.h"
 #include "nsNetUtil.h"
 #include "nsServiceManagerUtils.h"
 #include "ServiceWorker.h"
@@ -25,21 +27,16 @@
 #include "nsISupportsPrimitives.h"
 #include "nsPIDOMWindow.h"
 #include "nsContentUtils.h"
 
 #include "WorkerPrivate.h"
 #include "Workers.h"
 #include "WorkerScope.h"
 
-#ifndef MOZ_SIMPLEPUSH
-#include "mozilla/dom/PushManagerBinding.h"
-#include "mozilla/dom/PushManager.h"
-#endif
-
 using namespace mozilla::dom::workers;
 
 namespace mozilla {
 namespace dom {
 
 /* static */ bool
 ServiceWorkerRegistration::Visible(JSContext* aCx, JSObject* aObj)
 {
@@ -156,37 +153,29 @@ private:
   // The following properties are cached here to ensure JS equality is satisfied
   // instead of acquiring a new worker instance from the ServiceWorkerManager
   // for every access. A null value is considered a cache miss.
   // These three may change to a new worker at any time.
   RefPtr<ServiceWorker> mInstallingWorker;
   RefPtr<ServiceWorker> mWaitingWorker;
   RefPtr<ServiceWorker> mActiveWorker;
 
-#ifndef MOZ_SIMPLEPUSH
   RefPtr<PushManager> mPushManager;
-#endif
 };
 
 NS_IMPL_ADDREF_INHERITED(ServiceWorkerRegistrationMainThread, ServiceWorkerRegistration)
 NS_IMPL_RELEASE_INHERITED(ServiceWorkerRegistrationMainThread, ServiceWorkerRegistration)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistrationMainThread)
 NS_INTERFACE_MAP_END_INHERITING(ServiceWorkerRegistration)
 
-#ifndef MOZ_SIMPLEPUSH
 NS_IMPL_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistrationMainThread,
                                    ServiceWorkerRegistration,
                                    mPushManager,
                                    mInstallingWorker, mWaitingWorker, mActiveWorker);
-#else
-NS_IMPL_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistrationMainThread,
-                                   ServiceWorkerRegistration,
-                                   mInstallingWorker, mWaitingWorker, mActiveWorker);
-#endif
 
 ServiceWorkerRegistrationMainThread::ServiceWorkerRegistrationMainThread(nsPIDOMWindowInner* aWindow,
                                                                          const nsAString& aScope)
   : ServiceWorkerRegistration(aWindow, aScope)
   , mListeningForEvents(false)
 {
   AssertIsOnMainThread();
   MOZ_ASSERT(aWindow);
@@ -831,20 +820,16 @@ ServiceWorkerRegistrationMainThread::Get
 }
 
 already_AddRefed<PushManager>
 ServiceWorkerRegistrationMainThread::GetPushManager(JSContext* aCx,
                                                     ErrorResult& aRv)
 {
   AssertIsOnMainThread();
 
-#ifdef MOZ_SIMPLEPUSH
-  return nullptr;
-#else
-
   if (!mPushManager) {
     nsCOMPtr<nsIGlobalObject> globalObject = do_QueryInterface(GetOwner());
 
     if (!globalObject) {
       aRv.Throw(NS_ERROR_FAILURE);
       return nullptr;
     }
 
@@ -852,18 +837,16 @@ ServiceWorkerRegistrationMainThread::Get
     mPushManager = PushManager::Constructor(global, mScope, aRv);
     if (aRv.Failed()) {
       return nullptr;
     }
   }
 
   RefPtr<PushManager> ret = mPushManager;
   return ret.forget();
-
-#endif /* ! MOZ_SIMPLEPUSH */
 }
 
 ////////////////////////////////////////////////////
 // Worker Thread implementation
 
 class ServiceWorkerRegistrationWorkerThread final : public ServiceWorkerRegistration
                                                   , public WorkerHolder
 {
@@ -926,19 +909,17 @@ private:
   InitListener();
 
   void
   ReleaseListener(Reason aReason);
 
   WorkerPrivate* mWorkerPrivate;
   RefPtr<WorkerListener> mListener;
 
-#ifndef MOZ_SIMPLEPUSH
   RefPtr<PushManager> mPushManager;
-#endif
 };
 
 class WorkerListener final : public ServiceWorkerRegistrationListener
 {
   // Accessed on the main thread.
   WorkerPrivate* mWorkerPrivate;
   nsString mScope;
   bool mListeningForEvents;
@@ -1050,26 +1031,23 @@ NS_IMPL_RELEASE_INHERITED(ServiceWorkerR
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(ServiceWorkerRegistrationWorkerThread)
 NS_INTERFACE_MAP_END_INHERITING(ServiceWorkerRegistration)
 
 // Expanded macros since we need special behaviour to release the proxy.
 NS_IMPL_CYCLE_COLLECTION_CLASS(ServiceWorkerRegistrationWorkerThread)
 
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(ServiceWorkerRegistrationWorkerThread,
                                                   ServiceWorkerRegistration)
-#ifndef MOZ_SIMPLEPUSH
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPushManager)
-#endif
+
 NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(ServiceWorkerRegistrationWorkerThread,
                                                 ServiceWorkerRegistration)
-#ifndef MOZ_SIMPLEPUSH
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mPushManager)
-#endif
   tmp->ReleaseListener(RegistrationIsGoingAway);
 NS_IMPL_CYCLE_COLLECTION_UNLINK_END
 
 ServiceWorkerRegistrationWorkerThread::ServiceWorkerRegistrationWorkerThread(WorkerPrivate* aWorkerPrivate,
                                                                              const nsAString& aScope)
   : ServiceWorkerRegistration(nullptr, aScope)
   , mWorkerPrivate(aWorkerPrivate)
 {
@@ -1349,28 +1327,22 @@ ServiceWorkerRegistrationWorkerThread::G
                                                         ErrorResult& aRv)
 {
   return Notification::WorkerGet(mWorkerPrivate, aOptions, mScope, aRv);
 }
 
 already_AddRefed<PushManager>
 ServiceWorkerRegistrationWorkerThread::GetPushManager(JSContext* aCx, ErrorResult& aRv)
 {
-#ifdef MOZ_SIMPLEPUSH
-  return nullptr;
-#else
-
   if (!mPushManager) {
     mPushManager = new PushManager(mScope);
   }
 
   RefPtr<PushManager> ret = mPushManager;
   return ret.forget();
-
-#endif /* ! MOZ_SIMPLEPUSH */
 }
 
 ////////////////////////////////////////////////////
 // Base class implementation
 
 NS_IMPL_ADDREF_INHERITED(ServiceWorkerRegistration, DOMEventTargetHelper)
 NS_IMPL_RELEASE_INHERITED(ServiceWorkerRegistration, DOMEventTargetHelper)
 
--- a/layout/build/nsLayoutModule.cpp
+++ b/layout/build/nsLayoutModule.cpp
@@ -120,22 +120,20 @@ using mozilla::dom::bluetooth::Bluetooth
 
 #ifdef MOZ_WIDGET_GONK
 #include "AudioManager.h"
 using mozilla::dom::gonk::AudioManager;
 #include "nsVolumeService.h"
 using mozilla::system::nsVolumeService;
 #endif
 
-#ifndef MOZ_SIMPLEPUSH
 #include "mozilla/dom/PushNotifier.h"
 using mozilla::dom::PushNotifier;
 #define PUSHNOTIFIER_CID \
 { 0x2fc2d3e3, 0x020f, 0x404e, { 0xb0, 0x6a, 0x6e, 0xcf, 0x3e, 0xa2, 0x33, 0x4a } }
-#endif
 
 #include "AudioChannelAgent.h"
 using mozilla::dom::AudioChannelAgent;
 
 // Editor stuff
 #include "nsEditorCID.h"
 #include "mozilla/EditorController.h" //CID
 #include "mozilla/HTMLEditor.h"
@@ -395,20 +393,18 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(Presentat
 NS_GENERIC_FACTORY_CONSTRUCTOR(TextInputProcessor)
 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(FakeInputPortService,
                                          InputPortServiceFactory::CreateFakeInputPortService)
 NS_GENERIC_FACTORY_CONSTRUCTOR(InputPortData)
 NS_GENERIC_FACTORY_SINGLETON_CONSTRUCTOR(nsIPresentationService,
                                          NS_CreatePresentationService)
 NS_GENERIC_FACTORY_CONSTRUCTOR(PresentationTCPSessionTransport)
 NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(NotificationTelemetryService, Init)
+NS_GENERIC_FACTORY_CONSTRUCTOR(PushNotifier)
 
-#ifndef MOZ_SIMPLEPUSH
-NS_GENERIC_FACTORY_CONSTRUCTOR(PushNotifier)
-#endif
 //-----------------------------------------------------------------------------
 
 static bool gInitialized = false;
 
 // Perform our one-time intialization for this module
 
 // static
 nsresult
@@ -767,20 +763,17 @@ NS_DEFINE_NAMED_CID(NS_DOMPARSER_CID);
 NS_DEFINE_NAMED_CID(NS_DOMSESSIONSTORAGEMANAGER_CID);
 NS_DEFINE_NAMED_CID(NS_DOMLOCALSTORAGEMANAGER_CID);
 NS_DEFINE_NAMED_CID(NS_DOMJSON_CID);
 NS_DEFINE_NAMED_CID(NS_TEXTEDITOR_CID);
 NS_DEFINE_NAMED_CID(DOMREQUEST_SERVICE_CID);
 NS_DEFINE_NAMED_CID(QUOTAMANAGER_SERVICE_CID);
 NS_DEFINE_NAMED_CID(SERVICEWORKERMANAGER_CID);
 NS_DEFINE_NAMED_CID(NOTIFICATIONTELEMETRYSERVICE_CID);
-
-#ifndef MOZ_SIMPLEPUSH
 NS_DEFINE_NAMED_CID(PUSHNOTIFIER_CID);
-#endif
 
 NS_DEFINE_NAMED_CID(WORKERDEBUGGERMANAGER_CID);
 #ifdef MOZ_WIDGET_GONK
 NS_DEFINE_NAMED_CID(SYSTEMWORKERMANAGER_CID);
 #endif
 #ifdef MOZ_B2G_BT
 NS_DEFINE_NAMED_CID(BLUETOOTHSERVICE_CID);
 #endif
@@ -1075,19 +1068,17 @@ static const mozilla::Module::CIDEntry k
   { &kNS_DOMSESSIONSTORAGEMANAGER_CID, false, nullptr, DOMSessionStorageManagerConstructor },
   { &kNS_DOMLOCALSTORAGEMANAGER_CID, false, nullptr, DOMLocalStorageManagerConstructor },
   { &kNS_DOMJSON_CID, false, nullptr, NS_NewJSON },
   { &kNS_TEXTEDITOR_CID, false, nullptr, TextEditorConstructor },
   { &kDOMREQUEST_SERVICE_CID, false, nullptr, DOMRequestServiceConstructor },
   { &kQUOTAMANAGER_SERVICE_CID, false, nullptr, QuotaManagerServiceConstructor },
   { &kSERVICEWORKERMANAGER_CID, false, nullptr, ServiceWorkerManagerConstructor },
   { &kNOTIFICATIONTELEMETRYSERVICE_CID, false, nullptr, NotificationTelemetryServiceConstructor },
-#ifndef MOZ_SIMPLEPUSH
   { &kPUSHNOTIFIER_CID, false, nullptr, PushNotifierConstructor },
-#endif
   { &kWORKERDEBUGGERMANAGER_CID, true, nullptr, WorkerDebuggerManagerConstructor },
 #ifdef MOZ_WIDGET_GONK
   { &kSYSTEMWORKERMANAGER_CID, true, nullptr, SystemWorkerManagerConstructor },
 #endif
 #ifdef MOZ_B2G_BT
   { &kBLUETOOTHSERVICE_CID, true, nullptr, BluetoothServiceConstructor },
 #endif
 #ifdef MOZ_WIDGET_GONK
@@ -1242,19 +1233,17 @@ static const mozilla::Module::ContractID
   { "@mozilla.org/dom/storagemanager;1", &kNS_DOMLOCALSTORAGEMANAGER_CID },
   { "@mozilla.org/dom/sessionStorage-manager;1", &kNS_DOMSESSIONSTORAGEMANAGER_CID },
   { "@mozilla.org/dom/json;1", &kNS_DOMJSON_CID },
   { "@mozilla.org/editor/texteditor;1", &kNS_TEXTEDITOR_CID },
   { DOMREQUEST_SERVICE_CONTRACTID, &kDOMREQUEST_SERVICE_CID },
   { QUOTAMANAGER_SERVICE_CONTRACTID, &kQUOTAMANAGER_SERVICE_CID },
   { SERVICEWORKERMANAGER_CONTRACTID, &kSERVICEWORKERMANAGER_CID },
   { NOTIFICATIONTELEMETRYSERVICE_CONTRACTID, &kNOTIFICATIONTELEMETRYSERVICE_CID },
-#ifndef MOZ_SIMPLEPUSH
   { PUSHNOTIFIER_CONTRACTID, &kPUSHNOTIFIER_CID },
-#endif
   { WORKERDEBUGGERMANAGER_CONTRACTID, &kWORKERDEBUGGERMANAGER_CID },
 #ifdef MOZ_WIDGET_GONK
   { SYSTEMWORKERMANAGER_CONTRACTID, &kSYSTEMWORKERMANAGER_CID },
 #endif
 #ifdef MOZ_B2G_BT
   { BLUETOOTHSERVICE_CONTRACTID, &kBLUETOOTHSERVICE_CID },
 #endif
 #ifdef MOZ_WIDGET_GONK
@@ -1345,19 +1334,17 @@ static const mozilla::Module::CategoryEn
   XPCONNECT_CATEGORIES
   { "content-policy", NS_DATADOCUMENTCONTENTPOLICY_CONTRACTID, NS_DATADOCUMENTCONTENTPOLICY_CONTRACTID },
   { "content-policy", NS_NODATAPROTOCOLCONTENTPOLICY_CONTRACTID, NS_NODATAPROTOCOLCONTENTPOLICY_CONTRACTID },
   { "content-policy", "CSPService", CSPSERVICE_CONTRACTID },
   { "content-policy", NS_MIXEDCONTENTBLOCKER_CONTRACTID, NS_MIXEDCONTENTBLOCKER_CONTRACTID },
   { "net-channel-event-sinks", "CSPService", CSPSERVICE_CONTRACTID },
   { "net-channel-event-sinks", NS_MIXEDCONTENTBLOCKER_CONTRACTID, NS_MIXEDCONTENTBLOCKER_CONTRACTID },
   { "app-startup", "Script Security Manager", "service," NS_SCRIPTSECURITYMANAGER_CONTRACTID },
-#ifndef MOZ_SIMPLEPUSH
   { "app-startup", "Push Notifier", "service," PUSHNOTIFIER_CONTRACTID },
-#endif
   { "clear-origin-data", "QuotaManagerService", "service," QUOTAMANAGER_SERVICE_CONTRACTID },
   { OBSERVER_TOPIC_IDLE_DAILY, "QuotaManagerService", QUOTAMANAGER_SERVICE_CONTRACTID },
 #ifdef MOZ_WIDGET_GONK
   { "app-startup", "Volume Service", "service," NS_VOLUMESERVICE_CONTRACTID },
 #endif
   CONTENTDLF_CATEGORIES
 #ifdef MOZ_WIDGET_GONK
   { "profile-after-change", "Gonk System Worker Manager", SYSTEMWORKERMANAGER_CONTRACTID },
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -640,19 +640,16 @@ pref("browser.firstrun.show.localepicker
 // On Android, you also need to do the following for the output
 // to show up in logcat:
 //
 // $ adb shell stop
 // $ adb shell setprop log.redirect-stdio true
 // $ adb shell start
 pref("browser.dom.window.dump.enabled", true);
 
-// SimplePush
-pref("services.push.enabled", false);
-
 // controls if we want camera support
 pref("device.camera.enabled", true);
 pref("media.realtime_decoder.enabled", true);
 
 pref("javascript.options.showInConsole", true);
 
 pref("full-screen-api.enabled", true);
 
--- a/old-configure.in
+++ b/old-configure.in
@@ -2348,17 +2348,16 @@ MOZ_XUL=1
 MOZ_ZIPWRITER=1
 MOZ_NO_SMART_CARDS=
 NECKO_COOKIES=1
 MOZ_USE_NATIVE_POPUP_WINDOWS=
 MOZ_EXCLUDE_HYPHENATION_DICTIONARIES=
 MOZ_INSTALL_TRACKING=
 ACCESSIBILITY=1
 MOZ_TIME_MANAGER=
-MOZ_SIMPLEPUSH=
 MOZ_AUDIO_CHANNEL_MANAGER=
 MOZ_CONTENT_SANDBOX=
 MOZ_GMP_SANDBOX=
 MOZ_SANDBOX=1
 MOZ_BINARY_EXTENSIONS=
 MOZ_DEVTOOLS=server
 
 case "$target_os" in
@@ -4887,25 +4886,16 @@ MOZ_ARG_ENABLE_BOOL(b2g-camera,
     MOZ_B2G_CAMERA=1,
     MOZ_B2G_CAMERA= )
 if test -n "$MOZ_B2G_CAMERA"; then
    AC_DEFINE(MOZ_B2G_CAMERA)
 fi
 AC_SUBST(MOZ_B2G_CAMERA)
 
 dnl ========================================================
-dnl = Enable Support for SimplePush (Gonk usually)
-dnl   This will disable the Push API.
-dnl ========================================================
-if test -n "$MOZ_SIMPLEPUSH"; then
-    AC_DEFINE(MOZ_SIMPLEPUSH)
-fi
-AC_SUBST(MOZ_SIMPLEPUSH)
-
-dnl ========================================================
 dnl = Enable Support for AudioChannelManager API
 dnl ========================================================
 if test -n "$MOZ_AUDIO_CHANNEL_MANAGER"; then
     AC_DEFINE(MOZ_AUDIO_CHANNEL_MANAGER)
 fi
 AC_SUBST(MOZ_AUDIO_CHANNEL_MANAGER)
 
 dnl ========================================================