Merge mozilla-central to mozilla-inbound
authorGregory Szorc <gps@mozilla.com>
Wed, 06 Jul 2016 18:30:58 -0700
changeset 384974 3e2ee07720ad8070c930539ca2baf859ace26e83
parent 384973 d666f37dfa890eb321002fa4daf75080826d2649 (current diff)
parent 384777 39ec98bf2580a236471714c28b336d8c974cc365 (diff)
child 384975 032810ad52834d0cf507cc2d357aae8cf877279e
push id22385
push userbmo:wpan@mozilla.com
push dateThu, 07 Jul 2016 12:18:17 +0000
milestone50.0a1
Merge mozilla-central to mozilla-inbound
b2g/components/ActivitiesGlue.js
b2g/components/KillSwitch.js
b2g/components/KillSwitchMain.jsm
b2g/components/PersistentDataBlock.jsm
b2g/components/SystemMessageGlue.js
b2g/components/test/mochitest/file_loadserver.js
b2g/components/test/mochitest/killswitch.js
b2g/components/test/mochitest/test_killswitch_basics.html
b2g/components/test/mochitest/test_killswitch_disable.html
b2g/components/test/mochitest/test_killswitch_enable.html
b2g/components/test/unit/file_killswitch.js
b2g/components/test/unit/file_persistentdatablock.js
b2g/components/test/unit/test_killswitch.js
b2g/components/test/unit/test_killswitch_gonk.js
b2g/components/test/unit/test_persistentdatablock_gonk.js
browser/themes/osx/browser.css
browser/themes/windows/browser.css
build/moz.configure/toolchain.configure
build/win32/mozconfig.vs2013-win64
build/win64/mozconfig.vs2013
dom/activities/Activities.manifest
dom/activities/ActivitiesService.jsm
dom/activities/ActivitiesServiceFilter.jsm
dom/activities/Activity.cpp
dom/activities/Activity.h
dom/activities/ActivityMessageConfigurator.js
dom/activities/ActivityProxy.js
dom/activities/ActivityRequestHandler.js
dom/activities/ActivityWrapper.js
dom/activities/interfaces/moz.build
dom/activities/interfaces/nsIActivityProxy.idl
dom/activities/interfaces/nsIActivityUIGlue.idl
dom/activities/moz.build
dom/activities/tests/mochi/common.js
dom/activities/tests/mochi/manifest.webapp
dom/activities/tests/mochi/manifest.webapp^headers^
dom/activities/tests/mochi/mochitest.ini
dom/activities/tests/mochi/system.webapp
dom/activities/tests/mochi/system.webapp^headers^
dom/activities/tests/mochi/test_dev_mode_activity.html
dom/activities/tests/mochi/test_same_name_multiple_filters.html
dom/activities/tests/unit/test_activityFilters.js
dom/activities/tests/unit/xpcshell.ini
dom/browser-element/mochitest/browserElement_NotifyChannel.js
dom/browser-element/mochitest/file_browserElement_NotifyChannel.html
dom/browser-element/mochitest/manifest.webapp
dom/browser-element/mochitest/manifest.webapp^headers^
dom/browser-element/mochitest/priority/test_ExpectingSystemMessage.html
dom/browser-element/mochitest/priority/test_ExpectingSystemMessage2.html
dom/browser-element/mochitest/test_browserElement_NotifyChannel.html
dom/html/HTMLMediaElement.cpp
dom/ipc/ContentParent.cpp
dom/messages/SystemMessageCache.js
dom/messages/SystemMessageInternal.js
dom/messages/SystemMessageManager.js
dom/messages/SystemMessageManager.manifest
dom/messages/SystemMessagePermissionsChecker.jsm
dom/messages/interfaces/moz.build
dom/messages/interfaces/nsIDOMNavigatorSystemMessages.idl
dom/messages/interfaces/nsISystemMessageCache.idl
dom/messages/interfaces/nsISystemMessageGlue.idl
dom/messages/interfaces/nsISystemMessagesInternal.idl
dom/messages/moz.build
dom/messages/test/chrome.ini
dom/messages/test/file_hasPendingMessage.html
dom/messages/test/invalid_manifest.webapp
dom/messages/test/invalid_manifest.webapp^headers^
dom/messages/test/manifest.webapp
dom/messages/test/manifest.webapp^headers^
dom/messages/test/mochitest.ini
dom/messages/test/system_message_chrome_script.js
dom/messages/test/test_bug_993732.html
dom/messages/test/test_hasPendingMessage.html
dom/messages/test/test_sysmsg_registration.html
dom/moz.build
dom/webidl/ActivityRequestHandler.webidl
dom/webidl/KillSwitch.webidl
dom/webidl/MozActivity.webidl
dom/webidl/moz.build
js/src/old-configure.in
media/libstagefright/binding/mp4parse/boxes.rs
media/libstagefright/binding/mp4parse/byteorder/mod.rs
media/libstagefright/binding/mp4parse/byteorder/new.rs
media/libstagefright/binding/mp4parse/capi.rs
media/libstagefright/binding/mp4parse/lib.rs
media/libstagefright/binding/mp4parse/tests.rs
modules/libpref/init/all.js
mozglue/crt/Makefile.in
mozglue/crt/fixcrt.py
mozglue/crt/moz.build
old-configure.in
--- a/b2g/chrome/content/shell.js
+++ b/b2g/chrome/content/shell.js
@@ -3,33 +3,30 @@
 /* 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/. */
 
 window.performance.mark('gecko-shell-loadstart');
 
 Cu.import('resource://gre/modules/ContactService.jsm');
 Cu.import('resource://gre/modules/AlarmService.jsm');
-Cu.import('resource://gre/modules/ActivitiesService.jsm');
 Cu.import('resource://gre/modules/NotificationDB.jsm');
 Cu.import('resource://gre/modules/Payment.jsm');
 Cu.import("resource://gre/modules/AppsUtils.jsm");
 Cu.import('resource://gre/modules/UserAgentOverrides.jsm');
 Cu.import('resource://gre/modules/Keyboard.jsm');
 Cu.import('resource://gre/modules/ErrorPage.jsm');
 Cu.import('resource://gre/modules/AlertsHelper.jsm');
 Cu.import('resource://gre/modules/SystemUpdateService.jsm');
 
 if (isGonk) {
   Cu.import('resource://gre/modules/NetworkStatsService.jsm');
   Cu.import('resource://gre/modules/ResourceStatsService.jsm');
 }
 
-Cu.import('resource://gre/modules/KillSwitchMain.jsm');
-
 // Identity
 Cu.import('resource://gre/modules/SignInToWebsite.jsm');
 SignInToWebsiteController.init();
 
 Cu.import('resource://gre/modules/FxAccountsMgmtService.jsm');
 Cu.import('resource://gre/modules/DownloadsAPI.jsm');
 Cu.import('resource://gre/modules/MobileIdentityManager.jsm');
 Cu.import('resource://gre/modules/PresentationDeviceInfoManager.jsm');
deleted file mode 100644
--- a/b2g/components/ActivitiesGlue.js
+++ /dev/null
@@ -1,91 +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;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SystemAppProxy",
-                                  "resource://gre/modules/SystemAppProxy.jsm");
-
-function ActivitiesDialog() {
-  this._id = 0;
-
-  this.activities = [];
-}
-
-ActivitiesDialog.prototype = {
-  run: function ap_run() {
-    let id = "activity-choice" + this._id++;
-    let activity = this.activities.shift();
-
-    let choices = [];
-    activity.list.forEach(function(item) {
-      choices.push({ manifest: item.manifest, icon: item.icon });
-    });
-
-
-    // Keep up the frond-end of an activity choice. The messages contains
-    // a list of {names, icons} for applications able to handle this particular
-    // activity. The front-end should display a UI to pick one.
-    let detail = {
-      type: "activity-choice",
-      id: id,
-      name: activity.name,
-      choices: choices
-    };
-
-    if (activity.type) {
-      detail.activityType = activity.type;
-    }
-
-    // Listen the resulting choice from the front-end. If there is no choice,
-    // let's return -1, which means the user has cancelled the dialog.
-    SystemAppProxy.addEventListener("mozContentEvent", function act_getChoice(evt) {
-      if (evt.detail.id != id)
-        return;
-
-      SystemAppProxy.removeEventListener("mozContentEvent", act_getChoice);
-      activity.callback.handleEvent(Ci.nsIActivityUIGlueCallback.WEBAPPS_ACTIVITY,
-                                    evt.detail.value !== undefined
-                                      ? evt.detail.value
-                                      : -1);
-    });
-
-    SystemAppProxy.dispatchEvent(detail);
-  },
-
-  chooseActivity: function ap_chooseActivity(aOptions, aActivities, aCallback) {
-    // B2G does not have an alternate activity system, make no choice and return.
-    if (aActivities.length === 0) {
-      aCallback.handleEvent(Ci.nsIActivityUIGlueCallback.WEBAPPS_ACTIVITY, -1);
-      return;
-    }
-
-    let activity = {
-      name: aOptions.name,
-      list: aActivities,
-      callback: aCallback
-    };
-
-    if (aOptions.data && aOptions.data.type) {
-      activity.type = aOptions.data.type;
-    }
-
-    this.activities.push(activity);
-    Services.tm.currentThread.dispatch(this, Ci.nsIEventTarget.DISPATCH_NORMAL);
-  },
-
-  classID: Components.ID("{3a54788b-48cc-4ab4-93d6-0d6a8ef74f8e}"),
-
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIActivityUIGlue, Ci.nsIRunnable])
-}
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ActivitiesDialog]);
-
--- a/b2g/components/B2GComponents.manifest
+++ b/b2g/components/B2GComponents.manifest
@@ -18,20 +18,16 @@ category system-update-provider MozillaP
 
 #ifdef MOZ_B2G
 # DirectoryProvider.js
 component {9181eb7c-6f87-11e1-90b1-4f59d80dd2e5} DirectoryProvider.js
 contract @mozilla.org/b2g/directory-provider;1 {9181eb7c-6f87-11e1-90b1-4f59d80dd2e5}
 category xpcom-directory-providers b2g-directory-provider @mozilla.org/b2g/directory-provider;1
 #endif
 
-# ActivitiesGlue.js
-component {3a54788b-48cc-4ab4-93d6-0d6a8ef74f8e} ActivitiesGlue.js
-contract @mozilla.org/dom/activities/ui-glue;1 {3a54788b-48cc-4ab4-93d6-0d6a8ef74f8e}
-
 # SystemMessageGlue.js
 component {2846f034-e614-11e3-93cd-74d02b97e723} SystemMessageGlue.js
 contract @mozilla.org/dom/messages/system-message-glue;1 {2846f034-e614-11e3-93cd-74d02b97e723}
 
 # ProcessGlobal.js
 component {1a94c87a-5ece-4d11-91e1-d29c29f21b28} ProcessGlobal.js
 contract @mozilla.org/b2g-process-global;1 {1a94c87a-5ece-4d11-91e1-d29c29f21b28}
 category app-startup ProcessGlobal service,@mozilla.org/b2g-process-global;1
@@ -117,11 +113,11 @@ contract @mozilla.org/app-migrator;1 {72
 # B2GPresentationDevicePrompt.js
 component {4a300c26-e99b-4018-ab9b-c48cf9bc4de1} B2GPresentationDevicePrompt.js
 contract @mozilla.org/presentation-device/prompt;1 {4a300c26-e99b-4018-ab9b-c48cf9bc4de1}
 
 # PresentationRequestUIGlue.js
 component {ccc8a839-0b64-422b-8a60-fb2af0e376d0} PresentationRequestUIGlue.js
 contract @mozilla.org/presentation/requestuiglue;1 {ccc8a839-0b64-422b-8a60-fb2af0e376d0}
 
-# KillSwitch.js
-component {b6eae5c6-971c-4772-89e5-5df626bf3f09} KillSwitch.js
-contract @mozilla.org/moz-kill-switch;1 {b6eae5c6-971c-4772-89e5-5df626bf3f09}
+# SystemMessageInternal.js
+component {70589ca5-91ac-4b9e-b839-d6a88167d714} SystemMessageInternal.js
+contract @mozilla.org/system-message-internal;1 {70589ca5-91ac-4b9e-b839-d6a88167d714}
deleted file mode 100644
--- a/b2g/components/KillSwitch.js
+++ /dev/null
@@ -1,116 +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 DEBUG = false;
-
-function debug(s) {
-  dump("-*- KillSwitch.js: " + s + "\n");
-}
-
-const {interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/DOMRequestHelper.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "Services",
-                                  "resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
-                                   "@mozilla.org/childprocessmessagemanager;1",
-                                   "nsIMessageSender");
-
-const KILLSWITCH_CID = "{b6eae5c6-971c-4772-89e5-5df626bf3f09}";
-const KILLSWITCH_CONTRACTID = "@mozilla.org/moz-kill-switch;1";
-
-const kEnableKillSwitch   = "KillSwitch:Enable";
-const kEnableKillSwitchOK = "KillSwitch:Enable:OK";
-const kEnableKillSwitchKO = "KillSwitch:Enable:KO";
-
-const kDisableKillSwitch   = "KillSwitch:Disable";
-const kDisableKillSwitchOK = "KillSwitch:Disable:OK";
-const kDisableKillSwitchKO = "KillSwitch:Disable:KO";
-
-function KillSwitch() {
-  this._window       = null;
-}
-
-KillSwitch.prototype = {
-
-  __proto__: DOMRequestIpcHelper.prototype,
-
-  init: function(aWindow) {
-    DEBUG && debug("init");
-    this._window = aWindow;
-    this.initDOMRequestHelper(this._window);
-  },
-
-  enable: function() {
-    DEBUG && debug("KillSwitch: enable");
-
-    cpmm.addMessageListener(kEnableKillSwitchOK, this);
-    cpmm.addMessageListener(kEnableKillSwitchKO, this);
-    return this.createPromise((aResolve, aReject) => {
-      cpmm.sendAsyncMessage(kEnableKillSwitch, {
-        requestID: this.getPromiseResolverId({
-          resolve: aResolve,
-          reject: aReject
-        })
-      });
-    });
-  },
-
-  disable: function() {
-    DEBUG && debug("KillSwitch: disable");
-
-    cpmm.addMessageListener(kDisableKillSwitchOK, this);
-    cpmm.addMessageListener(kDisableKillSwitchKO, this);
-    return this.createPromise((aResolve, aReject) => {
-      cpmm.sendAsyncMessage(kDisableKillSwitch, {
-        requestID: this.getPromiseResolverId({
-          resolve: aResolve,
-          reject: aReject
-        })
-      });
-    });
-  },
-
-  receiveMessage: function(message) {
-    DEBUG && debug("Received: " + message.name);
-
-    cpmm.removeMessageListener(kEnableKillSwitchOK, this);
-    cpmm.removeMessageListener(kEnableKillSwitchKO, this);
-    cpmm.removeMessageListener(kDisableKillSwitchOK, this);
-    cpmm.removeMessageListener(kDisableKillSwitchKO, this);
-
-    let req = this.takePromiseResolver(message.data.requestID);
-
-    switch (message.name) {
-      case kEnableKillSwitchKO:
-      case kDisableKillSwitchKO:
-        req.reject(false);
-        break;
-
-      case kEnableKillSwitchOK:
-      case kDisableKillSwitchOK:
-        req.resolve(true);
-        break;
-
-      default:
-        DEBUG && debug("Unrecognized message: " + message.name);
-        break;
-    }
-  },
-
-  classID : Components.ID(KILLSWITCH_CID),
-  contractID : KILLSWITCH_CONTRACTID,
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIKillSwitch,
-                                         Ci.nsIDOMGlobalPropertyInitializer,
-                                         Ci.nsIObserver,
-                                         Ci.nsIMessageListener,
-                                         Ci.nsISupportsWeakReference]),
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([KillSwitch]);
deleted file mode 100644
--- a/b2g/components/KillSwitchMain.jsm
+++ /dev/null
@@ -1,506 +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";
-
-this.EXPORTED_SYMBOLS = [ "KillSwitchMain" ];
-
-const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/AppConstants.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "settings",
-                   "@mozilla.org/settingsService;1",
-                   "nsISettingsService");
-
-XPCOMUtils.defineLazyServiceGetter(this, "ppmm",
-                   "@mozilla.org/parentprocessmessagemanager;1",
-                   "nsIMessageBroadcaster");
-
-XPCOMUtils.defineLazyGetter(this, "permMgr", function() {
-  return Cc["@mozilla.org/permissionmanager;1"]
-           .getService(Ci.nsIPermissionManager);
-});
-
-if (AppConstants.platform === "gonk") {
-  XPCOMUtils.defineLazyGetter(this, "libcutils", function () {
-    Cu.import("resource://gre/modules/systemlibs.js");
-    return libcutils;
-  });
-} else {
-  this.libcutils = null;
-}
-
-const DEBUG = false;
-
-const kEnableKillSwitch   = "KillSwitch:Enable";
-const kEnableKillSwitchOK = "KillSwitch:Enable:OK";
-const kEnableKillSwitchKO = "KillSwitch:Enable:KO";
-
-const kDisableKillSwitch   = "KillSwitch:Disable";
-const kDisableKillSwitchOK = "KillSwitch:Disable:OK";
-const kDisableKillSwitchKO = "KillSwitch:Disable:KO";
-
-const kMessages = [kEnableKillSwitch, kDisableKillSwitch];
-
-const kXpcomShutdownObserverTopic = "xpcom-shutdown";
-
-const kProperty = "persist.moz.killswitch";
-
-const kUserValues =
-  OS.Path.join(OS.Constants.Path.profileDir, "killswitch.json");
-
-var inParent = Cc["@mozilla.org/xre/app-info;1"]
-                 .getService(Ci.nsIXULRuntime)
-                 .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
-
-function debug(aStr) {
-  dump("--*-- KillSwitchMain: " + aStr + "\n");
-}
-
-this.KillSwitchMain = {
-  _ksState: null,
-  _libcutils: null,
-
-  _enabledValues: {
-    // List of settings to set to a specific value
-    settings: {
-      "debugger.remote-mode": "disabled",
-      "developer.menu.enabled": false,
-      "devtools.unrestricted": false,
-      "lockscreen.enabled": true,
-      "lockscreen.locked": true,
-      "lockscreen.lock-immediately": true,
-      "tethering.usb.enabled": false,
-      "tethering.wifi.enabled": false,
-      "ums.enabled": false
-    },
-
-    // List of preferences to set to a specific value
-    prefs: {
-      "b2g.killswitch.test": true
-    },
-
-    // List of Android properties to set to a specific value
-    properties: {
-      "persist.sys.usb.config": "none" // will change sys.usb.config and sys.usb.state
-    },
-
-    // List of Android services to control
-    services: {
-      "adbd": "stop"
-    }
-  },
-
-  init: function() {
-    DEBUG && debug("init");
-    if (libcutils) {
-      this._libcutils = libcutils;
-    }
-
-    kMessages.forEach(m => {
-      ppmm.addMessageListener(m, this);
-    });
-
-    Services.obs.addObserver(this, kXpcomShutdownObserverTopic, false);
-
-    this.readStateProperty();
-  },
-
-  uninit: function() {
-    kMessages.forEach(m => {
-      ppmm.removeMessageListener(m, this);
-    });
-
-    Services.obs.removeObserver(this, kXpcomShutdownObserverTopic);
-  },
-
-  checkLibcUtils: function() {
-    DEBUG && debug("checkLibcUtils");
-    if (!this._libcutils) {
-      debug("No proper libcutils binding, aborting.");
-      throw Cr.NS_ERROR_NO_INTERFACE;
-    }
-
-    return true;
-  },
-
-  readStateProperty: function() {
-    DEBUG && debug("readStateProperty");
-    try {
-      this.checkLibcUtils();
-    } catch (ex) {
-      return;
-    }
-
-    this._ksState =
-      this._libcutils.property_get(kProperty, "false") === "true";
-  },
-
-  writeStateProperty: function() {
-    DEBUG && debug("writeStateProperty");
-    try {
-      this.checkLibcUtils();
-    } catch (ex) {
-      return;
-    }
-
-    this._libcutils.property_set(kProperty, this._ksState.toString());
-  },
-
-  getPref(name, value) {
-    let rv = undefined;
-
-    try {
-      switch (typeof value) {
-        case "boolean":
-          rv = Services.prefs.getBoolPref(name, value);
-          break;
-
-        case "number":
-          rv = Services.prefs.getIntPref(name, value);
-          break;
-
-        case "string":
-          rv = Services.prefs.getCharPref(name, value);
-          break;
-
-        default:
-          debug("Unexpected pref type " + value);
-          break;
-      }
-    } catch (ex) {
-    }
-
-    return rv;
-  },
-
-  setPref(name, value) {
-    switch (typeof value) {
-      case "boolean":
-        Services.prefs.setBoolPref(name, value);
-        break;
-
-      case "number":
-        Services.prefs.setIntPref(name, value);
-        break;
-
-      case "string":
-        Services.prefs.setCharPref(name, value);
-        break;
-
-      default:
-        debug("Unexpected pref type " + value);
-        break;
-    }
-  },
-
-  doEnable: function() {
-    return new Promise((resolve, reject) => {
-      // Make sure that the API cannot do a new |enable()| call once the
-      // feature has been enabled, otherwise we will overwrite the user values.
-      if (this._ksState) {
-        reject(true);
-        return;
-      }
-
-      this.saveUserValues().then(() => {
-        DEBUG && debug("Toggling settings: " +
-                       JSON.stringify(this._enabledValues.settings));
-
-        let lock = settings.createLock();
-        for (let key of Object.keys(this._enabledValues.settings)) {
-          lock.set(key, this._enabledValues.settings[key], this);
-        }
-
-        DEBUG && debug("Toggling prefs: " +
-                       JSON.stringify(this._enabledValues.prefs));
-
-        for (let key of Object.keys(this._enabledValues.prefs)) {
-          this.setPref(key, this._enabledValues.prefs[key]);
-        }
-
-        DEBUG && debug("Toggling properties: " +
-                       JSON.stringify(this._enabledValues.properties));
-
-        for (let key of Object.keys(this._enabledValues.properties)) {
-          this._libcutils.property_set(key, this._enabledValues.properties[key]);
-        }
-
-        DEBUG && debug("Toggling services: " +
-                       JSON.stringify(this._enabledValues.services));
-
-        for (let key of Object.keys(this._enabledValues.services)) {
-          let value = this._enabledValues.services[key];
-          if (value !== "start" && value !== "stop") {
-            debug("Unexpected service " + key + " value:" + value);
-          }
-
-          this._libcutils.property_set("ctl." + value, key);
-        }
-
-        this._ksState = true;
-        this.writeStateProperty();
-
-        resolve(true);
-      }).catch(err => {
-        DEBUG && debug("doEnable: " + err);
-
-        reject(false);
-      });
-    });
-  },
-
-  saveUserValues: function() {
-    return new Promise((resolve, reject) => {
-      try {
-        this.checkLibcUtils();
-      } catch (ex) {
-        reject("nolibcutils");
-      }
-
-      let _userValues = {
-        settings: { },
-        prefs: { },
-        properties: { }
-      };
-
-      // Those will be sync calls
-      for (let key of Object.keys(this._enabledValues.prefs)) {
-        _userValues.prefs[key] =
-           this.getPref(key, this._enabledValues.prefs[key]);
-      }
-
-      for (let key of Object.keys(this._enabledValues.properties)) {
-        _userValues.properties[key] = this._libcutils.property_get(key);
-      }
-
-      let self = this;
-      let getCallback = {
-        handleAbort: function(m) {
-          DEBUG && debug("getCallback: handleAbort: m=" + m);
-          reject(m);
-        },
-
-        handleError: function(m) {
-          DEBUG && debug("getCallback: handleError: m=" + m);
-          reject(m);
-        },
-
-        handle: function(n, v) {
-          DEBUG && debug("getCallback: handle: n=" + n + " ; v=" + v);
-
-          if (self._pendingSettingsGet) {
-            // We have received a settings callback value for saving user data
-            let pending = self._pendingSettingsGet.indexOf(n);
-            if (pending !== -1) {
-              _userValues.settings[n] = v;
-              self._pendingSettingsGet.splice(pending, 1);
-            }
-
-            if (self._pendingSettingsGet.length === 0) {
-              delete self._pendingSettingsGet;
-              let payload = JSON.stringify(_userValues);
-              DEBUG && debug("Dumping to " + kUserValues + ": " + payload);
-              OS.File.writeAtomic(kUserValues, payload).then(
-                function writeOk() {
-                  resolve(true);
-                },
-                function writeNok(err) {
-                  reject("write error");
-                }
-              );
-            }
-          }
-        }
-      };
-
-      // For settings we have to wait all the callbacks to come back before
-      // we can resolve or reject
-      this._pendingSettingsGet = [];
-      let lock = settings.createLock();
-      for (let key of Object.keys(this._enabledValues.settings)) {
-        this._pendingSettingsGet.push(key);
-        lock.get(key, getCallback);
-      }
-    });
-  },
-
-  doDisable: function() {
-    return new Promise((resolve, reject) => {
-      this.restoreUserValues().then(() => {
-        this._ksState = false;
-        this.writeStateProperty();
-
-        resolve(true);
-      }).catch(err => {
-        DEBUG && debug("doDisable: " + err);
-
-        reject(false);
-      });
-    });
-  },
-
-  restoreUserValues: function() {
-    return new Promise((resolve, reject) => {
-      try {
-        this.checkLibcUtils();
-      } catch (ex) {
-        reject("nolibcutils");
-      }
-
-      OS.File.read(kUserValues, { encoding: "utf-8" }).then(content => {
-        let values = JSON.parse(content);
-
-        for (let key of Object.keys(values.prefs)) {
-          this.setPref(key, values.prefs[key]);
-        }
-
-        for (let key of Object.keys(values.properties)) {
-          this._libcutils.property_set(key, values.properties[key]);
-        }
-
-        let self = this;
-        let saveCallback = {
-          handleAbort: function(m) {
-            DEBUG && debug("saveCallback: handleAbort: m=" + m);
-            reject(m);
-          },
-
-          handleError: function(m) {
-            DEBUG && debug("saveCallback: handleError: m=" + m);
-            reject(m);
-          },
-
-          handle: function(n, v) {
-            DEBUG && debug("saveCallback: handle: n=" + n + " ; v=" + v);
-
-            if (self._pendingSettingsSet) {
-              // We have received a settings callback value for setting user data
-              let pending = self._pendingSettingsSet.indexOf(n);
-              if (pending !== -1) {
-                self._pendingSettingsSet.splice(pending, 1);
-              }
-
-              if (self._pendingSettingsSet.length === 0) {
-                delete self._pendingSettingsSet;
-                DEBUG && debug("Restored from " + kUserValues + ": " + JSON.stringify(values));
-                resolve(values);
-              }
-            }
-          }
-        };
-
-        // For settings we have to wait all the callbacks to come back before
-        // we can resolve or reject
-        this._pendingSettingsSet = [];
-        let lock = settings.createLock();
-        for (let key of Object.keys(values.settings)) {
-          this._pendingSettingsSet.push(key);
-          lock.set(key, values.settings[key], saveCallback);
-        }
-      }).catch(err => {
-        reject(err);
-      });
-    });
-  },
-
-  // Settings Callbacks
-  handle: function(aName, aValue) {
-    DEBUG && debug("handle: aName=" + aName + " ; aValue=" + aValue);
-    // We don't have to do anything for now.
-  },
-
-  handleAbort: function(aMessage) {
-    debug("handleAbort: " + JSON.stringify(aMessage));
-    throw Cr.NS_ERROR_ABORT;
-  },
-
-  handleError: function(aMessage) {
-    debug("handleError: " + JSON.stringify(aMessage));
-    throw Cr.NS_ERROR_FAILURE;
-  },
-
-  // addObserver
-  observe: function(aSubject, aTopic, aData) {
-    switch (aTopic) {
-      case kXpcomShutdownObserverTopic:
-        this.uninit();
-        break;
-
-      default:
-        DEBUG && debug("Wrong observer topic: " + aTopic);
-        break;
-    }
-  },
-
-  // addMessageListener
-  receiveMessage: function(aMessage) {
-    let hasPermission = aMessage.target.assertPermission("killswitch");
-    DEBUG && debug("hasPermission: " + hasPermission);
-
-    if (!hasPermission) {
-      debug("Message " + aMessage.name + " from a process with no killswitch perm.");
-      aMessage.target.killChild();
-      throw Cr.NS_ERROR_NOT_AVAILABLE;
-      return;
-    }
-
-    function returnMessage(name, data) {
-      if (aMessage.target) {
-        data.requestID = aMessage.data.requestID;
-        try {
-          aMessage.target.sendAsyncMessage(name, data);
-        } catch (e) {
-          if (DEBUG) debug("Return message failed, " + name + ": " + e);
-        }
-      }
-    }
-
-    switch (aMessage.name) {
-      case kEnableKillSwitch:
-        this.doEnable().then(
-          ()  => {
-            returnMessage(kEnableKillSwitchOK, {});
-          },
-          err => {
-            debug("doEnable failed: " + err);
-            returnMessage(kEnableKillSwitchKO, {});
-          }
-        );
-        break;
-      case kDisableKillSwitch:
-        this.doDisable().then(
-          ()  => {
-            returnMessage(kDisableKillSwitchOK, {});
-          },
-          err => {
-            debug("doDisable failed: " + err);
-            returnMessage(kDisableKillSwitchKO, {});
-          }
-        );
-        break;
-
-      default:
-        debug("Unsupported message: " + aMessage.name);
-        aMessage.target && aMessage.target.killChild();
-        throw Cr.NS_ERROR_ILLEGAL_VALUE;
-        return;
-        break;
-    }
-  }
-};
-
-// This code should ALWAYS be living only on the parent side.
-if (!inParent) {
-  debug("KillSwitchMain should only be living on parent side.");
-  throw Cr.NS_ERROR_ABORT;
-} else {
-  this.KillSwitchMain.init();
-}
deleted file mode 100644
--- a/b2g/components/PersistentDataBlock.jsm
+++ /dev/null
@@ -1,766 +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/. */
-
-/**
- * The Persistent Partition has this layout:
- *
- * Bytes:     32       4        4          <DATA_LENGTH>               1
- * Fields: [[DIGEST][MAGIC][DATA_LENGTH][        DATA        ][OEM_UNLOCK_ENABLED]]
- *
- */
-
-"use strict";
-
-const DEBUG = false;
-
-this.EXPORTED_SYMBOLS = [ "PersistentDataBlock" ];
-
-const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
-// This is a marker that will be written after digest in the partition.
-const PARTITION_MAGIC = 0x19901873;
-// This is the limit in Android because of issues with Binder if blocks are > 100k
-// We dont really have this issues because we don't use Binder, but let's stick
-// to Android implementation.
-const MAX_DATA_BLOCK_SIZE = 1024 * 100;
-const DIGEST_SIZE_BYTES = 32;
-const HEADER_SIZE_BYTES = 8;
-const PARTITION_MAGIC_SIZE_BYTES = 4;
-const DATA_SIZE_BYTES = 4;
-const OEM_UNLOCK_ENABLED_BYTES = 1;
-// The position of the Digest
-const DIGEST_OFFSET = 0;
-const XPCOM_SHUTDOWN_OBSERVER_TOPIC = "xpcom-shutdown";
-// This property will have the path to the persistent partition
-const PERSISTENT_DATA_BLOCK_PROPERTY = "ro.frp.pst";
-const OEM_UNLOCK_PROPERTY = "sys.oem_unlock_allowed";
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "Promise", "resource://gre/modules/Promise.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "AppConstants", "resource://gre/modules/AppConstants.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "libcutils", function () {
-  Cu.import("resource://gre/modules/systemlibs.js");
-  return libcutils;
-});
-
-var inParent = Cc["@mozilla.org/xre/app-info;1"]
-                 .getService(Ci.nsIXULRuntime)
-                 .processType === Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
-
-function log(str) {
-  dump("PersistentDataBlock.jsm: " + str + "\n");
-}
-
-function debug(str) {
-  DEBUG && log(str);
-}
-
-function toHexString(data) {
-  function toHexChar(charCode) {
-    return ("0" + charCode.toString(16).slice(-2));
-  }
-  let hexString = "";
-  if (typeof data === "string") {
-    hexString = Array.from(data, (c, i) => toHexChar(data.charCodeAt(i))).join("");
-  } else if (data instanceof Array) {
-    hexString = data.map(toHexChar).join("");
-  }
-  return hexString;
-}
-
-function arr2bstr(arr) {
-  let bstr = "";
-  for (let i = 0; i < arr.length; i++) {
-    bstr += String.fromCharCode(arr[i]);
-  }
-  return bstr;
-}
-
-this.PersistentDataBlock = {
-
-  /**
-   * libc funcionality. Accessed via ctypes
-   */
-   _libc: {
-      handler: null,
-      open: function() {},
-      close: function() {},
-      ioctl: function() {}
-   },
-
-  /**
-   * Component to access property_get/set functions
-   */
-  _libcutils: null,
-
-  /**
-   * The size of a device block. This is assigned by querying the kernel.
-   */
-  _blockDeviceSize: -1,
-
-  /**
-   * Data block file
-   */
-  _dataBlockFile: "",
-
-  /**
-  * Change the behavior of the class for some methods to testing mode. This will fake the return value of some
-  * methods realted to native operations with block devices.
-  */
-  _testing: false,
-
-  /*
-  * *** USE ONLY FOR TESTING ***
-  * This component will interface between Gecko and a special secure partition with no formatting, a raw partition.
-  * This interaction requires a specific partition layout structure which emulators don't have so far. So for
-  * our unit tests to pass, we need a way for some methods to behave differently. This method will change this
-  * behavior at runtime so some low-level platform-specific operations will be faked:
-  *  - Getting the size of a partition: We can use any partition to get the size, is up to the test to choose
-  *      which partition to use. But, in testing mode we use files instead of partitions, so we need to fake the
-  *      return value of this method in this case.
-  *  - Wipping a partition: This will fully remove the partition as well as it filesystem type, so we cannot
-  *      test it on any existing emulator partition. Testing mode will skip this operation.
-  *
-  * @param enabled {Bool} Set testing mode. See _testing property.
-  */
-  setTestingMode: function(enabled) {
-     this._testing = enabled || false;
-  },
-
-  /**
-  * Initialize the class.
-  *
-  */
-  init: function(mode) {
-    debug("init()");
-
-    if (libcutils) {
-      this._libcutils = libcutils;
-    }
-
-    if (!this.ctypes) {
-      Cu.import("resource://gre/modules/ctypes.jsm", this);
-    }
-
-    if (this._libc.handler === null) {
-      if (AppConstants.platform != "gonk") {
-        log("This component requires Gonk!");
-        throw Cr.NS_ERROR_ABORT;
-      }
-
-      try {
-        this._libc.handler = this.ctypes.open(this.ctypes.libraryName("c"));
-        this._libc.close = this._libc.handler.declare("close",
-                                                      this.ctypes.default_abi,
-                                                      this.ctypes.int,
-                                                      this.ctypes.int
-                                                     );
-        this._libc.open = this._libc.handler.declare("open",
-                                                     this.ctypes.default_abi,
-                                                     this.ctypes.int,
-                                                     this.ctypes.char.ptr,
-                                                     this.ctypes.int
-                                                    );
-        this._libc.ioctl = this._libc.handler.declare("ioctl",
-                                                      this.ctypes.default_abi,
-                                                      this.ctypes.int,
-                                                      this.ctypes.int,
-                                                      this.ctypes.unsigned_long,
-                                                      this.ctypes.unsigned_long.ptr);
-
-      } catch(ex) {
-        log("Unable to open libc.so: ex = " + ex);
-        throw Cr.NS_ERROR_FAILURE;
-      }
-    }
-
-    this._dataBlockFile = this._libcutils.property_get(PERSISTENT_DATA_BLOCK_PROPERTY);
-    if (this._dataBlockFile === null) {
-      log("init: ERROR: property " +  PERSISTENT_DATA_BLOCK_PROPERTY + " doesn't exist!");
-      throw Cr.NS_ERROR_FAILURE;
-    }
-
-    Services.obs.addObserver(this, XPCOM_SHUTDOWN_OBSERVER_TOPIC, false);
-  },
-
-  uninit: function() {
-    debug("uninit()");
-    this._libc.handler.close();
-    Services.obs.removeObserver(this, XPCOM_SHUTDOWN_OBSERVER_TOPIC);
-  },
-
-  _checkLibcUtils: function() {
-    debug("_checkLibcUtils");
-    if (!this._libcutils) {
-      log("No proper libcutils binding, aborting.");
-      throw Cr.NS_ERROR_NO_INTERFACE;
-    }
-
-    return true;
-  },
-
-  /**
-   * Callback mehtod for addObserver
-   */
-  observe: function(aSubject, aTopic, aData) {
-    debug("observe()");
-    switch (aTopic) {
-      case XPCOM_SHUTDOWN_OBSERVER_TOPIC:
-        this.uninit();
-        break;
-
-      default:
-        log("Wrong observer topic: " + aTopic);
-        break;
-    }
-  },
-
-  /**
-  * This method will format the persistent partition if it detects manipulation (digest calculation will fail)
-  * or if the OEM Unlock Enabled byte is set to true.
-  * We need to call this method on every boot.
-  */
-  start: function() {
-    debug("start()");
-    return this._enforceChecksumValidity().then(() => {
-      return this._formatIfOemUnlockEnabled().then(() => {
-        return Promise.resolve(true);
-      })
-    }).catch(ex => {
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Computes the digest of the entire data block.
-   * The digest is saved in the first 32 bytes of the block.
-   *
-   * @param isStoredDigestReturned {Bool} Tells the function to return the stored digest as well as the calculated.
-   *                                      True means to return stored digest and the calculated
-   *                                      False means to return just the calculated one
-   *
-   * @return Promise<digest> {Object} The calculated digest into the "calculated" property, and the stored
-   *                                  digest into the "stored" property.
-   */
-  _computeDigest: function (isStoredDigestReturned) {
-    debug("_computeDigest()");
-    let digest = {calculated: "", stored: ""};
-    let partition;
-    debug("_computeDigest: _dataBlockFile = " + this._dataBlockFile);
-    return OS.File.open(this._dataBlockFile, {existing:true, append:false, read:true}).then(_partition => {
-      partition = _partition;
-      return partition.read(DIGEST_SIZE_BYTES);
-    }).then(digestDataRead => {
-      // If storedDigest is passed as a parameter, the caller will likely compare the
-      // one is already stored in the partition with the one we are going to compute later.
-      if (isStoredDigestReturned === true) {
-        debug("_computeDigest: get stored digest from the partition");
-        digest.stored = arr2bstr(digestDataRead);
-      }
-      return partition.read();
-    }).then(data => {
-      // Calculate Digest with the data retrieved after the digest
-      let hasher = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
-      hasher.init(hasher.SHA256);
-      hasher.update(data, data.byteLength);
-      digest.calculated = hasher.finish(false);
-      debug("_computeDigest(): Digest = "  + toHexString(digest.calculated) +
-            "(" + digest.calculated.length + ")");
-      return partition.close();
-    }).then(() => {
-      return Promise.resolve(digest);
-    }).catch(ex => {
-      log("_computeDigest(): Failed to read partition: ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Returns the size of a block from the undelaying filesystem
-   *
-   * @return {Number} The size of the block
-   */
-  _getBlockDeviceSize: function() {
-    debug("_getBlockDeviceSize()");
-
-    // See _testing property
-    if (this._testing === true) {
-      debug("_getBlockDeviceSize: No real block device size in testing mode!. Returning 1024.");
-      return 1024;
-    }
-
-    if (AppConstants.platform != "gonk") {
-      log("_getBlockDeviceSize: ERROR: This feature is only supported in Gonk!");
-      return -1;
-    }
-
-    const O_READONLY = 0;
-    const O_NONBLOCK = 1 << 11;
-    /* Getting the correct values for ioctl() operations by reading the headers is not a trivial task, so
-     * the better way to get the values below is by writting a simple test aplication in C that will
-     * print the values to the output.
-     * 32bits and 64bits value for ioctl() BLKGETSIZE64 operation is different. So we will fallback in
-     * case ioctl() returns ENOTTY (22). */
-    const BLKGETSIZE64_32_BITS = 0x80041272;
-    const BLKGETSIZE64_64_BITS = 0x80081272;
-    const ENOTTY = 25;
-
-    debug("_getBlockDeviceSize: _dataBlockFile = " + this._dataBlockFile);
-    let fd = this._libc.open(this._dataBlockFile, O_READONLY | O_NONBLOCK);
-    if (fd < 0) {
-      log("_getBlockDeviceSize: couldn't open partition!: errno = " + this.ctypes.errno);
-      throw Cr.NS_ERROR_FAILURE;
-    }
-
-    let size = new this.ctypes.unsigned_long();
-    let sizeAddress = size.address();
-    let ret = this._libc.ioctl(fd, BLKGETSIZE64_32_BITS, sizeAddress);
-    if (ret < 0) {
-      if (this.ctypes.errno === ENOTTY) {
-        log("_getBlockDeviceSize: errno is ENOTTY, falling back to 64 bit version of BLKGETSIZE64...");
-        ret = this._libc.ioctl(fd, BLKGETSIZE64_64_BITS, sizeAddress);
-        if (ret < 0) {
-          this._libc.close(fd);
-          log("_getBlockDeviceSize: BLKGETSIZE64 failed again!. errno = " + this.ctypes.errno);
-          throw Cr.NS_ERROR_FAILURE;
-        }
-      } else {
-        this._libc.close(fd);
-        log("_getBlockDeviceSize: couldn't get block device size!: errno = " + this.ctypes.errno);
-        throw Cr.NS_ERROR_FAILURE;
-      }
-    }
-    this._libc.close(fd);
-    debug("_getBlockDeviceSize: size =" + size.value);
-    return size.value;
-  },
-
-  /**
-   * Sets the byte into the partition which represents the OEM Unlock Enabled feature.
-   * A value of "1" means that the user doesn't want to enable KillSwitch.
-   * The byte is the last one byte into the device block.
-   *
-   * @param isSetOemUnlockEnabled {bool} If true, sets the OEM Unlock Enabled byte to 1.
-   *                                     Otherwise, sets it to 0.
-   */
-  _doSetOemUnlockEnabled: function(isSetOemUnlockEnabled) {
-    debug("_doSetOemUnlockEnabled()");
-    let partition;
-    return OS.File.open(this._dataBlockFile, {existing:true, append:false, write:true}).then(_partition => {
-      partition = _partition;
-      return partition.setPosition(this._getBlockDeviceSize() - OEM_UNLOCK_ENABLED_BYTES, OS.File.POS_START);
-    }).then(() => {
-      return partition.write(new Uint8Array([ isSetOemUnlockEnabled === true ? 1 : 0 ]));
-    }).then(bytesWrittenLength => {
-      if (bytesWrittenLength != 1) {
-        log("_doSetOemUnlockEnabled: Error writting OEM Unlock Enabled byte!");
-        return Promise.reject();
-      }
-      return partition.close();
-    }).then(() => {
-      let oemUnlockByte = (isSetOemUnlockEnabled === true ? "1" : "0");
-      debug("_doSetOemUnlockEnabled: OEM unlock enabled written to " + oemUnlockByte);
-      this._libcutils.property_set(OEM_UNLOCK_PROPERTY, oemUnlockByte);
-      return Promise.resolve();
-    }).catch(ex => {
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Computes the digest by reading the entire block of data and write it to the digest field
-   *
-   * @return true Promise<bool> Operation succeed
-   * @return false Promise<bool> Operation failed
-   */
-  _computeAndWriteDigest: function() {
-    debug("_computeAndWriteDigest()");
-    let digest;
-    let partition;
-    return this._computeDigest().then(_digest => {
-      digest = _digest;
-      return OS.File.open(this._dataBlockFile, {write:true, existing:true, append:false});
-    }).then(_partition => {
-      partition = _partition;
-      return partition.setPosition(DIGEST_OFFSET, OS.File.POS_START);
-    }).then(() => {
-      return partition.write(new Uint8Array(Array.from(digest.calculated, (c, i) => digest.calculated.charCodeAt(i))));
-    }).then(bytesWrittenLength => {
-      if (bytesWrittenLength != DIGEST_SIZE_BYTES) {
-        log("_computeAndWriteDigest: Error writting digest to partition!. Expected: " + DIGEST_SIZE_BYTES + " Written: " + bytesWrittenLength);
-        return Promise.reject();
-      }
-      return partition.close();
-    }).then(() => {
-      debug("_computeAndWriteDigest: digest written to partition");
-      return Promise.resolve(true);
-    }).catch(ex => {
-      log("_computeAndWriteDigest: Couldn't write digest in the persistent partion. ex = " + ex );
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Formats the persistent partition if the OEM Unlock Enabled field is set to true, and
-   * write the Unlock Property accordingly.
-   *
-   * @return true Promise<bool> OEM Unlock was enabled, so the partition has been formated
-   * @return false Promise<bool> OEM Unlock was disabled, so the partition hasn't been formated
-   */
-  _formatIfOemUnlockEnabled: function () {
-    debug("_formatIfOemUnlockEnabled()");
-    return this.getOemUnlockEnabled().then(enabled => {
-      this._libcutils.property_set(OEM_UNLOCK_PROPERTY,(enabled === true ? "1" : "0"));
-      if (enabled === true) {
-        return this._formatPartition(true);
-      }
-      return Promise.resolve(false);
-    }).then(result => {
-      if (result === false) {
-        return Promise.resolve(false);
-      } else {
-        return Promise.resolve(true);
-      }
-    }).catch(ex => {
-      log("_formatIfOemUnlockEnabled: An error ocurred!. ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Formats the persistent data partition with the proper structure.
-   *
-   * @param isSetOemUnlockEnabled {bool} If true, writes a "1" in the OEM Unlock Enabled field (last
-   *                                     byte of the block). If false, writes a "0".
-   *
-   * @return Promise
-   */
-  _formatPartition: function(isSetOemUnlockEnabled) {
-    debug("_formatPartition()");
-    let partition;
-    return OS.File.open(this._dataBlockFile, {write:true, existing:true, append:false}).then(_partition => {
-      partition = _partition;
-      return partition.write(new Uint8Array(DIGEST_SIZE_BYTES));
-    }).then(bytesWrittenLength => {
-      if (bytesWrittenLength != DIGEST_SIZE_BYTES) {
-        log("_formatPartition Error writting zero-digest!. Expected: " + DIGEST_SIZE_BYTES + " Written: " + bytesWrittenLength);
-        return Promise.reject();
-      }
-      return partition.write(new Uint32Array([PARTITION_MAGIC]));
-    }).then(bytesWrittenLength => {
-       if (bytesWrittenLength != PARTITION_MAGIC_SIZE_BYTES) {
-        log("_formatPartition Error writting magic number!. Expected: " + PARTITION_MAGIC_SIZE_BYTES + " Written: " + bytesWrittenLength);
-        return Promise.reject();
-      }
-      return partition.write(new Uint8Array(DATA_SIZE_BYTES));
-    }).then(bytesWrittenLength => {
-      if (bytesWrittenLength != DATA_SIZE_BYTES) {
-        log("_formatPartition Error writting data size!. Expected: " + DATA_SIZE_BYTES + " Written: " + bytesWrittenLength);
-        return Promise.reject();
-      }
-      return partition.close();
-    }).then(() => {
-      return this._doSetOemUnlockEnabled(isSetOemUnlockEnabled);
-    }).then(() => {
-      return this._computeAndWriteDigest();
-    }).then(() => {
-      return Promise.resolve();
-    }).catch(ex => {
-      log("_formatPartition: Failed to format block device!: ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Check digest validity. If it's not valid, formats the persistent partition
-   *
-   * @return true Promise<bool> The checksum is valid so the promise is resolved to true
-   * @return false Promise<bool> The checksum is not valid, so the partition is going to be
-   *                             formatted and the OEM Unlock Enabled field written to 0 (false).
-   */
-  _enforceChecksumValidity: function() {
-    debug("_enforceChecksumValidity");
-    return this._computeDigest(true).then(digest => {
-      if (digest.stored != digest.calculated) {
-        log("_enforceChecksumValidity: Validation failed! Stored digest: " + toHexString(digest.stored) +
-            " is not the same as the calculated one: " + toHexString(digest.calculated));
-        return Promise.reject();
-      }
-      debug("_enforceChecksumValidity: Digest computation succeed.");
-      return Promise.resolve(true);
-    }).catch(ex => {
-      log("_enforceChecksumValidity: Digest computation failed: ex = " + ex);
-      log("_enforceChecksumValidity: Formatting FRP partition...");
-      return this._formatPartition(false).then(() => {
-        return Promise.resolve(false);
-      }).catch(ex => {
-        log("_enforceChecksumValidity: Error ocurred while formating the partition!: ex = " + ex);
-        return Promise.reject(ex);
-      });
-    });
-  },
-
-  /**
-   * Reads the entire data field
-   *
-   * @return bytes Promise<Uint8Array> A promise resolved with the bytes read
-   */
-  read: function() {
-    debug("read()");
-    let partition;
-    let bytes;
-    let dataSize;
-    return this.getDataFieldSize().then(_dataSize => {
-      dataSize = _dataSize;
-      return OS.File.open(this._dataBlockFile, {read:true, existing:true, append:false});
-    }).then(_partition => {
-      partition = _partition;
-      return partition.setPosition(DIGEST_SIZE_BYTES + HEADER_SIZE_BYTES, OS.File.POS_START);
-    }).then(() => {
-      return partition.read(dataSize);
-    }).then(_bytes => {
-      bytes = _bytes;
-      if (bytes.byteLength < dataSize) {
-        log("read: Failed to read entire data block. Bytes read: " + bytes.byteLength + "/" + dataSize);
-        return Promise.reject();
-      }
-      return partition.close();
-    }).then(() => {
-      return Promise.resolve(bytes);
-    }).catch(ex => {
-      log("read: Failed to read entire data block. Exception: " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Writes an entire block to the persistent partition
-   *
-   * @param data {Uint8Array}
-   *
-   * @return Promise<Number> Promise resolved to the number of bytes written.
-   */
-  write: function(data) {
-    debug("write()");
-    // Ensure that we don't overwrite digest/magic/data-length and the last byte
-    let maxBlockSize = this._getBlockDeviceSize() - (DIGEST_SIZE_BYTES + HEADER_SIZE_BYTES + 1);
-    if (data.byteLength > maxBlockSize) {
-      log("write: Couldn't write more than " + maxBlockSize + " bytes to the partition. " +
-           maxBlockSize + " bytes given.");
-      return Promise.reject();
-    }
-
-    let partition;
-    return OS.File.open(this._dataBlockFile, {write:true, existing:true, append:false}).then(_partition => {
-      let digest = new Uint8Array(DIGEST_SIZE_BYTES);
-      let magic = new Uint8Array((new Uint32Array([PARTITION_MAGIC])).buffer);
-      let dataLength = new Uint8Array((new Uint32Array([data.byteLength])).buffer);
-      let bufferToWrite = new Uint8Array(digest.byteLength + magic.byteLength + dataLength.byteLength + data.byteLength );
-      let offset = 0;
-      bufferToWrite.set(digest, offset);
-      offset += digest.byteLength;
-      bufferToWrite.set(magic, offset);
-      offset += magic.byteLength;
-      bufferToWrite.set(dataLength, offset);
-      offset += dataLength.byteLength;
-      bufferToWrite.set(data, offset);
-      partition = _partition;
-      return partition.write(bufferToWrite);
-    }).then(bytesWrittenLength => {
-      let expectedWrittenLength = DIGEST_SIZE_BYTES + HEADER_SIZE_BYTES + data.byteLength;
-      if (bytesWrittenLength != expectedWrittenLength) {
-        log("write: Error writting data to partition!: Expected: " + expectedWrittenLength + " Written: " + bytesWrittenLength);
-        return Promise.reject();
-      }
-      return partition.close();
-    }).then(() => {
-      return this._computeAndWriteDigest();
-    }).then(couldComputeAndWriteDigest => {
-      if (couldComputeAndWriteDigest === true) {
-        return Promise.resolve(data.byteLength);
-      } else {
-        log("write: Failed to compute and write the digest");
-        return Promise.reject();
-      }
-    }).catch(ex => {
-      log("write: Failed to write to the persistent partition: ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Wipes the persistent partition.
-   *
-   * @return Promise If no errors, the promise is resolved
-   */
-  wipe: function() {
-    debug("wipe()");
-
-    if (this._testing === true) {
-      log("wipe: No wipe() funcionality in testing mode");
-      return Promise.resolve();
-    }
-
-    if (AppConstants.platform != "gonk") {
-      log("wipe: ERROR: This feature is only supported in Gonk!");
-      return Promise.reject();
-    }
-
-    const O_READONLY = 0;
-    const O_RDWR = 2;
-    const O_NONBLOCK = 1 << 11;
-    // This constant value is the same under 32 and 64 bits arch.
-    const BLKSECDISCARD = 0x127D;
-    // This constant value is the same under 32 and 64 bits arch.
-    const BLKDISCARD = 0x1277;
-
-    return new Promise((resolve, reject) => {
-      let range = new this.ctypes.unsigned_long();
-      let rangeAddress = range.address();
-      let blockDeviceLength = this._getBlockDeviceSize();
-      range[0] = 0;
-      range[1] = blockDeviceLength;
-      if (range[1] === 0) {
-        log("wipe: Block device size is 0!");
-        return reject();
-      }
-      let fd = this._libc.open(this._dataBlockFile, O_RDWR);
-      if (fd < 0) {
-        log("wipe: ERROR couldn't open partition!: error = " + this.ctypes.errno);
-        return reject();
-      }
-      let ret = this._libc.ioctl(fd, BLKSECDISCARD, rangeAddress);
-      if (ret < 0) {
-        log("wipe: Something went wrong secure discarding block: errno: " + this.ctypes.errno + ": Falling back to non-secure discarding...");
-        ret = this._libc.ioctl(fd, BLKDISCARD, rangeAddress);
-        if (ret < 0) {
-          this._libc.close(fd);
-          log("wipe: CRITICAL: non-secure discarding failed too!!: errno: " + this.ctypes.errno);
-          return reject();
-        } else {
-          this._libc.close(fd);
-          log("wipe: non-secure discard used and succeed");
-          return resolve();
-        }
-      }
-      this._libc.close(fd);
-      log("wipe: secure discard succeed");
-      return resolve();
-    });
-  },
-
-  /**
-   * Set the OEM Unlock Enabled field (one byte at the end of the partition), to 1 or 0 depending on
-   * the input parameter.
-   *
-   * @param enabled {bool} If enabled, we write a 1 in the last byte of the partition.
-   *
-   * @return Promise
-   *
-   */
-  setOemUnlockEnabled: function(enabled) {
-    debug("setOemUnlockEnabled()");
-    return this._doSetOemUnlockEnabled(enabled).then(() => {
-      return this._computeAndWriteDigest();
-    }).then(() => {
-      return Promise.resolve();
-    }).catch(ex => {
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Gets the byte from the partition which represents the OEM Unlock Enabled state.
-   *
-   * @return true Promise<Bool> The user didn't activate KillSwitch.
-   * @return false Promise<Bool> The user did activate KillSwitch.
-   */
-  getOemUnlockEnabled: function() {
-    log("getOemUnlockEnabled()");
-    let ret = false;
-    let partition;
-    return OS.File.open(this._dataBlockFile, {existing:true, append:false, read:true}).then(_partition => {
-      partition = _partition;
-      return partition.setPosition(this._getBlockDeviceSize() - OEM_UNLOCK_ENABLED_BYTES, OS.File.POS_START);
-    }).then(() => {
-      return partition.read(OEM_UNLOCK_ENABLED_BYTES);
-    }).then(data => {
-      debug("getOemUnlockEnabled: OEM unlock enabled byte = '" + data[0] + "'");
-      ret = (data[0] === 1 ? true : false);
-      return partition.close();
-    }).then(() => {
-      return Promise.resolve(ret);
-    }).catch(ex => {
-      log("getOemUnlockEnabled: Error reading OEM unlock enabled byte from partition: ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Gets the size of the data block by reading the data-length field
-   *
-   * @return Promise<Number> A promise resolved to the number of bytes os the data field.
-   */
-  getDataFieldSize: function() {
-    debug("getDataFieldSize()");
-    let partition
-    let dataLength = 0;
-    return OS.File.open(this._dataBlockFile, {read:true, existing:true, append:false}).then(_partition => {
-      partition = _partition;
-      // Skip the digest field
-      return partition.setPosition(DIGEST_SIZE_BYTES, OS.File.POS_START);
-    }).then(() => {
-      // Read the Magic field
-      return partition.read(PARTITION_MAGIC_SIZE_BYTES);
-    }).then(_magic => {
-      let magic = new Uint32Array(_magic.buffer)[0];
-      if (magic === PARTITION_MAGIC) {
-        return partition.read(PARTITION_MAGIC_SIZE_BYTES);
-      } else {
-        log("getDataFieldSize: ERROR: Invalid Magic number!");
-        return Promise.reject();
-      }
-    }).then(_dataLength => {
-      if (_dataLength) {
-        dataLength = new Uint32Array(_dataLength.buffer)[0];
-      }
-      return partition.close();
-    }).then(() => {
-      if (dataLength && dataLength != 0) {
-        return Promise.resolve(dataLength);
-      } else {
-        return Promise.reject();
-      }
-    }).catch(ex => {
-      log("getDataFieldSize: Couldn't get data field size: ex = " + ex);
-      return Promise.reject(ex);
-    });
-  },
-
-  /**
-   * Gets the maximum possible size of a data field
-   *
-   * @return Promise<Number> A Promise resolved to the maximum number of bytes allowed for the data field
-   *
-   */
-  getMaximumDataBlockSize: function() {
-    debug("getMaximumDataBlockSize()");
-    return new Promise((resolve, reject) => {
-      let actualSize = this._getBlockDeviceSize() - HEADER_SIZE_BYTES - OEM_UNLOCK_ENABLED_BYTES;
-      resolve(actualSize <= MAX_DATA_BLOCK_SIZE ? actualSize : MAX_DATA_BLOCK_SIZE);
-    });
-  }
-
-};
-
-// This code should ALWAYS be living only on the parent side.
-if (!inParent) {
-  log("PersistentDataBlock should only be living on parent side.");
-  throw Cr.NS_ERROR_ABORT;
-} else {
-  this.PersistentDataBlock.init();
-}
deleted file mode 100644
--- a/b2g/components/SystemMessageGlue.js
+++ /dev/null
@@ -1,42 +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;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "SystemAppProxy",
-                                  "resource://gre/modules/SystemAppProxy.jsm");
-
-function SystemMessageGlue() {
-}
-
-SystemMessageGlue.prototype = {
-  openApp: function(aPageURL, aManifestURL, aType, aTarget, aShowApp,
-                    aOnlyShowApp, aExtra) {
-    let payload = { url: aPageURL,
-                    manifestURL: aManifestURL,
-                    isActivity: (aType == "activity"),
-                    target: aTarget,
-                    showApp: aShowApp,
-                    onlyShowApp: aOnlyShowApp,
-                    expectingSystemMessage: true,
-                    extra: aExtra };
-
-    // |SystemAppProxy| will queue "open-app" events for non-activity system
-    // messages without actually sending them until the system app is ready.
-    SystemAppProxy._sendCustomEvent("open-app", payload, (aType == "activity"));
-  },
-
-  classID: Components.ID("{2846f034-e614-11e3-93cd-74d02b97e723}"),
-
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessageGlue])
-};
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([SystemMessageGlue]);
new file mode 100644
--- /dev/null
+++ b/b2g/components/SystemMessageInternal.js
@@ -0,0 +1,64 @@
+/* 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");
+Cu.import("resource://gre/modules/SystemAppProxy.jsm");
+
+function debug(aMsg) {
+  dump("-- SystemMessageInternal " + Date.now() + " : " + aMsg + "\n");
+}
+
+// Implementation of the component used by internal users.
+
+function SystemMessageInternal() {
+}
+
+SystemMessageInternal.prototype = {
+
+  sendMessage: function(aType, aMessage, aPageURI, aManifestURI, aExtra) {
+    debug(`sendMessage ${aType} ${aMessage} ${aPageURI} ${aExtra}`);
+    SystemAppProxy._sendCustomEvent("mozSystemMessage", {
+      action: "send",
+      type: aType,
+      message: aMessage,
+      pageURI: aPageURI,
+      extra: aExtra
+    });
+    return Promise.resolve();
+  },
+
+  broadcastMessage: function(aType, aMessage, aExtra) {
+    debug(`broadcastMessage ${aType} ${aMessage} ${aExtra}`);
+    SystemAppProxy._sendCustomEvent("mozSystemMessage", {
+      action: "broadcast",
+      type: aType,
+      message: aMessage,
+      extra: aExtra
+    });
+    return Promise.resolve();
+  },
+
+  registerPage: function(aType, aPageURI, aManifestURI) {
+    SystemAppProxy._sendCustomEvent("mozSystemMessage", {
+      action: "register",
+      type: aType,
+      pageURI: aPageURI
+    });
+    debug(`registerPage ${aType} ${aPageURI} ${aManifestURI}`);
+  },
+
+  classID: Components.ID("{70589ca5-91ac-4b9e-b839-d6a88167d714}"),
+
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessagesInternal])
+}
+
+this.NSGetFactory = XPCOMUtils.generateNSGetFactory([SystemMessageInternal]);
--- a/b2g/components/moz.build
+++ b/b2g/components/moz.build
@@ -2,36 +2,34 @@
 # 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/.
 
 DIRS += ['test']
 
 EXTRA_COMPONENTS += [
-    'ActivitiesGlue.js',
     'AlertsService.js',
     'B2GAboutRedirector.js',
     'B2GAppMigrator.js',
     'B2GPresentationDevicePrompt.js',
     'BootstrapCommandLine.js',
     'ContentPermissionPrompt.js',
     'FilePicker.js',
     'FxAccountsUIGlue.js',
     'HelperAppDialog.js',
-    'KillSwitch.js',
     'MailtoProtocolHandler.js',
     'MobileIdentityUIGlue.js',
     'OMAContentHandler.js',
     'PaymentGlue.js',
     'PaymentProviderStrategy.js',
     'PresentationRequestUIGlue.js',
     'ProcessGlobal.js',
     'SmsProtocolHandler.js',
-    'SystemMessageGlue.js',
+    'SystemMessageInternal.js',
     'TelProtocolHandler.js',
     'WebappsUpdateTimer.js',
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'android':
     EXTRA_COMPONENTS += [
       'CommandLine.js',
       'OopCommandLine.js',
@@ -58,26 +56,30 @@ EXTRA_JS_MODULES += [
     'ActivityChannel.jsm',
     'AlertsHelper.jsm',
     'Bootstraper.jsm',
     'ContentRequestHelper.jsm',
     'DebuggerActors.js',
     'ErrorPage.jsm',
     'Frames.jsm',
     'FxAccountsMgmtService.jsm',
-    'KillSwitchMain.jsm',
     'LogCapture.jsm',
     'LogParser.jsm',
     'LogShake.jsm',
     'OrientationChangeHandler.jsm',
-    'PersistentDataBlock.jsm',
     'SafeMode.jsm',
     'Screenshot.jsm',
     'SignInToWebsite.jsm',
     'SystemAppProxy.jsm',
     'TelURIParser.jsm',
     'WebappsUpdater.jsm',
 ]
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk':
     EXTRA_JS_MODULES += [
       'GlobalSimulatorScreen.jsm'
     ]
+
+XPIDL_SOURCES += [
+    'nsISystemMessagesInternal.idl'
+]
+
+XPIDL_MODULE = 'gaia_chrome'
new file mode 100644
--- /dev/null
+++ b/b2g/components/nsISystemMessagesInternal.idl
@@ -0,0 +1,51 @@
+/* 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/. */
+
+#include "domstubs.idl"
+
+interface nsIURI;
+interface nsIDOMWindow;
+interface nsIMessageSender;
+
+// Implemented by the contract id @mozilla.org/system-message-internal;1
+
+[scriptable, uuid(59b6beda-f911-4d47-a296-8c81e6abcfb9)]
+interface nsISystemMessagesInternal : nsISupports
+{
+  /*
+   * Allow any internal user to send a message of a given type to a given page
+   * of an app. The message will be sent to all the registered pages of the app
+   * when |pageURI| is not specified.
+   * @param type        The type of the message to be sent.
+   * @param message     The message payload.
+   * @param pageURI     The URI of the page that will be opened. Nullable.
+   * @param manifestURI The webapp's manifest URI.
+   * @param extra       Extra opaque information that will be passed around in the observer
+   *                    notification to open the page.
+   * returns a Promise
+   */
+  nsISupports sendMessage(in DOMString type, in jsval message,
+                          in nsIURI pageURI, in nsIURI manifestURI,
+                          [optional] in jsval extra);
+
+  /*
+   * Allow any internal user to broadcast a message of a given type.
+   * The application that registers the message will be launched.
+   * @param type        The type of the message to be sent.
+   * @param message     The message payload.
+   * @param extra       Extra opaque information that will be passed around in the observer
+   *                    notification to open the page.
+   * returns a Promise
+   */
+  nsISupports broadcastMessage(in DOMString type, in jsval message,
+                               [optional] in jsval extra);
+
+  /*
+   * Registration of a page that wants to be notified of a message type.
+   * @param type          The message type.
+   * @param pageURI       The URI of the page that will be opened.
+   * @param manifestURI   The webapp's manifest URI.
+   */
+  void registerPage(in DOMString type, in nsIURI pageURI, in nsIURI manifestURI);
+};
deleted file mode 100644
--- a/b2g/components/test/mochitest/file_loadserver.js
+++ /dev/null
@@ -1,67 +0,0 @@
-var Ci = Components.interfaces;
-var Cc = Components.classes;
-var Cu = Components.utils;
-
-// Stolen from SpecialPowers, since at this point we don't know we're in a test.
-var isMainProcess = function() {
-  try {
-    return Cc["@mozilla.org/xre/app-info;1"]
-             .getService(Ci.nsIXULRuntime)
-             .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
-  } catch (e) { }
-  return true;
-};
-
-var fakeLibcUtils = {
-  _props_: {},
-  property_set: function(name, value) {
-    dump("property_set('" + name + "', '" + value+ "' [" + (typeof value) + "]);\n");
-    this._props_[name] = value;
-  },
-  property_get: function(name, defaultValue) {
-    dump("property_get('" + name + "', '" + defaultValue+ "');\n");
-    if (Object.keys(this._props_).indexOf(name) !== -1) {
-      return this._props_[name];
-    } else {
-      return defaultValue;
-    }
-  }
-};
-
-var kUserValues;
-
-function installUserValues(next) {
-  var fakeValues = {
-    settings: {
-      "lockscreen.locked": false,
-      "lockscreen.lock-immediately": false
-    },
-    prefs: {
-      "b2g.killswitch.test": false
-    },
-    properties: {
-      "dalvik.vm.heapmaxfree": "32m",
-      "dalvik.vm.isa.arm.features": "fdiv",
-      "dalvik.vm.lockprof.threshold": "5000",
-      "net.bt.name": "BTAndroid",
-      "dalvik.vm.stack-trace-file": "/data/anr/stack-traces.txt"
-    }
-  };
-
-  OS.File.writeAtomic(kUserValues,
-                      JSON.stringify(fakeValues)).then(() => {
-    next();
-  });
-}
-
-if (isMainProcess()) {
-  Cu.import("resource://gre/modules/SettingsRequestManager.jsm");
-  Cu.import("resource://gre/modules/osfile.jsm");
-  Cu.import("resource://gre/modules/KillSwitchMain.jsm");
-
-  kUserValues = OS.Path.join(OS.Constants.Path.profileDir, "killswitch.json");
-
-  installUserValues(() => {
-    KillSwitchMain._libcutils = fakeLibcUtils;
-  });
-}
deleted file mode 100644
--- a/b2g/components/test/mochitest/killswitch.js
+++ /dev/null
@@ -1,149 +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";
-
-function setupSettings(target) {
-  ok((Object.keys(initialSettingsValues).length > 0), "Has at least one setting");
-
-  Object.keys(initialSettingsValues).forEach(k => {
-    ok(Object.keys(target).indexOf(k) !== -1, "Same settings set");
-  });
-
-  var lock = navigator.mozSettings.createLock();
-  lock.set(initialSettingsValues);
-}
-
-function testSettingsInitial(next) {
-  var promises = [];
-  for (var setting in initialSettingsValues) {
-    promises.push(navigator.mozSettings.createLock().get(setting));
-  }
-
-  Promise.all(promises).then(values => {
-    values.forEach(set => {
-      var key = Object.keys(set)[0];
-      var value = set[key];
-      is(value, initialSettingsValues[key], "Value of " + key + " is initial one");
-    });
-    next();
-  });
-}
-
-function testSettingsExpected(target, next) {
-  var promises = [];
-  for (var setting in initialSettingsValues) {
-    promises.push(navigator.mozSettings.createLock().get(setting));
-  }
-
-  Promise.all(promises).then(values => {
-    values.forEach(set => {
-      var key = Object.keys(set)[0];
-      var value = set[key];
-      is(value, target[key], "Value of " + key + " is expected one");
-    });
-    next();
-  });
-}
-
-function testSetPrefValue(prefName, prefValue) {
-  switch (typeof prefValue) {
-    case "boolean":
-      SpecialPowers.setBoolPref(prefName, prefValue);
-      break;
-
-    case "number":
-      SpecialPowers.setIntPref(prefName, prefValue);
-      break;
-
-    case "string":
-      SpecialPowers.setCharPref(prefName, prefValue);
-      break;
-
-    default:
-      is(false, "Unexpected pref type");
-      break;
-  }
-}
-
-function testGetPrefValue(prefName, prefValue) {
-  var rv = undefined;
-
-  switch (typeof prefValue) {
-    case "boolean":
-      rv = SpecialPowers.getBoolPref(prefName);
-      break;
-
-    case "number":
-      rv = SpecialPowers.getIntPref(prefName);
-      break;
-
-    case "string":
-      rv = SpecialPowers.getCharPref(prefName);
-      break;
-
-    default:
-      is(false, "Unexpected pref type");
-      break;
-  }
-
-  return rv;
-}
-
-function setupPrefs(target) {
-  ok((Object.keys(initialPrefsValues).length > 0), "Has at least one pref");
-
-  Object.keys(initialPrefsValues).forEach(k => {
-    ok(Object.keys(target).indexOf(k) !== -1, "Same pref set");
-  });
-
-  Object.keys(initialPrefsValues).forEach(key => {
-    testSetPrefValue(key, initialPrefsValues[key]);
-  });
-}
-
-function testPrefsInitial() {
-  Object.keys(initialPrefsValues).forEach(key => {
-    var value = testGetPrefValue(key, initialPrefsValues[key]);
-    is(value, initialPrefsValues[key], "Value of " + key + " is initial one");
-  });
-}
-
-function testPrefsExpected(target) {
-  Object.keys(target).forEach(key => {
-    var value = testGetPrefValue(key, target[key]);
-    is(value, target[key], "Value of " + key + " is initial one");
-  });
-}
-
-function finish() {
-  SpecialPowers.removePermission("killswitch", document);
-  SimpleTest.finish();
-}
-
-function addPermissions() {
-  if (SpecialPowers.hasPermission("killswitch", document)) {
-    startTests();
-  } else {
-    var allow = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION;
-    [ "killswitch", "settings-api-read", "settings-api-write",
-      "settings-read", "settings-write", "settings-clear"
-    ].forEach(perm => {
-      SpecialPowers.addPermission(perm, allow, document);
-    });
-    window.location.reload();
-  }
-}
-
-function loadSettings() {
-  var url = SimpleTest.getTestFileURL("file_loadserver.js");
-  var script = SpecialPowers.loadChromeScript(url);
-}
-
-function addPrefs() {
-  SpecialPowers.pushPrefEnv({"set": [
-    ["dom.ignore_webidl_scope_checks", true],
-    ["dom.mozKillSwitch.enabled", true],
-  ]}, addPermissions);
-}
--- a/b2g/components/test/mochitest/mochitest.ini
+++ b/b2g/components/test/mochitest/mochitest.ini
@@ -2,18 +2,16 @@
 support-files =
   permission_handler_chrome.js
   SandboxPromptTest.html
   filepicker_path_handler_chrome.js
   screenshot_helper.js
   systemapp_helper.js
   presentation_prompt_handler_chrome.js
   presentation_ui_glue_handler_chrome.js
-  file_loadserver.js
-  killswitch.js
 
 [test_filepicker_path.html]
 skip-if = toolkit != "gonk"
 [test_permission_deny.html]
 skip-if = toolkit != "gonk"
 [test_permission_gum_remember.html]
 skip-if = true # Bug 1019572 - frequent timeouts
 [test_sandbox_permission.html]
@@ -23,11 +21,8 @@ skip-if = toolkit != "gonk"
 [test_systemapp.html]
 skip-if = toolkit != "gonk"
 [test_presentation_device_prompt.html]
 skip-if = toolkit != "gonk"
 [test_permission_visibilitychange.html]
 skip-if = toolkit != "gonk"
 [test_presentation_request_ui_glue.html]
 skip-if = toolkit != "gonk"
-[test_killswitch_basics.html]
-[test_killswitch_disable.html]
-[test_killswitch_enable.html]
deleted file mode 100644
--- a/b2g/components/test/mochitest/test_killswitch_basics.html
+++ /dev/null
@@ -1,92 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Enabling of killswitch feature</title>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js">
-  </script>
-</head>
-<body>
-<p id="display"></p>
-<div id="content" style="display: none"></div>
-<pre id="test">
-  <script type="application/javascript">
-
-  "use strict";
-
-  function testNotExposed(check) {
-    ok(!("mozKillSwitch" in navigator),
-       "mozKillSwitch not exposed in navigator: " + check);
-  }
-
-  function testIsExposed() {
-    ok(("mozKillSwitch" in navigator), "mozKillSwitch is exposed in navigator");
-    ok(("enable" in navigator.mozKillSwitch), "mozKillSwitch has |enable|");
-    ok(("disable" in navigator.mozKillSwitch), "mozKillSwitch has |disable|");
-  }
-
-  function continueTests() {
-    // Now we should have it!
-    testIsExposed();
-    finish();
-  }
-
-  function finish() {
-    SpecialPowers.removePermission("killswitch", document);
-    SimpleTest.finish();
-  }
-
-  function alreadyHasPermission() {
-    return SpecialPowers.hasPermission("killswitch", document);
-  }
-
-  function addPermission() {
-    var allow = SpecialPowers.Ci.nsIPermissionManager.ALLOW_ACTION;
-    SpecialPowers.addPermission("killswitch", allow, document);
-    window.location.reload();
-  }
-
-  function addPrefIgnoreWebIDL(next) {
-    SpecialPowers.pushPrefEnv({"set": [
-      ["dom.ignore_webidl_scope_checks", true],
-    ]}, next);
-  }
-
-  function addPrefKillSwitch(next) {
-    SpecialPowers.pushPrefEnv({"set": [
-      ["dom.mozKillSwitch.enabled", true],
-    ]}, next);
-  }
-
-  function startTests() {
-    if (alreadyHasPermission()) {
-      continueTests();
-    } else {
-      // Make sure it's not exposed
-      testNotExposed("webidl, pref, perm");
-
-      // Expose certified APIs
-      addPrefIgnoreWebIDL(() => {
-        // Still not exposed because not perm and pref
-        testNotExposed("pref, perm");
-
-        // Add the kill switch pref
-        addPrefKillSwitch(() => {
-          // Still not exposed because not perm
-          testNotExposed("perm");
-
-          // Will reload the page
-          addPermission();
-        });
-      });
-    }
-  }
-
-  SimpleTest.waitForExplicitFinish();
-
-  startTests();
-  </script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/b2g/components/test/mochitest/test_killswitch_disable.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Disabling of killswitch feature</title>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js">
-  </script>
-  <script type="application/javascript" src="killswitch.js"></script>
-</head>
-<body>
-<p id="display"></p>
-<div id="content" style="display: none"></div>
-<pre id="test">
-  <script type="application/javascript">
-
-  "use strict";
-
-  var initialSettingsValues = {
-    "lockscreen.locked": true,
-    "lockscreen.lock-immediately": true
-  };
-
-  var initialPrefsValues = {
-    "b2g.killswitch.test": true
-  };
-
-  var disabledSettingsExpected = {
-    "lockscreen.locked": false,
-    "lockscreen.lock-immediately": false
-  };
-
-  var disabledPrefsExpected = {
-    "b2g.killswitch.test": false
-  };
-
-  function testDoAction() {
-    return navigator.mozKillSwitch.disable();
-  }
-
-  function startTests() {
-    setupSettings(disabledSettingsExpected);
-    setupPrefs(initialPrefsValues);
-    testSettingsInitial(() => {
-      testPrefsInitial();
-      testDoAction().then(() => {
-        testSettingsExpected(disabledSettingsExpected, () => {
-          testPrefsExpected(disabledPrefsExpected);
-          finish();
-        });
-      }).catch(() => {
-        ok(false, "KillSwitch promise failed");
-        finish();
-      });
-    });
-  }
-
-  SimpleTest.waitForExplicitFinish();
-
-  loadSettings();
-  addPrefs();
-  </script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/b2g/components/test/mochitest/test_killswitch_enable.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <meta charset="utf-8">
-  <title>Enabling of killswitch feature</title>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js">
-  </script>
-  <script type="application/javascript" src="killswitch.js"></script>
-</head>
-<body>
-<p id="display"></p>
-<div id="content" style="display: none"></div>
-<pre id="test">
-  <script type="application/javascript">
-
-  "use strict";
-
-  var initialSettingsValues = {
-    "lockscreen.locked": false,
-    "lockscreen.lock-immediately": false
-  };
-
-  var initialPrefsValues = {
-    "b2g.killswitch.test": false
-  };
-
-  var enabledSettingsExpected = {
-    "lockscreen.locked": true,
-    "lockscreen.lock-immediately": true
-  };
-
-  var enabledPrefsExpected = {
-    "b2g.killswitch.test": true
-  };
-
-  function testDoAction() {
-    return navigator.mozKillSwitch.enable();
-  }
-
-  function startTests() {
-    setupSettings(enabledSettingsExpected);
-    setupPrefs(initialPrefsValues);
-    testSettingsInitial(() => {
-      testPrefsInitial();
-      testDoAction().then(() => {
-        testSettingsExpected(enabledSettingsExpected, () => {
-          testPrefsExpected(enabledPrefsExpected);
-          finish();
-        });
-      }).catch(() => {
-        ok(false, "KillSwitch promise failed");
-        finish();
-      });
-    });
-  }
-
-  SimpleTest.waitForExplicitFinish();
-
-  loadSettings();
-  addPrefs();
-  </script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/b2g/components/test/unit/file_killswitch.js
+++ /dev/null
@@ -1,425 +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";
-
-var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
-
-var kUserValues;
-
-function run_test() {
-  do_get_profile();
-  Cu.import("resource://gre/modules/KillSwitchMain.jsm");
-
-  check_enabledValues();
-  run_next_test();
-}
-
-function check_enabledValues() {
-  let expected = {
-    settings: {
-      "debugger.remote-mode": "disabled",
-      "developer.menu.enabled": false,
-      "devtools.unrestricted": false,
-      "lockscreen.enabled": true,
-      "lockscreen.locked": true,
-      "lockscreen.lock-immediately": true,
-      "tethering.usb.enabled": false,
-      "tethering.wifi.enabled": false,
-      "ums.enabled": false
-    },
-    prefs: {
-      "b2g.killswitch.test": true
-    },
-    properties: {
-      "persist.sys.usb.config": "none"
-    },
-    services: {
-      "adbd": "stop"
-    }
-  };
-
-  for (let key of Object.keys(KillSwitchMain._enabledValues.settings)) {
-    strictEqual(expected.settings[key],
-                KillSwitchMain._enabledValues.settings[key],
-                "setting " + key);
-  }
-
-  for (let key of Object.keys(KillSwitchMain._enabledValues.prefs)) {
-    strictEqual(expected.prefs[key],
-                KillSwitchMain._enabledValues.prefs[key],
-                "pref " + key);
-  }
-
-  for (let key of Object.keys(KillSwitchMain._enabledValues.properties)) {
-    strictEqual(expected.properties[key],
-                KillSwitchMain._enabledValues.properties[key],
-                "proprety " + key);
-  }
-
-  for (let key of Object.keys(KillSwitchMain._enabledValues.services)) {
-    strictEqual(expected.services[key],
-                KillSwitchMain._enabledValues.services[key],
-                "service " + key);
-  }
-}
-
-add_test(function test_prepareTestValues() {
-  if (("adbd" in KillSwitchMain._enabledValues.services)) {
-    strictEqual(KillSwitchMain._enabledValues.services["adbd"], "stop");
-
-    // We replace those for the test because on Gonk we will loose the control
-    KillSwitchMain._enabledValues.settings  = {
-      "lockscreen.locked": true,
-      "lockscreen.lock-immediately": true
-    };
-    KillSwitchMain._enabledValues.services   = {};
-    KillSwitchMain._enabledValues.properties = {
-      "dalvik.vm.heapmaxfree": "8m",
-      "dalvik.vm.isa.arm.features": "div",
-      "dalvik.vm.lockprof.threshold": "500",
-      "net.bt.name": "Android",
-      "dalvik.vm.stack-trace-file": "/data/anr/traces.txt"
-    }
-  }
-
-  kUserValues = OS.Path.join(OS.Constants.Path.profileDir, "killswitch.json");
-  run_next_test();
-});
-
-function reset_status() {
-  KillSwitchMain._ksState = undefined;
-  KillSwitchMain._libcutils.property_set("persist.moz.killswitch", "undefined");
-}
-
-function install_common_tests() {
-  add_test(function test_readStateProperty() {
-    KillSwitchMain._libcutils.property_set("persist.moz.killswitch", "false");
-    KillSwitchMain.readStateProperty();
-    strictEqual(KillSwitchMain._ksState, false);
-
-    KillSwitchMain._libcutils.property_set("persist.moz.killswitch", "true");
-    KillSwitchMain.readStateProperty();
-    strictEqual(KillSwitchMain._ksState, true);
-
-    run_next_test();
-  });
-
-  add_test(function test_writeStateProperty() {
-    KillSwitchMain._ksState = false;
-    KillSwitchMain.writeStateProperty();
-    let state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-    strictEqual(state, "false");
-
-    KillSwitchMain._ksState = true;
-    KillSwitchMain.writeStateProperty();
-    state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-    strictEqual(state, "true");
-
-    run_next_test();
-  });
-
-  add_test(function test_doEnable() {
-    reset_status();
-
-    let enable = KillSwitchMain.doEnable();
-    ok(enable, "should have a Promise");
-
-    enable.then(() => {
-      strictEqual(KillSwitchMain._ksState, true);
-      let state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-      strictEqual(state, "true");
-
-      run_next_test();
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_enableMessage() {
-    reset_status();
-
-    let listener = {
-      assertPermission: function() {
-        return true;
-      },
-      sendAsyncMessage: function(name, data) {
-        strictEqual(name, "KillSwitch:Enable:OK");
-        strictEqual(data.requestID, 1);
-
-        let state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-        strictEqual(state, "true");
-
-        run_next_test();
-      }
-    };
-
-    KillSwitchMain.receiveMessage({
-      name: "KillSwitch:Enable",
-      target: listener,
-      data: {
-        requestID: 1
-      }
-    });
-  });
-
-  add_test(function test_saveUserValues_prepare() {
-    reset_status();
-
-    OS.File.exists(kUserValues).then(e => {
-      if (e) {
-        OS.File.remove(kUserValues).then(() => {
-          run_next_test();
-        }).catch(err => {
-          ok(false, "should have succeeded");
-          run_next_test();
-        });
-      } else {
-        run_next_test();
-      }
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_saveUserValues() {
-    reset_status();
-
-    let expectedValues = Object.assign({}, KillSwitchMain._enabledValues);
-
-    // Reset _enabledValues so we check properly that the dumped state
-    // is the current device state
-    KillSwitchMain._enabledValues = {
-      settings: {
-        "lockscreen.locked": false,
-        "lockscreen.lock-immediately": false
-      },
-      prefs: {
-        "b2g.killswitch.test": false
-      },
-      properties: {
-        "dalvik.vm.heapmaxfree": "32m",
-        "dalvik.vm.isa.arm.features": "fdiv",
-        "dalvik.vm.lockprof.threshold": "5000",
-        "net.bt.name": "BTAndroid",
-        "dalvik.vm.stack-trace-file": "/data/anr/stack-traces.txt"
-      },
-      services: {}
-    };
-
-    KillSwitchMain.saveUserValues().then(e => {
-      ok(e, "should have succeeded");
-
-      OS.File.read(kUserValues, { encoding: "utf-8" }).then(content => {
-        let obj = JSON.parse(content);
-
-        deepEqual(obj.settings, expectedValues.settings);
-        notDeepEqual(obj.settings, KillSwitchMain._enabledValues.settings);
-
-        deepEqual(obj.prefs, expectedValues.prefs);
-        notDeepEqual(obj.prefs, KillSwitchMain._enabledValues.prefs);
-
-        deepEqual(obj.properties, expectedValues.properties);
-        notDeepEqual(obj.properties, KillSwitchMain._enabledValues.properties);
-
-        run_next_test();
-      }).catch(err => {
-        ok(false, "should have succeeded");
-        run_next_test();
-      });
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_saveUserValues_cleaup() {
-    reset_status();
-
-    OS.File.exists(kUserValues).then(e => {
-      if (e) {
-        OS.File.remove(kUserValues).then(() => {
-          ok(true, "should have had a file");
-          run_next_test();
-        }).catch(err => {
-          ok(false, "should have succeeded");
-          run_next_test();
-        });
-      } else {
-        ok(false, "should have had a file");
-        run_next_test();
-      }
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_restoreUserValues_prepare() {
-    reset_status();
-
-    let fakeValues = {
-      settings: {
-        "lockscreen.locked": false,
-        "lockscreen.lock-immediately": false
-      },
-      prefs: {
-        "b2g.killswitch.test": false
-      },
-      properties: {
-        "dalvik.vm.heapmaxfree": "32m",
-        "dalvik.vm.isa.arm.features": "fdiv",
-        "dalvik.vm.lockprof.threshold": "5000",
-        "net.bt.name": "BTAndroid",
-        "dalvik.vm.stack-trace-file": "/data/anr/stack-traces.txt"
-      }
-    };
-
-    OS.File.exists(kUserValues).then(e => {
-      if (!e) {
-        OS.File.writeAtomic(kUserValues,
-                            JSON.stringify(fakeValues)).then(() => {
-          ok(true, "success writing file");
-          run_next_test();
-        }, err => {
-          ok(false, "error writing file");
-          run_next_test();
-        });
-      } else {
-        ok(false, "file should not have been there");
-        run_next_test();
-      }
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_restoreUserValues() {
-    reset_status();
-
-    KillSwitchMain.restoreUserValues().then(e => {
-      ok(e, "should have succeeded");
-
-      strictEqual(e.settings["lockscreen.locked"], false);
-      strictEqual(e.settings["lockscreen.lock-immediately"], false);
-
-      strictEqual(e.prefs["b2g.killswitch.test"], false);
-
-      strictEqual(
-        e.properties["dalvik.vm.heapmaxfree"],
-        "32m");
-      strictEqual(
-        e.properties["dalvik.vm.isa.arm.features"],
-        "fdiv");
-      strictEqual(
-        e.properties["dalvik.vm.lockprof.threshold"],
-        "5000");
-      strictEqual(
-        e.properties["net.bt.name"],
-        "BTAndroid");
-      strictEqual(
-        e.properties["dalvik.vm.stack-trace-file"],
-        "/data/anr/stack-traces.txt");
-
-      strictEqual(
-        KillSwitchMain._libcutils.property_get("dalvik.vm.heapmaxfree"),
-        "32m");
-      strictEqual(
-        KillSwitchMain._libcutils.property_get("dalvik.vm.isa.arm.features"),
-        "fdiv");
-      strictEqual(
-        KillSwitchMain._libcutils.property_get("dalvik.vm.lockprof.threshold"),
-        "5000");
-      strictEqual(
-        KillSwitchMain._libcutils.property_get("net.bt.name"),
-        "BTAndroid");
-      strictEqual(
-        KillSwitchMain._libcutils.property_get("dalvik.vm.stack-trace-file"),
-        "/data/anr/stack-traces.txt");
-
-      run_next_test();
-    }).catch(err => {
-      ok(false, "should not have had an error");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_doDisable() {
-    reset_status();
-
-    let disable = KillSwitchMain.doDisable()
-    ok(disable, "should have a Promise");
-
-    disable.then(() => {
-      strictEqual(KillSwitchMain._ksState, false);
-      let state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-      strictEqual(state, "false");
-
-      run_next_test();
-    }).catch(err => {
-      ok(false, "should have succeeded");
-      run_next_test();
-    });
-  });
-
-  add_test(function test_disableMessage() {
-    reset_status();
-
-    let listener = {
-      assertPermission: function() {
-        return true;
-      },
-      sendAsyncMessage: function(name, data) {
-        strictEqual(name, "KillSwitch:Disable:OK");
-        strictEqual(data.requestID, 2);
-
-        let state = KillSwitchMain._libcutils.property_get("persist.moz.killswitch");
-        strictEqual(state, "false");
-
-        run_next_test();
-      }
-    };
-
-    KillSwitchMain.receiveMessage({
-      name: "KillSwitch:Disable",
-      target: listener,
-      data: {
-        requestID: 2
-      }
-    });
-  });
-
-  add_test(function test_doEnable_only_once() {
-    reset_status();
-
-    let firstEnable = KillSwitchMain.doEnable();
-    ok(firstEnable, "should have a first Promise");
-
-    firstEnable.then(() => {
-      let secondEnable = KillSwitchMain.doEnable();
-      ok(secondEnable, "should have a second Promise");
-
-      secondEnable.then(() => {
-        ok(false, "second enable should have not succeeded");
-        run_next_test();
-      }).catch(err => {
-        strictEqual(err, true, "second enable should reject(true);");
-        run_next_test();
-      });
-
-    }).catch(err => {
-      ok(false, "first enable should have succeeded");
-      run_next_test();
-    });
-  });
-}
deleted file mode 100644
--- a/b2g/components/test/unit/file_persistentdatablock.js
+++ /dev/null
@@ -1,412 +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";
-
-var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "OS", "resource://gre/modules/osfile.jsm");
-// This constants must be synced with the ones in PersistentDataBlock.jsm
-const PARTITION_MAGIC = 0x19901873;
-const DIGEST_SIZE_BYTES = 32;
-const PARTITION_MAGIC_SIZE_BYTES = 4;
-const DATA_SIZE_BYTES = 4;
-const OEM_UNLOCK_ENABLED_BYTES = 1;
-
-const CACHE_PARTITION = "/dev/block/mtdblock2";
-const PARTITION_FAKE_FILE = "/data/local/tmp/frp.test";
-const CACHE_PARTITION_SIZE = 69206016;
-
-function log(str) {
-  do_print("head_persistentdatablock: " + str + "\n");
-}
-
-function toHexString(data) {
-  function toHexChar(charCode) {
-    return ("0" + charCode.toString(16).slice(-2));
-  }
-  let hexString = "";
-  if (typeof data === "string") {
-    hexString = Array.from(data, (c, i) => toHexChar(data.charCodeAt(i))).join("");
-  } else if (data instanceof Array) {
-    hexString = data.map(toHexChar).join("");
-  }
-  return hexString;
-}
-
-function _prepareConfig(_args) {
-  let args = _args || {};
-  // This digest has been previously calculated given the data to be written later, and setting the OEM Unlocked Enabled byte
-  // to 1. If we need different values, some tests will fail because this precalculated digest won't be valid then.
-  args.digest = args.digest || new Uint8Array([0x00, 0x41, 0x7e, 0x5f, 0xe2, 0xdd, 0xaa, 0xed, 0x11, 0x90, 0x0e, 0x1d, 0x26,
-                                               0x10, 0x30, 0xbd, 0x44, 0x9e, 0xcc, 0x4b, 0x65, 0xbe, 0x2e, 0x99, 0x9f, 0x86,
-                                               0xf0, 0xfc, 0x5b, 0x33, 0x00, 0xd0]);
-  args.dataLength = args.dataLength || 6;
-  args.data = args.data || new Uint8Array(["P", "A", "S", "S", "W", "D"]);
-  args.oem = args.oem === undefined ? true : args.oem;
-  args.oemUnlockAllowed = args.oemUnlockAllowed === undefined ? true : args.oemUnlockAllowed;
-
-  log("_prepareConfig: args.digest = " + args.digest);
-  log("_prepareConfig: args.dataLength = " + args.dataLength);
-  log("_prepareConfig: args.data = " + args.data);
-  log("_prepareConfig: args.oem = " + args.oem);
-  log("_prepareConfig: args.oemUnlockAllowed = " + args.oemUnlockAllowed);
-
-  /* This function will be called after passing all native stuff tests, so we will write into a file instead of a real
-   * partition. Obviously, there are some native operations like getting the device block size or wipping, that will not
-   * work in a regular file, so we need to fake them. */
-  PersistentDataBlock._libcutils.property_set("sys.oem_unlock_allowed", args.oemUnlockAllowed === true ? "true" : "false");
-  PersistentDataBlock.setTestingMode(true);
-  PersistentDataBlock._dataBlockFile = PARTITION_FAKE_FILE;
-  // Create the test file with the same structure as the partition will be
-  let tempFile;
-  return OS.File.open(PersistentDataBlock._dataBlockFile, {write:true, append:false, truncate: true}).then(_tempFile => {
-    log("_prepareConfig: Writing DIGEST...");
-    tempFile = _tempFile;
-    return tempFile.write(args.digest);
-  }).then(bytes => {
-    log("_prepareConfig: Writing the magic: " + PARTITION_MAGIC);
-    return tempFile.write(new Uint32Array([PARTITION_MAGIC]));
-  }).then(bytes => {
-    log("_prepareConfig: Writing the length of data field");
-    return tempFile.write(new Uint32Array([args.dataLength]));
-  }).then(bytes => {
-    log("_prepareConfig: Writing the data field");
-    let data = new Uint8Array(PersistentDataBlock._getBlockDeviceSize() -
-               (DIGEST_SIZE_BYTES + PARTITION_MAGIC_SIZE_BYTES + DATA_SIZE_BYTES + OEM_UNLOCK_ENABLED_BYTES));
-    data.set(args.data);
-    return tempFile.write(data);
-  }).then(bytes => {
-    return tempFile.write(new Uint8Array([ args.oem === true ? 1 : 0 ]));
-  }).then(bytes => {
-    return tempFile.close();
-  }).then(() =>{
-    return Promise.resolve(true);
-  }).catch(ex => {
-    log("_prepareConfig: ERROR: ex = " + ex);
-    return Promise.reject(ex);
-  });
-}
-
-function utils_getByteAt(pos) {
-  let file;
-  let byte;
-  return OS.File.open(PersistentDataBlock._dataBlockFile, {read:true, existing:true, append:false}).then(_file => {
-    file = _file;
-    return file.setPosition(pos, OS.File.POS_START);
-  }).then(() => {
-    return file.read(1);
-  }).then(_byte => {
-    byte = _byte;
-    return file.close();
-  }).then(() => {
-    return Promise.resolve(byte[0]);
-  }).catch(ex => {
-    return Promise.reject(ex);
-  });
-}
-
-function utils_getHeader() {
-  let file;
-  let header = {};
-  return OS.File.open(PersistentDataBlock._dataBlockFile, {read:true, existing:true, append:false}).then(_file => {
-    file = _file;
-    return file.read(DIGEST_SIZE_BYTES);
-  }).then(digest => {
-    header.digest = digest;
-    return file.read(PARTITION_MAGIC_SIZE_BYTES);
-  }).then(magic => {
-    header.magic = magic;
-    return file.read(DATA_SIZE_BYTES);
-  }).then(dataLength => {
-    header.dataLength = dataLength;
-    return file.close();
-  }).then(() => {
-    return Promise.resolve(header);
-  }).catch(ex => {
-    return Promise.reject(ex);
-  });
-}
-
-function utils_getData() {
-  let file;
-  let data;
-  return OS.File.open(PersistentDataBlock._dataBlockFile, {read:true, existing:true, append:false}).then(_file => {
-    file = _file;
-    return file.setPosition(DIGEST_SIZE_BYTES + PARTITION_MAGIC_SIZE_BYTES, OS.File.POS_START);
-  }).then(() => {
-    return file.read(4);
-  }).then(_dataLength => {
-    let dataLength = new Uint32Array(_dataLength.buffer);
-    log("utils_getData: dataLength = " + dataLength[0]);
-    return file.read(dataLength[0]);
-  }).then(_data => {
-    data = _data;
-    return file.close();
-  }).then(() => {
-    return Promise.resolve(data);
-  }).catch(ex => {
-    return Promise.reject(ex);
-  });
-}
-
-function _installTests() {
-  // <NATIVE_TESTS> Native operation tests go first
-  add_test(function test_getBlockDeviceSize() {
-    // We will use emulator /cache partition to get it's size.
-    PersistentDataBlock._dataBlockFile = CACHE_PARTITION;
-    // Disable testing mode for this specific test because we can get the size of a real block device,
-    // but we need to flip to testing mode after this test because we use files instead of partitions
-    // and we cannot run this operation on files.
-    PersistentDataBlock.setTestingMode(false);
-    let blockSize = PersistentDataBlock._getBlockDeviceSize();
-    ok(blockSize !== CACHE_PARTITION_SIZE, "test_getBlockDeviceSize: Block device size should be greater than 0");
-    run_next_test();
-  });
-
-  add_test(function test_wipe() {
-    // Turning into testing mode again.
-    PersistentDataBlock.setTestingMode(true);
-    PersistentDataBlock.wipe().then(() => {
-      // We don't evaluate anything because in testing mode we always return ok!
-      run_next_test();
-    }).catch(ex => {
-      // ... something went really really bad if this happens.
-      ok(false, "test_wipe failed!: ex: " + ex);
-    });
-  });
-  // </NATIVE_TESTS>
-
-  add_test(function test_computeDigest() {
-    _prepareConfig().then(() => {
-      PersistentDataBlock._computeDigest().then(digest => {
-        // So in order to update this value in a future (should only happens if the partition data is changed), you just need
-        // to launch this test manually, see the result in the logs and update this constant with that value.
-        const _EXPECTED_VALUE = "0004107e05f0e20dd0aa0ed0110900e01d0260100300bd04409e0cc04b0650be02e09909f0860f00fc05b033000d0";
-        let calculatedValue = toHexString(digest.calculated);
-        strictEqual(calculatedValue, _EXPECTED_VALUE);
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_computeDigest failed!: ex: " + ex);
-      });
-    });
-  });
-
-  add_test(function test_getDataFieldSize() {
-    PersistentDataBlock.getDataFieldSize().then(dataFieldLength => {
-      log("test_getDataFieldSize: dataFieldLength is " + dataFieldLength);
-      strictEqual(dataFieldLength, 6);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_getOemUnlockedEnabled failed: ex:" + ex);
-    });
-  });
-
-  add_test(function test_setOemUnlockedEnabledToTrue() {
-    PersistentDataBlock.setOemUnlockEnabled(true).then(() => {
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      log("test_setOemUnlockedEnabledToTrue: byte = " + byte );
-      strictEqual(byte, 1);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_setOemUnlockedEnabledToTrue failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_setOemUnlockedEnabledToFalse() {
-    PersistentDataBlock.setOemUnlockEnabled(false).then(() => {
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      log("test_setOemUnlockedEnabledToFalse: byte = " + byte );
-      strictEqual(byte, 0);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_setOemUnlockedEnabledToFalse failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_getOemUnlockedEnabledWithTrue() {
-    // We first need to set the OEM Unlock Enabled byte to true so we can test
-    // the getter properly
-    PersistentDataBlock.setOemUnlockEnabled(true).then(() => {
-      return PersistentDataBlock.getOemUnlockEnabled().then(enabled => {
-        log("test_getOemUnlockedEnabledWithTrue: enabled is " + enabled);
-        ok(enabled === true, "test_getOemUnlockedEnabledWithTrue: enabled value should be true");
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_getOemUnlockedEnabledWithTrue failed: ex:" + ex);
-      });
-    }).catch(ex => {
-      ok(false, "test_getOemUnlockedEnabledWithTrue failed: An error ocurred while setting the OEM Unlock Enabled byte to true: ex:" + ex);
-    });
-  });
-
-  add_test(function test_getOemUnlockedEnabledWithFalse() {
-    // We first need to set the OEM Unlock Enabled byte to false so we can test
-    // the getter properly
-    PersistentDataBlock.setOemUnlockEnabled(false).then(() => {
-      return PersistentDataBlock.getOemUnlockEnabled().then(enabled => {
-        log("test_getOemUnlockedEnabledWithFalse: enabled is " + enabled);
-        ok(enabled === false, "test_getOemUnlockedEnabledWithFalse: enabled value should be false");
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_getOemUnlockedEnabledWithFalse failed: ex:" + ex);
-      });
-    }).catch(ex => {
-      ok(false, "test_getOemUnlockedEnabledWithFalse failed: An error ocurred while setting the OEM Unlock Enabled byte to false: ex:" + ex);
-    });
-  });
-
-  add_test(function test_computeAndWriteDigest() {
-    PersistentDataBlock._computeAndWriteDigest().then(() => {
-      return utils_getHeader();
-    }).then(header => {
-      log("test_computeAndWriteDigest: header = " + header);
-      let magicRead = new Uint32Array(header.magic.buffer);
-      let magicSupposed = new Uint32Array([PARTITION_MAGIC]);
-      strictEqual(magicRead[0], magicSupposed[0]);
-      let dataLength = new Uint32Array([header.dataLength]);
-      strictEqual(header.dataLength[0], 6);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_computeAndWriteDigest failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_formatIfOemUnlockEnabledWithTrue() {
-    _prepareConfig({oem:true}).then(() => {
-      return PersistentDataBlock._formatIfOemUnlockEnabled();
-    }).then(result => {
-      ok(result === true, "test_formatIfOemUnlockEnabledWithTrue: result should be true");
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      // Check if the OEM Unlock Enabled byte is 1
-      strictEqual(byte, 1);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_formatIfOemUnlockEnabledWithTrue failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_formatIfOemUnlockEnabledWithFalse() {
-    _prepareConfig({oem:false}).then(() => {
-      return PersistentDataBlock._formatIfOemUnlockEnabled();
-    }).then(result => {
-      log("test_formatIfOemUnlockEnabledWithFalse: result = " + result);
-      ok(result === false, "test_formatIfOemUnlockEnabledWithFalse: result should be false");
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      // Check if the OEM Unlock Enabled byte is 0
-      strictEqual(byte, 0);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_formatIfOemUnlockEnabledWithFalse failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_formatPartition() {
-    // Restore a fullfilled partition so we can check if formatting works...
-    _prepareConfig({oem:true}).then(() => {
-      return PersistentDataBlock._formatPartition(true);
-    }).then(() => {
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      // Check if the last byte is 1
-      strictEqual(byte, 1);
-      return utils_getHeader();
-    }).then(header => {
-      // The Magic number should exists in a formatted partition
-      let magicRead = new Uint32Array(header.magic.buffer);
-      let magicSupposed = new Uint32Array([PARTITION_MAGIC]);
-      strictEqual(magicRead[0], magicSupposed[0]);
-      // In a formatted partition, the digest field is always 32 bytes of zeros.
-      let digestSupposed = new Uint8Array(DIGEST_SIZE_BYTES);
-      strictEqual(header.digest.join(""), "94227253995810864198417798821014713171138121254110134189198178208133167236184116199");
-      return PersistentDataBlock._formatPartition(false);
-    }).then(() => {
-      return utils_getByteAt(PersistentDataBlock._getBlockDeviceSize() - 1);
-    }).then(byte => {
-      // In this case OEM Unlock enabled byte should be set to 0 because we passed false to the _formatPartition method before.
-      strictEqual(byte, 0);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_formatPartition failed!: ex: " + ex);
-    });
-  });
-
-  add_test(function test_enforceChecksumValidityWithValidChecksum() {
-    // We need a valid partition layout to pass this test
-    _prepareConfig().then(() => {
-      PersistentDataBlock._enforceChecksumValidity().then(() => {
-        ok(true, "test_enforceChecksumValidityWithValidChecksum passed");
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_enforceChecksumValidityWithValidChecksum failed!: ex: " + ex);
-      });
-    });
-  });
-
-  add_test(function test_enforceChecksumValidityWithInvalidChecksum() {
-    var badDigest = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05, 0x05, 0x06, 0x07,
-                                    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-                                    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-                                    0x18, 0x19, 0x1A, 0x1C, 0x1D, 0x1E, 0x1F, 0x20]);
-    // We need a valid partition layout to pass this test
-    _prepareConfig({digest: badDigest}).then(() => {
-      PersistentDataBlock._enforceChecksumValidity().then(() => {
-        return utils_getHeader();
-      }).then(header => {
-        // Check that we have a valid magic after formatting
-        let magicRead = new Uint32Array(header.magic.buffer)[0];
-        let magicSupposed = new Uint32Array([PARTITION_MAGIC])[0];
-        strictEqual(magicRead, magicSupposed);
-        // Data length field should be 0, because we formatted the partition
-        let dataLengthRead = new Uint32Array(header.dataLength.buffer)[0];
-        strictEqual(dataLengthRead, 0);
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_enforceChecksumValidityWithValidChecksum failed!: ex: " + ex);
-      });
-    });
-  });
-
-  add_test(function test_read() {
-    // Before reading, let's write some bytes of data first.
-    PersistentDataBlock.write(new Uint8Array([1,2,3,4])).then(() => {
-      PersistentDataBlock.read().then(bytes => {
-        log("test_read: bytes (in hex): " + toHexString(bytes));
-        strictEqual(bytes[0], 1);
-        strictEqual(bytes[1], 2);
-        strictEqual(bytes[2], 3);
-        strictEqual(bytes[3], 4);
-        run_next_test();
-      }).catch(ex => {
-        ok(false, "test_read failed!: ex: " + ex);
-      });
-    });
-
-  });
-
-  add_test(function test_write() {
-    let data = new Uint8Array(['1','2','3','4','5']);
-    PersistentDataBlock.write(data).then(bytesWrittenLength => {
-      log("test_write: bytesWrittenLength = " + bytesWrittenLength);
-      return utils_getData();
-    }).then(data => {
-      strictEqual(data[0], 1);
-      strictEqual(data[1], 2);
-      strictEqual(data[2], 3);
-      strictEqual(data[3], 4);
-      strictEqual(data[4], 5);
-      run_next_test();
-    }).catch(ex => {
-      ok(false, "test_write failed!: ex: " + ex);
-    });
-  });
-}
deleted file mode 100644
--- a/b2g/components/test/unit/test_killswitch.js
+++ /dev/null
@@ -1,108 +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";
-
-var {results: Cr} = Components;
-
-// Trivial test just to make sure we have no syntax error
-add_test(function test_ksm_ok() {
-  ok(KillSwitchMain, "KillSwitchMain object exists");
-
-  run_next_test();
-});
-
-var aMessageNoPerm = {
-  name: "KillSwitch:Enable",
-  target: {
-    assertPermission: function() {
-      return false;
-    },
-    killChild: function() { }
-  }
-};
-
-var aMessageWithPerm = {
-  name: "KillSwitch:Enable",
-  target: {
-    assertPermission: function() {
-      return true;
-    }
-  },
-  data: {
-    requestID: 0
-  }
-};
-
-add_test(function test_sendMessageWithoutPerm() {
-  try {
-    KillSwitchMain.receiveMessage(aMessageNoPerm);
-    ok(false, "Should have failed");
-  } catch (ex) {
-    // strictEqual(ex, Cr.NS_ERROR_NOT_AVAILABLE);
-  }
-  run_next_test();
-});
-
-add_test(function test_sendMessageWithPerm() {
-  let rv = KillSwitchMain.receiveMessage(aMessageWithPerm);
-  strictEqual(rv, undefined);
-  run_next_test();
-});
-
-var uMessage = {
-  name: "KillSwitch:WTF",
-  target: {
-    assertPermission: function() {
-      return true;
-    },
-    killChild: function() { }
-  }
-};
-
-add_test(function test_sendUnknownMessage() {
-  try {
-    KillSwitchMain.receiveMessage(uMessage);
-    ok(false, "Should have failed");
-  } catch (ex) {
-    strictEqual(ex, Cr.NS_ERROR_ILLEGAL_VALUE);
-  }
-  run_next_test();
-});
-
-var fakeLibcUtils = {
-  _props_: {},
-  property_set: function(name, value) {
-    dump("property_set('" + name + "', '" + value+ "' [" + (typeof value) + "]);\n");
-    this._props_[name] = value;
-  },
-  property_get: function(name, defaultValue) {
-    dump("property_get('" + name + "', '" + defaultValue+ "');\n");
-    if (Object.keys(this._props_).indexOf(name) !== -1) {
-      return this._props_[name];
-    } else {
-      return defaultValue;
-    }
-  }
-};
-
-add_test(function test_nolibcutils() {
-  KillSwitchMain._libcutils = null;
-  try {
-    KillSwitchMain.checkLibcUtils();
-    ok(false, "Should have failed");
-  } catch (ex) {
-    strictEqual(ex, Cr.NS_ERROR_NO_INTERFACE);
-  }
-  run_next_test();
-});
-
-add_test(function test_install_fakelibcutils() {
-  KillSwitchMain._libcutils = fakeLibcUtils;
-  let rv = KillSwitchMain.checkLibcUtils();
-  strictEqual(rv, true);
-  run_next_test();
-});
-
-install_common_tests();
deleted file mode 100644
--- a/b2g/components/test/unit/test_killswitch_gonk.js
+++ /dev/null
@@ -1,42 +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/. */
-
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "libcutils", function () {
-  Cu.import("resource://gre/modules/systemlibs.js");
-  return libcutils;
-});
-
-// Trivial test just to make sure we have no syntax error
-add_test(function test_ksm_ok() {
-  ok(KillSwitchMain, "KillSwitchMain object exists");
-
-  run_next_test();
-});
-
-add_test(function test_has_libcutils() {
-  let rv = KillSwitchMain.checkLibcUtils();
-  strictEqual(rv, true);
-  run_next_test();
-});
-
-add_test(function test_libcutils_works() {
-  KillSwitchMain._libcutils.property_set("ro.moz.ks_test", "wesh");
-  let rv_ks_get  = KillSwitchMain._libcutils.property_get("ro.moz.ks_test");
-  strictEqual(rv_ks_get, "wesh")
-  let rv_sys_get = libcutils.property_get("ro.moz.ks_test")
-  strictEqual(rv_sys_get, "wesh")
-
-  KillSwitchMain._libcutils.property_set("ro.moz.ks_test2", "123456789");
-  rv_ks_get  = KillSwitchMain._libcutils.property_get("ro.moz.ks_test2");
-  strictEqual(rv_ks_get, "123456789")
-  rv_sys_get = libcutils.property_get("ro.moz.ks_test2")
-  strictEqual(rv_sys_get, "123456789")
-
-  run_next_test();
-});
-
-install_common_tests();
deleted file mode 100644
--- a/b2g/components/test/unit/test_persistentdatablock_gonk.js
+++ /dev/null
@@ -1,21 +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/. */
-
-Cu.import("resource://gre/modules/NetUtil.jsm");
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-XPCOMUtils.defineLazyGetter(this, "libcutils", function () {
-  Cu.import("resource://gre/modules/systemlibs.js");
-  return libcutils;
-});
-
-function run_test() {
-  do_get_profile();
-  Cu.import("resource://gre/modules/PersistentDataBlock.jsm");
-  // We need to point to a valid partition for some of the tests. This is the /cache
-  // partition in the emulator (x86-KitaKat).
-  run_next_test();
-}
-
-_installTests();
--- a/b2g/components/test/unit/xpcshell.ini
+++ b/b2g/components/test/unit/xpcshell.ini
@@ -42,26 +42,8 @@ head = head_logshake_gonk.js
 skip-if = (toolkit != "gonk")
 
 [test_logshake_readLog_gonk.js]
 head = head_logshake_gonk.js
 # only run on b2g builds due to requiring b2g-specific log files to exist
 skip-if = (toolkit != "gonk")
 
 [test_aboutserviceworkers.js]
-
-[test_killswitch.js]
-head = file_killswitch.js
-skip-if = (toolkit == "gonk")
-
-[test_killswitch_gonk.js]
-head = file_killswitch.js
-# Bug 1193677: disable on B2G ICS Emulator for intermittent failures with IndexedDB
-skip-if = ((toolkit != "gonk") || (toolkit == "gonk" && debug))
-
-[test_persistentdatablock_gonk.js]
-# can be slow because of what the test does, so let's give it some more time
-# to avoid intermittents: bug 1235290
-requesttimeoutfactor = 2
-head = file_persistentdatablock.js
-skip-if = (toolkit != "gonk")
-
-
--- a/b2g/installer/package-manifest.in
+++ b/b2g/installer/package-manifest.in
@@ -619,17 +619,16 @@
 
 @RESPATH@/components/SystemMessageInternal.js
 @RESPATH@/components/SystemMessageManager.js
 @RESPATH@/components/SystemMessageCache.js
 @RESPATH@/components/SystemMessageManager.manifest
 @RESPATH@/components/HCIEventTransactionSystemMessage.manifest
 @RESPATH@/components/HCIEventTransactionSystemMessageConfigurator.js
 
-@RESPATH@/components/Activities.manifest
 @RESPATH@/components/ActivityProxy.js
 @RESPATH@/components/ActivityRequestHandler.js
 @RESPATH@/components/ActivityWrapper.js
 @RESPATH@/components/ActivityMessageConfigurator.js
 
 @RESPATH@/components/Payment.js
 @RESPATH@/components/PaymentFlowInfo.js
 @RESPATH@/components/PaymentProvider.js
@@ -869,34 +868,32 @@ bin/libfreebl_32int64_3.so
 #endif
 @RESPATH@/components/AlertsService.js
 @RESPATH@/components/ContentPermissionPrompt.js
 #ifdef MOZ_UPDATER
 @RESPATH@/components/UpdatePrompt.js
 #endif
 @RESPATH@/components/WebappsUpdateTimer.js
 @RESPATH@/components/DirectoryProvider.js
-@RESPATH@/components/ActivitiesGlue.js
 @RESPATH@/components/ProcessGlobal.js
 @RESPATH@/components/OMAContentHandler.js
 @RESPATH@/components/PaymentGlue.js
 @RESPATH@/components/PaymentProviderStrategy.js
 @RESPATH@/components/RecoveryService.js
 @RESPATH@/components/MailtoProtocolHandler.js
 @RESPATH@/components/SmsProtocolHandler.js
 @RESPATH@/components/TelProtocolHandler.js
 @RESPATH@/components/B2GAboutRedirector.js
 @RESPATH@/components/FilePicker.js
 @RESPATH@/components/HelperAppDialog.js
 @RESPATH@/components/DownloadsUI.js
 @RESPATH@/components/SystemMessageGlue.js
 @RESPATH@/components/B2GAppMigrator.js
 @RESPATH@/components/B2GPresentationDevicePrompt.js
 @RESPATH@/components/PresentationRequestUIGlue.js
-@RESPATH@/components/KillSwitch.js
 
 #ifndef MOZ_WIDGET_GONK
 @RESPATH@/components/SimulatorScreen.js
 #endif
 
 @RESPATH@/components/FxAccountsUIGlue.js
 @RESPATH@/components/services_fxaccounts.xpt
 
--- a/browser/base/content/test/general/browser_misused_characters_in_strings.js
+++ b/browser/base/content/test/general/browser_misused_characters_in_strings.js
@@ -8,20 +8,16 @@
  * As each issue is found in the whitelist, it is removed from the list. At
  * the end of the test, there is an assertion that all items have been
  * removed from the whitelist, thus ensuring there are no stale entries. */
 let gWhitelist = [{
     file: "search.properties",
     key: "searchForSomethingWith",
     type: "single-quote"
   }, {
-    file: "browser.dtd",
-    key: "social.activated.description",
-    type: "single-quote"
-  }, {
     file: "netError.dtd",
     key: "certerror.introPara",
     type: "single-quote"
   }, {
     file: "netError.dtd",
     key: "weakCryptoAdvanced.longDesc",
     type: "single-quote"
   }, {
--- a/browser/confvars.sh
+++ b/browser/confvars.sh
@@ -51,18 +51,16 @@ MOZ_APP_ID={ec8030f7-c20a-464f-9b0e-13a3
 ACCEPTED_MAR_CHANNEL_IDS=firefox-mozilla-central
 # The MAR_CHANNEL_ID must not contain the following 3 characters: ",\t "
 MAR_CHANNEL_ID=firefox-mozilla-central
 MOZ_PROFILE_MIGRATOR=1
 MOZ_APP_STATIC_INI=1
 MOZ_WEBGL_CONFORMANT=1
 # Enable navigator.mozPay
 MOZ_PAY=1
-# Enable activities. These are used for FxOS developers currently.
-MOZ_ACTIVITIES=1
 MOZ_JSDOWNLOADS=1
 MOZ_RUST_MP4PARSE=1
 
 # Enable checking that add-ons are signed by the trusted root
 MOZ_ADDON_SIGNING=1
 
 # Include the DevTools client, not just the server (which is the default)
 MOZ_DEVTOOLS=all
new file mode 100644
index 0000000000000000000000000000000000000000..89056295c8a40d876894bda76e06f2522ace5066
GIT binary patch
literal 2299
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
V%ceZTHOc@0002ovPDHLkV1h>oC|dvk
new file mode 100644
index 0000000000000000000000000000000000000000..5dc4e754a99e3b4ff093d68dd9accd6ccd827ab5
GIT binary patch
literal 3223
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
JPDHLkV1oAT2>k#6
--- a/browser/extensions/pocket/skin/osx/pocket.css
+++ b/browser/extensions/pocket/skin/osx/pocket.css
@@ -4,27 +4,16 @@
   max-width: 18px;
   margin: 0;
 }
 
 #pocket-button[cui-areatype="toolbar"][open] {
   -moz-image-region: rect(36px, 18px, 54px, 0);
 }
 
-@media (min-resolution: 1.1dppx) {
-
-  #pocket-button[cui-areatype="toolbar"] {
-    -moz-image-region: rect(0, 36px, 36px, 0);
-  }
-
-  #pocket-button[cui-areatype="toolbar"][open] {
-    -moz-image-region: rect(72px, 36px, 108px, 0);
-  }
-}
-
 @media (min-resolution: 2dppx) {
   #panelMenu_pocket,
   #menu_pocket,
   #BMB_pocket {
     list-style-image: url("chrome://pocket/content/panels/img/pocketmenuitem16@2x.png");
   }
 
   #panelMenu_pocket > .toolbarbutton-icon {
@@ -34,22 +23,18 @@
 
 @media not all and (min-resolution: 1.1dppx) {
   #pocket-button:hover:active:not([disabled="true"]):not([cui-areatype="menu-panel"]) {
     -moz-image-region: rect(18px, 18px, 36px, 0);
   }
 }
 
 @media (min-resolution: 1.1dppx) {
-  #pocket-button {
-    list-style-image: url("chrome://pocket/skin/Toolbar@2x.png");
-  }
-
-  toolbar[brighttext] #pocket-button {
-    list-style-image: url("chrome://pocket/skin/Toolbar-inverted@2x.png");
+  #pocket-button[cui-areatype="toolbar"][open] {
+    -moz-image-region: rect(72px, 36px, 108px, 0);
   }
 
   #pocket-button:hover:active:not([disabled="true"]):not([cui-areatype="menu-panel"]) {
     -moz-image-region: rect(36px, 36px, 72px, 0);
   }
 }
 
 #PanelUI-pocketView[mainview=true] > .panel-subview-body > #pocket-panel-iframe {
--- a/browser/extensions/pocket/skin/shared/pocket.css
+++ b/browser/extensions/pocket/skin/shared/pocket.css
@@ -49,13 +49,31 @@ toolbar[brighttext] #pocket-button {
 #pocket-button[cui-areatype="toolbar"] {
   -moz-image-region: rect(0, 18px, 18px, 0);
 }
 
 #pocket-button[cui-areatype="toolbar"][open] {
   -moz-image-region: rect(18px, 18px, 36px, 0);
 }
 
+@media (min-resolution: 1.1dppx) {
+  #pocket-button {
+    list-style-image: url("chrome://pocket/skin/Toolbar@2x.png");
+  }
+
+  toolbar[brighttext] #pocket-button {
+    list-style-image: url("chrome://pocket/skin/Toolbar-inverted@2x.png");
+  }
+
+  #pocket-button[cui-areatype="toolbar"] {
+    -moz-image-region: rect(0, 36px, 36px, 0px);
+  }
+
+  #pocket-button[cui-areatype="toolbar"][open] {
+    -moz-image-region: rect(36px, 36px, 72px, 0px);
+  }
+}
+
 #panelMenu_pocket,
 #menu_pocket,
 #BMB_pocket {
   list-style-image: url("chrome://pocket/content/panels/img/pocketmenuitem16.png");
 }
--- a/browser/extensions/pocket/skin/windows/pocket.css
+++ b/browser/extensions/pocket/skin/windows/pocket.css
@@ -9,26 +9,8 @@
     padding: 0;
 }
 
 @media (-moz-windows-theme: luna-silver) and (max-resolution: 1dppx) {
   #pocket-button {
     list-style-image: url(chrome://pocket/skin/toolbar-lunaSilver.png)
   }
 }
-
-@media (min-resolution: 1.1dppx) {
-  #pocket-button {
-    list-style-image: url("chrome://pocket/skin/Toolbar@2x.png");
-  }
-
-  toolbar[brighttext] #pocket-button {
-    list-style-image: url("chrome://pocket/skin/Toolbar-inverted@2x.png");
-  }
-
-  #pocket-button[cui-areatype="toolbar"] {
-    -moz-image-region: rect(0, 36px, 36px, 0px);
-  }
-
-  #pocket-button[cui-areatype="toolbar"][open] {
-    -moz-image-region: rect(36px, 36px, 72px, 0px);
-  }
-}
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -170,20 +170,16 @@
 #ifdef MOZ_WEBRTC
 @RESPATH@/components/content_webrtc.xpt
 #endif
 @RESPATH@/components/content_xslt.xpt
 @RESPATH@/components/cookie.xpt
 @RESPATH@/components/directory.xpt
 @RESPATH@/components/docshell.xpt
 @RESPATH@/components/dom.xpt
-#ifdef MOZ_ACTIVITIES
-@RESPATH@/components/dom_activities.xpt
-@RESPATH@/components/dom_messages.xpt
-#endif
 @RESPATH@/components/dom_apps.xpt
 @RESPATH@/components/dom_newapps.xpt
 @RESPATH@/components/dom_base.xpt
 @RESPATH@/components/dom_system.xpt
 #ifdef MOZ_B2G_BT
 @RESPATH@/components/dom_bluetooth.xpt
 #endif
 @RESPATH@/components/dom_canvas.xpt
@@ -532,29 +528,16 @@
 @RESPATH@/components/RemoteWebNavigation.js
 
 @RESPATH@/components/SlowScriptDebug.manifest
 @RESPATH@/components/SlowScriptDebug.js
 
 @RESPATH@/components/TVSimulatorService.js
 @RESPATH@/components/TVSimulatorService.manifest
 
-#ifdef MOZ_ACTIVITIES
-@RESPATH@/components/SystemMessageCache.js
-@RESPATH@/components/SystemMessageInternal.js
-@RESPATH@/components/SystemMessageManager.js
-@RESPATH@/components/SystemMessageManager.manifest
-
-@RESPATH@/components/Activities.manifest
-@RESPATH@/components/ActivityProxy.js
-@RESPATH@/components/ActivityRequestHandler.js
-@RESPATH@/components/ActivityWrapper.js
-@RESPATH@/components/ActivityMessageConfigurator.js
-#endif
-
 @RESPATH@/components/Payment.js
 @RESPATH@/components/PaymentFlowInfo.js
 @RESPATH@/components/Payment.manifest
 
 #ifdef MOZ_WEBRTC
 @RESPATH@/components/PeerConnection.js
 @RESPATH@/components/PeerConnection.manifest
 #endif
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -766,22 +766,18 @@ you can use these alternative items. Oth
 <!ENTITY social.toggleSidebar.label "Show sidebar">
 <!ENTITY social.toggleSidebar.accesskey "s">
 
 <!ENTITY social.addons.label "Manage Services…">
 
 <!ENTITY social.toggleNotifications.label "Show desktop notifications">
 <!ENTITY social.toggleNotifications.accesskey "n">
 
-<!ENTITY social.activated.description "Services from <label/> have been enabled. You can change your settings for services in the <label class='text-link'>Add-on Manager</label>.">
-<!ENTITY social.activated.undo.label "Oops, undo this!">
-<!ENTITY social.activated.undo.accesskey "U">
 <!ENTITY social.learnMore.label "Learn more…">
 <!ENTITY social.learnMore.accesskey "l">
-<!ENTITY social.closeNotificationItem.label "Not Now">
 
 <!ENTITY social.directory.label "Activations Directory">
 <!ENTITY social.directory.text "You can activate Share services from the directory.">
 <!ENTITY social.directory.button "Take me there!">
 <!ENTITY social.directory.introText "Click on a service to add it to &brandShortName;.">
 <!ENTITY social.directory.viewmore.text "View More">
 
 <!ENTITY customizeMode.menuAndToolbars.header2 "Additional Tools and Features">
new file mode 100644
index 0000000000000000000000000000000000000000..3472548d2a0b25c42d4e94a544501515bd120e26
GIT binary patch
literal 29489
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
new file mode 100644
index 0000000000000000000000000000000000000000..3244081c37de07da4caca84bc0b519f7cc4fd749
GIT binary patch
literal 43720
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
RxV-(6l~R<f5;qF`{{RR7PD}s*
--- a/browser/themes/linux/browser.css
+++ b/browser/themes/linux/browser.css
@@ -1775,33 +1775,16 @@ notification.pluginVulnerable > .notific
   color: #FDF3DE;
   min-width: 16px;
   text-shadow: none;
   background-image: linear-gradient(#B4211B, #8A1915);
   border-radius: 1px;
   margin-inline-end: 2px;
 }
 
-/* Social toolbar item */
-
-.social-activation-icon {
-  width: auto;
-  height: auto;
-  max-height: 64px;
-  max-width: 64px;
-}
-
-#social-activation-message {
-  max-width: 250px;
-}
-
-#social-activation-message > label {
-  margin: 0;
-}
-
 /* social toolbar provider menu */
 #social-statusarea-popup {
   margin-top: 0;
   margin-left: -12px;
   margin-right: -12px;
 }
 
 .social-statusarea-user {
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -36,17 +36,19 @@ browser.jar:
   skin/classic/browser/privatebrowsing-mask.png
   skin/classic/browser/reload-stop-go.png
   skin/classic/browser/reload-stop-go@2x.png
   skin/classic/browser/searchbar.css
   skin/classic/browser/Security-broken.png
   skin/classic/browser/setDesktopBackground.css
   skin/classic/browser/slowStartup-16.png
   skin/classic/browser/Toolbar.png
+  skin/classic/browser/Toolbar@2x.png
   skin/classic/browser/Toolbar-inverted.png
+  skin/classic/browser/Toolbar-inverted@2x.png
   skin/classic/browser/Toolbar-small.png
   skin/classic/browser/webRTC-indicator.css
 * skin/classic/browser/controlcenter/panel.css        (controlcenter/panel.css)
   skin/classic/browser/customizableui/background-noise-toolbar.png  (customizableui/background-noise-toolbar.png)
   skin/classic/browser/customizableui/customizeMode-gridTexture.png  (customizableui/customizeMode-gridTexture.png)
   skin/classic/browser/customizableui/customizeMode-separatorHorizontal.png  (customizableui/customizeMode-separatorHorizontal.png)
   skin/classic/browser/customizableui/customizeMode-separatorVertical.png  (customizableui/customizeMode-separatorVertical.png)
 * skin/classic/browser/customizableui/panelUIOverlay.css (customizableui/panelUIOverlay.css)
--- a/browser/themes/osx/browser.css
+++ b/browser/themes/osx/browser.css
@@ -3243,44 +3243,16 @@ menulist.translate-infobar-element > .me
 #developer-toolbar-toolbox-button[error-count]:before {
   color: #FDF3DE;
   min-width: 16px;
   text-shadow: none;
   background-image: linear-gradient(#B4211B, #8A1915);
   border-radius: 1px;
 }
 
-.social-activation-icon {
-  width: auto;
-  height: auto;
-  max-height: 64px;
-  max-width: 64px;
-}
-
-#social-activation-message {
-  max-width: 250px;
-}
-
-#social-activation-message > label {
-  margin: 0;
-}
-
-#social-activation-button {
-  @hudButton@
-  min-height: 0px;
-}
-
-#social-activation-button:focus {
-  @hudButtonFocused@
-}
-
-#social-activation-button:hover:active {
-  @hudButtonPressed@
-}
-
 /* === end of social toolbar button === */
 
 /* === social toolbar provider menu  === */
 
 .social-statusarea-user {
   list-style-image:url("chrome://global/skin/icons/information-32.png");
 }
 
--- a/browser/themes/shared/toolbarbuttons.inc.css
+++ b/browser/themes/shared/toolbarbuttons.inc.css
@@ -170,17 +170,16 @@ toolbar[brighttext] #bookmarks-menu-butt
 #panic-button:-moz-locale-dir(rtl) > .toolbarbutton-icon {
   transform: scaleX(-1);
 }
 
 #webide-button[cui-areatype="toolbar"] {
   -moz-image-region: rect(0, 738px, 18px, 720px);
 }
 
-%if defined(XP_WIN) || defined(XP_MACOSX)
 @media (min-resolution: 1.1dppx) {
   :-moz-any(@primaryToolbarButtons@),
   #bookmarks-menu-button > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
     list-style-image: url("chrome://browser/skin/Toolbar@2x.png");
   }
 
   toolbar[brighttext] :-moz-any(@primaryToolbarButtons@),
   toolbar[brighttext] #bookmarks-menu-button > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon {
@@ -341,9 +340,8 @@ toolbar[brighttext] #bookmarks-menu-butt
     -moz-image-region: rect(36px, 1404px, 72px, 1368px);
 %endif
   }
 
   #webide-button[cui-areatype="toolbar"] {
     -moz-image-region: rect(0, 1476px, 36px, 1440px);
   }
 }
-%endif
--- a/browser/themes/windows/browser.css
+++ b/browser/themes/windows/browser.css
@@ -2405,37 +2405,16 @@ notification.pluginVulnerable > .notific
   color: #FDF3DE;
   min-width: 16px;
   text-shadow: none;
   background-image: linear-gradient(#B4211B, #8A1915);
   border-radius: 1px;
   margin-inline-end: 5px;
 }
 
-/* Social toolbar item */
-
-#socialActivatedNotification .popup-notification-button-container {
-  margin-left: 6px;
-}
-
-.social-activation-icon {
-  width: auto;
-  height: auto;
-  max-height: 64px;
-  max-width: 64px;
-}
-
-#social-activation-message {
-  max-width: 250px;
-}
-
-#social-activation-message > label {
-  margin: 0;
-}
-
 /* social toolbar provider menu */
 .social-statusarea-popup {
   margin-top: 0;
   margin-left: -12px;
   margin-right: -12px;
 }
 
 .social-statusarea-user {
--- a/build/gecko_templates.mozbuild
+++ b/build/gecko_templates.mozbuild
@@ -50,37 +50,29 @@ def GeckoBinary(linkage='dependent', msv
 
         USE_LIBS += [
             xpcomglue,
         ]
     elif linkage != None:
         error('`linkage` must be "dependent", "standalone" or None')
 
     if mozglue:
-        if CONFIG['MOZ_CRT']:
-            if msvcrt == 'dynamic':
-                USE_LIBS += ['mozcrt']
-            elif msvcrt == 'static':
-                USE_LIBS += ['mozglue']
-            else:
-                error('`msvcrt` must be "dynamic" or "static"')
-        else:
-            LDFLAGS += CONFIG['MOZ_GLUE_WRAP_LDFLAGS']
-            if mozglue == 'program':
+        LDFLAGS += CONFIG['MOZ_GLUE_WRAP_LDFLAGS']
+        if mozglue == 'program':
+            USE_LIBS += ['mozglue']
+            if CONFIG['MOZ_GLUE_IN_PROGRAM']:
+                if CONFIG['GNU_CC']:
+                    LDFLAGS += ['-rdynamic']
+                if CONFIG['MOZ_MEMORY']:
+                    USE_LIBS += ['memory']
+        elif mozglue == 'library':
+            if not CONFIG['MOZ_GLUE_IN_PROGRAM']:
                 USE_LIBS += ['mozglue']
-                if CONFIG['MOZ_GLUE_IN_PROGRAM']:
-                    if CONFIG['GNU_CC']:
-                        LDFLAGS += ['-rdynamic']
-                    if CONFIG['MOZ_MEMORY']:
-                        USE_LIBS += ['memory']
-            elif mozglue == 'library':
-                if not CONFIG['MOZ_GLUE_IN_PROGRAM']:
-                    USE_LIBS += ['mozglue']
-            else:
-                error('`mozglue` must be "program" or "library"')
+        else:
+            error('`mozglue` must be "program" or "library"')
 
     if not CONFIG['JS_STANDALONE']:
         USE_LIBS += [
             'fallible',
         ]
 
 
 @template
--- a/build/moz.configure/toolchain.configure
+++ b/build/moz.configure/toolchain.configure
@@ -536,23 +536,22 @@ def compiler(language, host_or_target, c
 
         # If you want to bump the version check here search for
         # __cpp_static_assert above, and see the associated comment.
         if info.type == 'clang' and not info.version:
             raise FatalCheckError(
                 'Only clang/llvm 3.4 or newer is supported.')
 
         if info.type == 'msvc':
-            if info.version < '18.00.30723' or (
-                    '19' < info.version < '19.00.23506'):
+            if info.version < '19.00.23918':
                 raise FatalCheckError(
                     'This version (%s) of the MSVC compiler is not '
                     'supported.\n'
-                    'You must install Visual C++ 2013 Update 3, Visual '
-                    'C++ 2015 Update 1, or newer in order to build.\n'
+                    'You must install Visual C++ 2015 Update 2 or newer in '
+                    'order to build.\n'
                     'See https://developer.mozilla.org/en/'
                     'Windows_Build_Prerequisites' % info.version)
 
         return namespace(
             wrapper=wrapper,
             compiler=compiler,
             flags=flags,
             type=info.type,
deleted file mode 100644
--- a/build/win32/mozconfig.vs2013-win64
+++ /dev/null
@@ -1,23 +0,0 @@
-_VSPATH="/c/tools/vs2013"
-export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x86/Microsoft.VC120.CRT
-
-## includes: win8.1 sdk includes, msvc std library, directx sdk for d3d9 ##
-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/winrt:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
-
-## libs: win8.1 sdk x86 (32-bit) libs, msvc (32-bit) std library, msvc atl libs, directx sdk (32-bit) for d3d9  ##
-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/Lib/winv6.3/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/Lib/winv6.3/um/x86:${_VSPATH}/vc/lib:${_VSPATH}/vc/atlmfc/lib:/c/tools/sdks/dx10/lib
-
-## paths: win8.1 sdk x86 (32-bit) tools, msvc (64-bit compiling 32-bit) build toolchain, moz tools  ##
-export PATH="/c/Program Files (x86)/Windows Kits/8.1/bin/x86:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN/amd64_x86:${_VSPATH}/VC/BIN/amd64:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:/c/mozilla-build/moztools:${PATH}"
-
-## WindowsSDKDir ##
-export WINDOWSSDKDIR="/c/Program Files (x86)/Windows Kits/8.1/"
-
-. $topsrcdir/build/mozconfig.vs-common
-
-mk_export_correct_style LIB
-mk_export_correct_style LIBPATH
-mk_export_correct_style PATH
-mk_export_correct_style INCLUDE
-mk_export_correct_style WIN32_REDIST_DIR
deleted file mode 100644
--- a/build/win64/mozconfig.vs2013
+++ /dev/null
@@ -1,23 +0,0 @@
-_VSPATH="/c/tools/vs2013"
-export WIN32_REDIST_DIR=${_VSPATH}/VC/redist/x64/Microsoft.VC120.CRT
-
-## includes: win8.1 sdk includes, msvc std library, directx sdk for d3d9 ##
-export INCLUDE=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/shared:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/um:/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/include/winrt:${_VSPATH}/vc/include:${_VSPATH}/vc/atlmfc/include:/c/tools/sdks/dx10/include
-
-## libs: win8.1 sdk x64 (64-bit) libs, msvc (64-bit) std library, msvc atl libs, directx sdk (64-bit) for d3d9  ##
-export LIBPATH=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/Lib/winv6.3/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
-export LIB=/c/Program\ Files\ \(x86\)/Windows\ Kits/8.1/Lib/winv6.3/um/x64:${_VSPATH}/vc/lib/amd64:${_VSPATH}/vc/atlmfc/lib/amd64:/c/tools/sdks/dx10/lib/x64
-
-## paths: win8.1 sdk x64 (64-bit) tools, msvc (64-bit) build toolchain, moz tools  ##
-export PATH="/c/Program Files (x86)/Windows Kits/8.1/bin/x64:${_VSPATH}/Common7/IDE:${_VSPATH}/VC/BIN/amd64:${_VSPATH}/VC/BIN/x86_amd64:${_VSPATH}/VC/BIN:${_VSPATH}/Common7/Tools:${_VSPATH}/VC/VCPackages:${PATH}"
-
-## WindowsSDKDir ##
-export WINDOWSSDKDIR="/c/Program Files (x86)/Windows Kits/8.1/"
-
-. $topsrcdir/build/mozconfig.vs-common
-
-mk_export_correct_style LIB
-mk_export_correct_style LIBPATH
-mk_export_correct_style PATH
-mk_export_correct_style INCLUDE
-mk_export_correct_style WIN32_REDIST_DIR
--- a/config/external/nss/Makefile.in
+++ b/config/external/nss/Makefile.in
@@ -362,22 +362,17 @@ include $(topsrcdir)/config/rules.mk
 
 ifeq (1,$(ALLOW_COMPILER_WARNINGS))
 DEFAULT_GMAKE_FLAGS += NSS_ENABLE_WERROR=0
 endif
 
 # Can't pass this in DEFAULT_GMAKE_FLAGS because that overrides
 # definitions in NSS, so just export it into the sub-make's environment.
 ifeq (WINNT_1,$(OS_TARGET)_$(MOZ_MEMORY))
-ifdef MOZ_CRT
-# OS_LIBS comes from having mozcrt as a dependency in moz.build.
-DLLFLAGS := $(OS_LIBS)
-else
 DLLFLAGS := -LIBPATH:$(ABS_DIST)/../mozglue/build -DEFAULTLIB:mozglue
-endif
 export DLLFLAGS
 endif
 
 ifdef MOZ_FOLD_LIBS
 # Force the linker to include everything from the static libraries.
 EXPAND_LIBS_EXEC += --extract
 
 $(SHARED_LIBRARY): $(addprefix $(DEPTH)/security/,$(NSS_STATIC_LIBS))
--- a/config/recurse.mk
+++ b/config/recurse.mk
@@ -163,19 +163,16 @@ toolkit/library/target: widget/gtk/mozgt
 endif
 ifdef MOZ_LDAP_XPCOM
 ldap/target: config/external/nss/target mozglue/build/target
 toolkit/library/target: ldap/target
 endif
 ifeq ($(MOZ_REPLACE_MALLOC_LINKAGE),dummy library)
 mozglue/build/target memory/replace/logalloc/replay/target: memory/replace/dummy/target
 endif
-ifdef MOZ_CRT
-mozglue/crt/target: mozglue/build/target
-endif
 # js/src/target can end up invoking js/src/host rules (through object files
 # depending on jsautokw.h, which depends on host_jskwgen, and that can't
 # happen at the same time (bug #1146738)
 js/src/target: js/src/host
 endif
 # Most things are built during compile (target/host), but some things happen during export
 # Those need to depend on config/export for system wrappers.
 $(addprefix build/unix/stdc++compat/,target host) build/clang-plugin/target: config/export
deleted file mode 100644
--- a/dom/activities/Activities.manifest
+++ /dev/null
@@ -1,11 +0,0 @@
-component {ba9bd5cb-76a0-4ecf-a7b3-d2f7c43c5949} ActivityProxy.js
-contract @mozilla.org/dom/activities/proxy;1 {ba9bd5cb-76a0-4ecf-a7b3-d2f7c43c5949}
-
-component {5430d6f9-32d6-4924-ba39-6b6d1b093cd6} ActivityWrapper.js
-contract @mozilla.org/dom/system-messages/wrapper/activity;1 {5430d6f9-32d6-4924-ba39-6b6d1b093cd6}
-
-component {d2296daa-c406-4c5e-b698-e5f2c1715798} ActivityMessageConfigurator.js
-contract @mozilla.org/dom/system-messages/configurator/activity;1 {d2296daa-c406-4c5e-b698-e5f2c1715798}
-
-component {9326952a-dbe3-4d81-a51f-d9c160d96d6b} ActivityRequestHandler.js
-contract @mozilla.org/dom/activities/request-handler;1 {9326952a-dbe3-4d81-a51f-d9c160d96d6b}
deleted file mode 100644
--- a/dom/activities/ActivitiesService.jsm
+++ /dev/null
@@ -1,493 +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 Cu = Components.utils;
-const Cc = Components.classes;
-const Ci = Components.interfaces;
-
-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/AppsUtils.jsm");
-Cu.import("resource://gre/modules/AppConstants.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "DOMApplicationRegistry",
-  "resource://gre/modules/Webapps.jsm");
-
-XPCOMUtils.defineLazyModuleGetter(this, "ActivitiesServiceFilter",
-  "resource://gre/modules/ActivitiesServiceFilter.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "ppmm",
-                                   "@mozilla.org/parentprocessmessagemanager;1",
-                                   "nsIMessageBroadcaster");
-
-XPCOMUtils.defineLazyServiceGetter(this, "NetUtil",
-                                   "@mozilla.org/network/util;1",
-                                   "nsINetUtil");
-
-this.EXPORTED_SYMBOLS = [];
-
-function debug(aMsg) {
-  //dump("-- ActivitiesService.jsm " + Date.now() + " " + aMsg + "\n");
-}
-
-const DB_NAME    = "activities";
-const DB_VERSION = 2;
-const STORE_NAME = "activities";
-
-function ActivitiesDb() {
-
-}
-
-ActivitiesDb.prototype = {
-  __proto__: IndexedDBHelper.prototype,
-
-  init: function actdb_init() {
-    this.initDBHelper(DB_NAME, DB_VERSION, [STORE_NAME]);
-  },
-
-  /**
-   * Create the initial database schema.
-   *
-   * The schema of records stored is as follows:
-   *
-   * {
-   *  id:                  String
-   *  manifest:            String
-   *  name:                String
-   *  icon:                String
-   *  description:         jsval
-   * }
-   */
-  upgradeSchema: function actdb_upgradeSchema(aTransaction, aDb, aOldVersion, aNewVersion) {
-    debug("Upgrade schema " + aOldVersion + " -> " + aNewVersion);
-
-    let self = this;
-
-    /**
-     * WARNING!! Before upgrading the Activities DB take into account that an
-     * OTA unregisters all the activities and reinstalls them during the first
-     * run process. Check Bug 1193503.
-     */
-
-    function upgrade(currentVersion) {
-      let next = upgrade.bind(self, currentVersion + 1);
-      switch (currentVersion) {
-        case 0:
-          self.createSchema(aDb, next);
-          break;
-      }
-    }
-
-    upgrade(aOldVersion);
-  },
-
-  createSchema: function(aDb, aNext) {
-    let objectStore = aDb.createObjectStore(STORE_NAME, { keyPath: "id" });
-
-    // indexes
-    objectStore.createIndex("name", "name", { unique: false });
-    objectStore.createIndex("manifest", "manifest", { unique: false });
-
-    debug("Created object stores and indexes");
-
-    aNext();
-  },
-
-  // unique ids made of (uri, action)
-  createId: function actdb_createId(aObject) {
-    let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
-                      .createInstance(Ci.nsIScriptableUnicodeConverter);
-    converter.charset = "UTF-8";
-
-    let hasher = Cc["@mozilla.org/security/hash;1"]
-                   .createInstance(Ci.nsICryptoHash);
-    hasher.init(hasher.SHA1);
-
-    // add uri and action to the hash
-    ["manifest", "name", "description"].forEach(function(aProp) {
-      if (!aObject[aProp]) {
-        return;
-      }
-
-      let property = aObject[aProp];
-      if (aProp == "description") {
-        property = JSON.stringify(aObject[aProp]);
-      }
-
-      let data = converter.convertToByteArray(property, {});
-      hasher.update(data, data.length);
-    });
-
-    return hasher.finish(true);
-  },
-
-  // Add all the activities carried in the |aObjects| array.
-  add: function actdb_add(aObjects, aSuccess, aError) {
-    this.newTxn("readwrite", STORE_NAME, function (txn, store) {
-      aObjects.forEach(function (aObject) {
-        let object = {
-          manifest: aObject.manifest,
-          name: aObject.name,
-          icon: aObject.icon || "",
-          description: aObject.description
-        };
-        object.id = this.createId(object);
-        debug("Going to add " + JSON.stringify(object));
-        store.put(object);
-      }, this);
-    }.bind(this), aSuccess, aError);
-  },
-
-  // Remove all the activities carried in the |aObjects| array.
-  remove: function actdb_remove(aObjects) {
-    this.newTxn("readwrite", STORE_NAME, (txn, store) => {
-      aObjects.forEach((aObject) => {
-        let object = {
-          manifest: aObject.manifest,
-          name: aObject.name,
-          description: aObject.description
-        };
-        debug("Going to remove " + JSON.stringify(object));
-        store.delete(this.createId(object));
-      });
-    }, function() {}, function() {});
-  },
-
-  // Remove all activities associated with the given |aManifest| URL.
-  removeAll: function actdb_removeAll(aManifest) {
-    this.newTxn("readwrite", STORE_NAME, function (txn, store) {
-      let index = store.index("manifest");
-      let request = index.mozGetAll(aManifest);
-      request.onsuccess = function manifestActivities(aEvent) {
-        aEvent.target.result.forEach(function(result) {
-          debug('Removing activity: ' + JSON.stringify(result));
-          store.delete(result.id);
-        });
-      };
-    });
-  },
-
-  find: function actdb_find(aObject, aSuccess, aError, aMatch) {
-    debug("Looking for " + aObject.options.name);
-
-    this.newTxn("readonly", STORE_NAME, function (txn, store) {
-      let index = store.index("name");
-      let request = index.mozGetAll(aObject.options.name);
-      request.onsuccess = function findSuccess(aEvent) {
-        debug("Request successful. Record count: " + aEvent.target.result.length);
-        if (!txn.result) {
-          txn.result = {
-            name: aObject.options.name,
-            options: []
-          };
-        }
-
-        aEvent.target.result.forEach(function(result) {
-          if (!aMatch(result))
-            return;
-
-          txn.result.options.push({
-            manifest: result.manifest,
-            icon: result.icon,
-            description: result.description
-          });
-        });
-      }
-    }.bind(this), aSuccess, aError);
-  }
-}
-
-var Activities = {
-  messages: [
-    // ActivityProxy.js
-    "Activity:Start",
-
-    // ActivityWrapper.js
-    "Activity:Ready",
-
-    // ActivityRequestHandler.js
-    "Activity:PostResult",
-    "Activity:PostError",
-
-    "Activities:Register",
-    "Activities:Unregister",
-    "Activities:UnregisterAll",
-    "Activities:GetContentTypes",
-
-    "child-process-shutdown"
-  ],
-
-  init: function activities_init() {
-    this.messages.forEach(function(msgName) {
-      ppmm.addMessageListener(msgName, this);
-    }, this);
-
-    Services.obs.addObserver(this, "xpcom-shutdown", false);
-
-    this.db = new ActivitiesDb();
-    this.db.init();
-    this.callers = {};
-  },
-
-  observe: function activities_observe(aSubject, aTopic, aData) {
-    this.messages.forEach(function(msgName) {
-      ppmm.removeMessageListener(msgName, this);
-    }, this);
-    ppmm = null;
-
-    if (this.db) {
-      this.db.close();
-      this.db = null;
-    }
-
-    Services.obs.removeObserver(this, "xpcom-shutdown");
-  },
-
-  /**
-    * Starts an activity by doing:
-    * - finds a list of matching activities.
-    * - calls the UI glue to get the user choice.
-    * - fire an system message of type "activity" to this app, sending the
-    *   activity data as a payload.
-    */
-  startActivity: function activities_startActivity(aMsg) {
-    debug("StartActivity: " + JSON.stringify(aMsg));
-
-    let self = this;
-    let successCb = function successCb(aResults) {
-      debug(JSON.stringify(aResults));
-
-      function getActivityChoice(aResultType, aResult) {
-        switch(aResultType) {
-          case Ci.nsIActivityUIGlueCallback.NATIVE_ACTIVITY: {
-            self.callers[aMsg.id].mm.sendAsyncMessage("Activity:FireSuccess", {
-              "id": aMsg.id,
-              "result": aResult
-            });
-            break;
-          }
-          case Ci.nsIActivityUIGlueCallback.WEBAPPS_ACTIVITY: {
-            debug("Activity choice: " + aResult);
-
-            // We have no matching activity registered, let's fire an error.
-            // Don't do this check until we have passed to UIGlue so the glue
-            // can choose to launch its own activity if needed.
-            if (aResults.options.length === 0) {
-                self.trySendAndCleanup(aMsg.id, "Activity:FireError", {
-                  "id": aMsg.id,
-                  "error": "NO_PROVIDER"
-                });
-              return;
-            }
-
-            // The user has cancelled the choice, fire an error.
-            if (aResult === -1) {
-              self.trySendAndCleanup(aMsg.id, "Activity:FireError", {
-                "id": aMsg.id,
-                "error": "ActivityCanceled"
-              });
-              return;
-            }
-
-            let sysmm = Cc["@mozilla.org/system-message-internal;1"]
-                          .getService(Ci.nsISystemMessagesInternal);
-            if (!sysmm) {
-              // System message is not present, what should we do?
-              self.removeCaller(aMsg.id);
-              return;
-            }
-
-            debug("Sending system message...");
-            let result = aResults.options[aResult];
-            sysmm.sendMessage("activity", {
-                "id": aMsg.id,
-                "payload": aMsg.options,
-                "target": result.description
-              },
-              Services.io.newURI(result.description.href, null, null),
-              Services.io.newURI(result.manifest, null, null),
-              {
-                "manifestURL": self.callers[aMsg.id].manifestURL,
-                "pageURL": self.callers[aMsg.id].pageURL
-              });
-
-            if (!result.description.returnValue) {
-              // No need to notify observers, since we don't want the caller
-              // to be raised on the foreground that quick.
-              self.trySendAndCleanup(aMsg.id, "Activity:FireSuccess", {
-                "id": aMsg.id,
-                "result": null
-              });
-            }
-            break;
-          }
-        }
-      };
-
-      let caller = Activities.callers[aMsg.id];
-      if (aMsg.getFilterResults === true &&
-          caller.mm.assertAppHasStatus(Ci.nsIPrincipal.APP_STATUS_CERTIFIED)) {
-        // Certified apps can ask to just get the picker data.
-
-        // We want to return the manifest url, icon url and app name.
-        // The app name needs to be picked up from the localized manifest.
-        let reg = DOMApplicationRegistry;
-        let ids = aResults.options.map((aItem) => {
-          return { id: reg._appIdForManifestURL(aItem.manifest) }
-        });
-
-        reg._readManifests(ids).then((aManifests) => {
-          let results = [];
-          aManifests.forEach((aManifest, i) => {
-            let manifestURL = aResults.options[i].manifest;
-            // Not passing the origin is fine here since we only need
-            // helper.name which doesn't rely on url resolution.
-            let helper =
-              new ManifestHelper(aManifest.manifest, manifestURL, manifestURL);
-            results.push({
-              manifestURL: manifestURL,
-              iconURL: aResults.options[i].icon,
-              appName: helper.name
-            });
-          });
-
-          // Now fire success with the array of choices.
-          caller.mm.sendAsyncMessage("Activity:FireSuccess",
-            {
-              "id": aMsg.id,
-              "result": results
-            });
-          self.removeCaller(aMsg.id);
-        });
-      } else {
-        let glue = Cc["@mozilla.org/dom/activities/ui-glue;1"]
-                     .createInstance(Ci.nsIActivityUIGlue);
-        glue.chooseActivity(aMsg.options, aResults.options, getActivityChoice);
-      }
-    };
-
-    let errorCb = function errorCb(aError) {
-      // Something unexpected happened. Should we send an error back?
-      debug("Error in startActivity: " + aError + "\n");
-    };
-
-    let matchFunc = function matchFunc(aResult) {
-      // If the activity is in the developer mode activity list, only let the
-      // system app be a provider.
-      let isSystemApp = false;
-      let isDevModeActivity = false;
-      try {
-        isSystemApp =
-          aResult.manifest == Services.prefs.getCharPref("b2g.system_manifest_url");
-        isDevModeActivity =
-          Services.prefs.getCharPref("dom.activities.developer_mode_only")
-                        .split(",").indexOf(aMsg.options.name) !== -1;
-      } catch(e)  {}
-
-      if (isDevModeActivity && !isSystemApp) {
-        return false;
-      }
-
-      return ActivitiesServiceFilter.match(aMsg.options.data,
-                                           aResult.description.filters);
-    };
-
-    this.db.find(aMsg, successCb, errorCb, matchFunc);
-  },
-
-  trySendAndCleanup: function activities_trySendAndCleanup(aId, aName, aPayload) {
-    try {
-      this.callers[aId].mm.sendAsyncMessage(aName, aPayload);
-    } finally {
-      this.removeCaller(aId);
-    }
-  },
-
-  receiveMessage: function activities_receiveMessage(aMessage) {
-    let mm = aMessage.target;
-    let msg = aMessage.json;
-
-    let caller;
-    let obsData;
-
-    if (aMessage.name == "Activity:PostResult" ||
-        aMessage.name == "Activity:PostError" ||
-        aMessage.name == "Activity:Ready") {
-      caller = this.callers[msg.id];
-      if (!caller) {
-        debug("!! caller is null for msg.id=" + msg.id);
-        return;
-      }
-      obsData = JSON.stringify({ manifestURL: caller.manifestURL,
-                                 pageURL: caller.pageURL,
-                                 success: aMessage.name == "Activity:PostResult" });
-    }
-
-    switch(aMessage.name) {
-      case "Activity:Start":
-        Services.obs.notifyObservers(null, "activity-opened", msg.childID);
-        this.callers[msg.id] = { mm: mm,
-                                 manifestURL: msg.manifestURL,
-                                 childID: msg.childID,
-                                 pageURL: msg.pageURL };
-        this.startActivity(msg);
-        break;
-
-      case "Activity:Ready":
-        caller.childMM = mm;
-        break;
-
-      case "Activity:PostResult":
-        this.trySendAndCleanup(msg.id, "Activity:FireSuccess", msg);
-        break;
-      case "Activity:PostError":
-        this.trySendAndCleanup(msg.id, "Activity:FireError", msg);
-        break;
-
-      case "Activities:Register":
-        this.db.add(msg,
-          function onSuccess(aEvent) {
-            debug("Activities:Register:OK");
-            Services.obs.notifyObservers(null, "new-activity-registered-success", null);
-            mm.sendAsyncMessage("Activities:Register:OK", null);
-          },
-          function onError(aEvent) {
-            msg.error = "REGISTER_ERROR";
-            debug("Activities:Register:KO");
-            Services.obs.notifyObservers(null, "new-activity-registered-failure", null);
-            mm.sendAsyncMessage("Activities:Register:KO", msg);
-          });
-        break;
-      case "Activities:Unregister":
-        this.db.remove(msg);
-        break;
-      case "Activities:UnregisterAll":
-        this.db.removeAll(msg);
-        break;
-      case "child-process-shutdown":
-        for (let id in this.callers) {
-          if (this.callers[id].childMM == mm) {
-            this.trySendAndCleanup(id, "Activity:FireError", {
-              "id": id,
-              "error": "ActivityCanceled"
-            });
-            break;
-          }
-        }
-        break;
-    }
-  },
-
-  removeCaller: function activities_removeCaller(id) {
-    Services.obs.notifyObservers(null, "activity-closed",
-                                 this.callers[id].childID);
-    delete this.callers[id];
-  }
-
-}
-
-Activities.init();
deleted file mode 100644
--- a/dom/activities/ActivitiesServiceFilter.jsm
+++ /dev/null
@@ -1,129 +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"
-
-this.EXPORTED_SYMBOLS = ['ActivitiesServiceFilter'];
-
-this.ActivitiesServiceFilter = {
-  match: function(aValues, aFilters) {
-
-    function matchValue(aValue, aFilter, aFilterObj) {
-      if (aFilter !== null) {
-        // Custom functions for the different types.
-        switch (typeof(aFilter)) {
-        case 'boolean':
-          return aValue === aFilter;
-
-        case 'number':
-          return Number(aValue) === aFilter;
-
-        case 'string':
-          return String(aValue) === aFilter;
-
-        default: // not supported
-          return false;
-        }
-      }
-
-      // Pattern.
-      if (('pattern' in aFilterObj)) {
-        var pattern = String(aFilterObj.pattern);
-
-        var patternFlags = '';
-        if (('patternFlags' in aFilterObj)) {
-          patternFlags = String(aFilterObj.patternFlags);
-        }
-
-        var re = new RegExp('^(?:' + pattern + ')$', patternFlags);
-        return re.test(aValue);
-      }
-
-      // Validation of the min/Max.
-      if (('min' in aFilterObj) || ('max' in aFilterObj)) {
-        // Min value.
-        if (('min' in aFilterObj) &&
-            aFilterObj.min > aValue) {
-          return false;
-        }
-
-        // Max value.
-        if (('max' in aFilterObj) &&
-            aFilterObj.max < aValue) {
-          return false;
-        }
-      }
-
-      return true;
-    }
-
-    // this function returns true if the value matches with the filter object
-    function matchObject(aValue, aFilterObj) {
-
-      // Let's consider anything an array.
-      let filters = ('value' in aFilterObj)
-                      ? (Array.isArray(aFilterObj.value)
-                          ? aFilterObj.value
-                          : [aFilterObj.value])
-                      : [ null ];
-      let values  = Array.isArray(aValue) ? aValue : [aValue];
-
-      for (var filterId = 0; filterId < filters.length; ++filterId) {
-        for (var valueId = 0; valueId < values.length; ++valueId) {
-          if (matchValue(values[valueId], filters[filterId], aFilterObj)) {
-            return true;
-          }
-        }
-      }
-
-      return false;
-    }
-
-    // Creation of a filter map useful to know what has been
-    // matched and what is not.
-    let filtersMap = {}
-    for (let filter in aFilters) {
-      // Convert this filter in an object if needed
-      let filterObj = aFilters[filter];
-
-      if (Array.isArray(filterObj) || typeof(filterObj) !== 'object') {
-        filterObj = {
-          required: false,
-          value: filterObj
-        }
-      }
-
-      filtersMap[filter] = { filter: filterObj,
-                             found:  false };
-    }
-
-    // For any incoming property.
-    for (let prop in aValues) {
-      // If this is unknown for the app, let's continue.
-      if (!(prop in filtersMap)) {
-        continue;
-      }
-
-      if (Array.isArray(aValues[prop]) && aValues[prop].length == 0) {
-        continue;
-      }
-
-      // Otherwise, let's check the value against the filter.
-      if (!matchObject(aValues[prop], filtersMap[prop].filter)) {
-        return false;
-      }
-
-      filtersMap[prop].found = true;
-    }
-
-    // Required filters:
-    for (let filter in filtersMap) {
-      if (filtersMap[filter].filter.required && !filtersMap[filter].found) {
-        return false;
-      }
-    }
-
-    return true;
-  }
-}
deleted file mode 100644
--- a/dom/activities/Activity.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* 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/. */
-
-#include "Activity.h"
-#include "mozilla/dom/ToJSValue.h"
-#include "mozilla/dom/ContentChild.h"
-#include "nsContentUtils.h"
-#include "nsDOMClassInfo.h"
-#include "nsIConsoleService.h"
-#include "nsIDocShell.h"
-#include "nsIDocument.h"
-
-using namespace mozilla::dom;
-
-NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(Activity)
-NS_INTERFACE_MAP_END_INHERITING(DOMRequest)
-
-NS_IMPL_ADDREF_INHERITED(Activity, DOMRequest)
-NS_IMPL_RELEASE_INHERITED(Activity, DOMRequest)
-
-NS_IMPL_CYCLE_COLLECTION_INHERITED(Activity, DOMRequest,
-                                   mProxy)
-
-NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(Activity, DOMRequest)
-NS_IMPL_CYCLE_COLLECTION_TRACE_END
-
-/* virtual */ JSObject*
-Activity::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
-{
-  return MozActivityBinding::Wrap(aCx, this, aGivenProto);
-}
-
-nsresult
-Activity::Initialize(nsPIDOMWindowInner* aWindow,
-                     JSContext* aCx,
-                     const ActivityOptions& aOptions)
-{
-  MOZ_ASSERT(aWindow);
-
-  nsCOMPtr<nsIDocument> document = aWindow->GetExtantDoc();
-
-  bool isActive;
-  aWindow->GetDocShell()->GetIsActive(&isActive);
-
-  if (!isActive &&
-      !nsContentUtils::IsChromeDoc(document)) {
-    nsCOMPtr<nsIDOMRequestService> rs =
-      do_GetService("@mozilla.org/dom/dom-request-service;1");
-    rs->FireErrorAsync(static_cast<DOMRequest*>(this),
-                       NS_LITERAL_STRING("NotUserInput"));
-
-    nsCOMPtr<nsIConsoleService> console(
-      do_GetService("@mozilla.org/consoleservice;1"));
-    NS_ENSURE_TRUE(console, NS_OK);
-
-    nsString message =
-      NS_LITERAL_STRING("Can only start activity from user input or chrome code");
-    console->LogStringMessage(message.get());
-
-    return NS_OK;
-  }
-
-  // Instantiate a JS proxy that will do the child <-> parent communication
-  // with the JS implementation of the backend.
-  nsresult rv;
-  mProxy = do_CreateInstance("@mozilla.org/dom/activities/proxy;1", &rv);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  // We're about the pass the dictionary to a JS-implemented component, so
-  // rehydrate it in a system scode so that security wrappers don't get in the
-  // way. See bug 1161748 comment 16.
-  bool ok;
-  JS::Rooted<JS::Value> optionsValue(aCx);
-  {
-    JSAutoCompartment ac(aCx, xpc::PrivilegedJunkScope());
-    ok = ToJSValue(aCx, aOptions, &optionsValue);
-    NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
-  }
-  ok = JS_WrapValue(aCx, &optionsValue);
-  NS_ENSURE_TRUE(ok, NS_ERROR_FAILURE);
-
-  ContentChild *cpc = ContentChild::GetSingleton();
-  uint64_t childID = cpc ? cpc->GetID() : 0;
-
-  mProxy->StartActivity(static_cast<nsIDOMDOMRequest*>(this), optionsValue,
-                        aWindow, childID);
-  return NS_OK;
-}
-
-Activity::~Activity()
-{
-  if (mProxy) {
-    mProxy->Cleanup();
-  }
-}
-
-Activity::Activity(nsPIDOMWindowInner* aWindow)
-  : DOMRequest(aWindow)
-{
-}
-
deleted file mode 100644
--- a/dom/activities/Activity.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim: set ts=8 sts=2 et sw=2 tw=80: */
-/* 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/. */
-
-#ifndef mozilla_dom_activities_Activity_h
-#define mozilla_dom_activities_Activity_h
-
-#include "DOMRequest.h"
-#include "mozilla/dom/BindingDeclarations.h"
-#include "mozilla/dom/MozActivityBinding.h"
-#include "nsIActivityProxy.h"
-#include "mozilla/Preferences.h"
-#include "nsPIDOMWindow.h"
-
-namespace mozilla {
-namespace dom {
-
-class Activity : public DOMRequest
-{
-public:
-  NS_DECL_ISUPPORTS_INHERITED
-  NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(Activity, DOMRequest)
-
-  virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
-
-  static already_AddRefed<Activity>
-  Constructor(const GlobalObject& aOwner,
-              const ActivityOptions& aOptions,
-              ErrorResult& aRv)
-  {
-    nsCOMPtr<nsPIDOMWindowInner> window = do_QueryInterface(aOwner.GetAsSupports());
-    if (!window) {
-      aRv.Throw(NS_ERROR_UNEXPECTED);
-      return nullptr;
-    }
-
-    RefPtr<Activity> activity = new Activity(window);
-    aRv = activity->Initialize(window, aOwner.Context(), aOptions);
-    return activity.forget();
-  }
-
-  explicit Activity(nsPIDOMWindowInner* aWindow);
-
-protected:
-  nsresult Initialize(nsPIDOMWindowInner* aWindow,
-                      JSContext* aCx,
-                      const ActivityOptions& aOptions);
-
-  nsCOMPtr<nsIActivityProxy> mProxy;
-
-  ~Activity();
-};
-
-} // namespace dom
-} // namespace mozilla
-
-#endif // mozilla_dom_activities_Activity_h
deleted file mode 100644
--- a/dom/activities/ActivityMessageConfigurator.js
+++ /dev/null
@@ -1,33 +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 Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function debug(aMsg) {
-  // dump("-- ActivityMessageConfigurator.js " + Date.now() + " : " + aMsg + "\n");
-}
-
-/**
-  * nsISystemMessagesConfigurator implementation.
-  */
-function ActivityMessageConfigurator() {
-  debug("ActivityMessageConfigurator");
-}
-
-ActivityMessageConfigurator.prototype = {
-  get mustShowRunningApp() {
-    debug("mustShowRunningApp returning true");
-    return true;
-  },
-
-  classID: Components.ID("{d2296daa-c406-4c5e-b698-e5f2c1715798}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessagesConfigurator])
-}
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ActivityMessageConfigurator]);
deleted file mode 100644
--- a/dom/activities/ActivityProxy.js
+++ /dev/null
@@ -1,134 +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;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
-                                   "@mozilla.org/childprocessmessagemanager;1",
-                                   "nsISyncMessageSender");
-
-function debug(aMsg) {
-  //dump("-- ActivityProxy " + Date.now() + " : " + aMsg + "\n");
-}
-
-/**
-  * nsIActivityProxy implementation
-  * We keep a reference to the C++ Activity object, and
-  * communicate with the Message Manager to know when to
-  * fire events on it.
-  */
-function ActivityProxy() {
-  debug("ActivityProxy");
-  this.activity = null;
-  let inParent = Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime)
-                   .processType == Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT;
-  debug("inParent: " + inParent);
-  Cu.import(inParent ? "resource://gre/modules/Webapps.jsm"
-                     : "resource://gre/modules/AppsServiceChild.jsm");
-}
-
-ActivityProxy.prototype = {
-  startActivity: function actProxy_startActivity(aActivity, aOptions, aWindow,
-                                                 aChildID) {
-    debug("startActivity");
-
-    this.window = aWindow;
-    this.activity = aActivity;
-    this.id = Cc["@mozilla.org/uuid-generator;1"]
-                .getService(Ci.nsIUUIDGenerator)
-                .generateUUID().toString();
-    // Retrieve the app's manifest url from the principal, so that we can
-    // later notify when the activity handler called postResult or postError
-    let principal = aWindow.document.nodePrincipal;
-    let appId = principal.appId;
-    let manifestURL = (appId != Ci.nsIScriptSecurityManager.NO_APP_ID &&
-                       appId != Ci.nsIScriptSecurityManager.UNKNOWN_APP_ID)
-                        ? DOMApplicationRegistry.getManifestURLByLocalId(appId)
-                        : null;
-
-    // Only let certified apps enumerate providers for this filter.
-    if (aOptions.getFilterResults === true &&
-        principal.appStatus != Ci.nsIPrincipal.APP_STATUS_CERTIFIED) {
-      Services.DOMRequest.fireErrorAsync(this.activity, "SecurityError");
-      Services.obs.notifyObservers(null, "Activity:Error", null);
-      return;
-    }
-
-    // Check the activities that are restricted to be used in dev mode.
-    let devMode = false;
-    let isDevModeActivity = false;
-    try {
-      devMode = Services.prefs.getBoolPref("dom.apps.developer_mode");
-      isDevModeActivity =
-        Services.prefs.getCharPref("dom.activities.developer_mode_only")
-                      .split(",").indexOf(aOptions.name) !== -1;
-
-    } catch(e) {}
-    if (isDevModeActivity && !devMode) {
-      Services.DOMRequest.fireErrorAsync(this.activity, "SecurityError");
-      Services.obs.notifyObservers(null, "Activity:Error", null);
-      return;
-    }
-
-    cpmm.addMessageListener("Activity:FireSuccess", this);
-    cpmm.addMessageListener("Activity:FireError", this);
-
-    cpmm.sendAsyncMessage("Activity:Start",
-      {
-        id: this.id,
-        options: {
-          name: aOptions.name,
-          data: aOptions.data
-        },
-        getFilterResults: aOptions.getFilterResults,
-        manifestURL: manifestURL,
-        pageURL: aWindow.document.location.href,
-        childID: aChildID });
-  },
-
-  receiveMessage: function actProxy_receiveMessage(aMessage) {
-    debug("Got message: " + aMessage.name);
-    let msg = aMessage.json;
-    if (msg.id != this.id)
-      return;
-    debug("msg=" + JSON.stringify(msg));
-
-    switch(aMessage.name) {
-      case "Activity:FireSuccess":
-        debug("FireSuccess");
-        Services.DOMRequest.fireSuccess(this.activity,
-                                        Cu.cloneInto(msg.result, this.window));
-        Services.obs.notifyObservers(null, "Activity:Success", null);
-        break;
-      case "Activity:FireError":
-        debug("FireError");
-        Services.DOMRequest.fireError(this.activity, msg.error);
-        Services.obs.notifyObservers(null, "Activity:Error", null);
-        break;
-    }
-    // We can only get one FireSuccess / FireError message, so cleanup as soon as possible.
-    this.cleanup();
-  },
-
-  cleanup: function actProxy_cleanup() {
-    debug("cleanup");
-    if (cpmm && !this.cleanedUp) {
-      cpmm.removeMessageListener("Activity:FireSuccess", this);
-      cpmm.removeMessageListener("Activity:FireError", this);
-    }
-    this.cleanedUp = true;
-  },
-
-  classID: Components.ID("{ba9bd5cb-76a0-4ecf-a7b3-d2f7c43c5949}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsIActivityProxy])
-}
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ActivityProxy]);
deleted file mode 100644
--- a/dom/activities/ActivityRequestHandler.js
+++ /dev/null
@@ -1,80 +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 Ci = Components.interfaces;
-const Cu = Components.utils;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
-                                   "@mozilla.org/childprocessmessagemanager;1",
-                                   "nsISyncMessageSender");
-
-function debug(aMsg) {
-  //dump("-- ActivityRequestHandler.js " + Date.now() + " : " + aMsg + "\n");
-}
-
-/**
-  * nsIDOMMozActivityRequestHandler implementation.
-  */
-
-function ActivityRequestHandler() {
-  debug("ActivityRequestHandler");
-
-  // When a system message of type 'activity' is emitted, it forces the
-  // creation of an ActivityWrapper which in turns replace the default
-  // system message callback. The newly created wrapper then create an
-  // ActivityRequestHandler object.
-}
-
-ActivityRequestHandler.prototype = {
-  init: function arh_init(aWindow) {
-    this._window = aWindow;
-  },
-
-  __init: function arh___init(aId, aOptions, aReturnValue) {
-    this._id = aId;
-    this._options = aOptions;
-    this._returnValue = aReturnValue;
-  },
-
-  get source() {
-    // We need to clone this object because the this._options.data has
-    // the type any in WebIDL which will cause the binding layer to pass
-    // the value which is a COW unmodified to content.
-    return Cu.cloneInto(this._options, this._window);
-  },
-
-  postResult: function arh_postResult(aResult) {
-    if (this._returnValue) {
-      cpmm.sendAsyncMessage("Activity:PostResult", {
-        "id": this._id,
-        "result": aResult
-      });
-      Services.obs.notifyObservers(null, "activity-success", this._id);
-    } else {
-      Cu.reportError("postResult() can't be called when 'returnValue': 'true' isn't declared in manifest.webapp");
-      throw new Error("postResult() can't be called when 'returnValue': 'true' isn't declared in manifest.webapp");
-    }
-  },
-
-  postError: function arh_postError(aError) {
-    cpmm.sendAsyncMessage("Activity:PostError", {
-      "id": this._id,
-      "error": aError
-    });
-    Services.obs.notifyObservers(null, "activity-error", this._id);
-  },
-
-  classID: Components.ID("{9326952a-dbe3-4d81-a51f-d9c160d96d6b}"),
-
-  QueryInterface: XPCOMUtils.generateQI([
-    Ci.nsIDOMGlobalPropertyInitializer
-  ])
-}
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ActivityRequestHandler]);
deleted file mode 100644
--- a/dom/activities/ActivityWrapper.js
+++ /dev/null
@@ -1,94 +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;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-XPCOMUtils.defineLazyServiceGetter(this, "cpmm",
-                                   "@mozilla.org/childprocessmessagemanager;1",
-                                   "nsISyncMessageSender");
-
-function debug(aMsg) {
-  //dump("-- ActivityWrapper.js " + Date.now() + " : " + aMsg + "\n");
-}
-
-/**
-  * nsISystemMessagesWrapper implementation. Will return a
-  * nsIDOMMozActivityRequestHandler
-  */
-function ActivityWrapper() {
-  debug("ActivityWrapper");
-}
-
-ActivityWrapper.prototype = {
-  wrapMessage: function wrapMessage(aMessage, aWindow) {
-    debug("Wrapping " + JSON.stringify(aMessage));
-
-    // This message is useful to communicate that the activity message has been
-    // properly received by the app. If the app will be killed, the
-    // ActivitiesService will be able to fire an error and complete the
-    // Activity workflow.
-    cpmm.sendAsyncMessage("Activity:Ready", { id: aMessage.id });
-
-    // Gecko should ignore |postResult| calls for WebActivities with no returnValue
-    // We need to pass returnValue to ActivityRequestHandler constructor to then properly
-    // decide if should call postResult or not
-    let handler = new aWindow.ActivityRequestHandler(aMessage.id, aMessage.payload, aMessage.target.returnValue);
-
-    // When the activity window is closed, fire an error to notify the activity
-    // caller of the situation.
-    // We don't need to check whether the activity itself already sent
-    // back something since ActivitiesService.jsm takes care of that.
-    let util = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                      .getInterface(Ci.nsIDOMWindowUtils);
-    let innerWindowID = util.currentInnerWindowID;
-
-    let observer = {
-      observe: function(aSubject, aTopic, aData) {
-
-        switch (aTopic) {
-          case 'inner-window-destroyed':
-            let wId = aSubject.QueryInterface(Ci.nsISupportsPRUint64).data;
-            if (wId == innerWindowID) {
-              debug("Closing activity window " + innerWindowID);
-              Services.obs.removeObserver(observer, "inner-window-destroyed");
-              cpmm.sendAsyncMessage("Activity:PostError",
-                                    { id: aMessage.id,
-                                      error: "ActivityCanceled"
-                                    });
-            }
-            break;
-          case 'activity-error':
-          case 'activity-success':
-            if (aData !== aMessage.id) {
-              return;
-            }
-            Services.obs.removeObserver(observer, "activity-error");
-            Services.obs.removeObserver(observer, "activity-success");
-            let docshell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
-                                  .getInterface(Ci.nsIWebNavigation);
-            Services.obs.notifyObservers(docshell, "activity-done", aTopic);
-            break;
-        }
-      }
-    }
-
-    Services.obs.addObserver(observer, "activity-error", false);
-    Services.obs.addObserver(observer, "activity-success", false);
-    Services.obs.addObserver(observer, "inner-window-destroyed", false);
-    return handler;
-  },
-
-  classID: Components.ID("{5430d6f9-32d6-4924-ba39-6b6d1b093cd6}"),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsISystemMessagesWrapper])
-}
-
-this.NSGetFactory = XPCOMUtils.generateNSGetFactory([ActivityWrapper]);
-
deleted file mode 100644
--- a/dom/activities/interfaces/moz.build
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
-# 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/.
-
-XPIDL_SOURCES += [
-    'nsIActivityProxy.idl',
-    'nsIActivityUIGlue.idl',
-]
-
-XPIDL_MODULE = 'dom_activities'
-
deleted file mode 100644
--- a/dom/activities/interfaces/nsIActivityProxy.idl
+++ /dev/null
@@ -1,20 +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/. */
-
-#include "nsISupports.idl"
-
-interface mozIDOMWindow;
-
-/**
-  * Implemented by @mozilla.org/dom/activities/proxy;1
-  */
-[scriptable, uuid(87653623-d864-4b03-8874-96808b8cdb81)]
-interface nsIActivityProxy : nsISupports
-{
-    void startActivity(in nsISupports /* MozActivity */ activity,
-                       in jsval options,
-                       in mozIDOMWindow window,
-                       in unsigned long long childID);
-    void cleanup();
-};
deleted file mode 100644
--- a/dom/activities/interfaces/nsIActivityUIGlue.idl
+++ /dev/null
@@ -1,45 +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/. */
-
-#include "nsISupports.idl"
-
-[scriptable, function, uuid(674b6e69-05f0-41da-aabd-4184ea85c9d8)]
-interface nsIActivityUIGlueCallback : nsISupports
-{
-    /**
-     * The activity service should start the activity at the specified index.
-     */
-    const short WEBAPPS_ACTIVITY = 0;
-
-    /**
-     * The activity service should deliver the specified result to the MozActivity callback.
-     */
-    const short NATIVE_ACTIVITY  = 1;
-
-    /**
-      * Called if the user picked an activitiy to launch.
-      * @param resultType Inidcates that {@code result} is an index or a native activity result.
-      * @param result     If WEBAPPS_ACTIVITY, the index of the chosen activity. Send '-1' if no choice is made.
-                          If NATIVE_ACTIVITY, the return value to be sent to the MozActivity.
-      */
-    void handleEvent(in short resultType, in jsval result);
-};
-
-/**
-  * To be implemented by @mozilla.org/dom/activities/ui-glue;1
-  */
-[scriptable, uuid(3caef69f-3569-4b19-bcea-1cfb0fee4466)]
-interface nsIActivityUIGlue : nsISupports
-{
-    /**
-      * This method is called even if the size of {@code activities} is 0 so that the callee can
-      * decide whether or not to defer the request to an alternate activity system.
-      *
-      * @param options     The ActivityOptions object in the form of { name: "send", data: { ... } }
-      * @param activities  A json blob which is an array of { "title":"...", "icon":"..." }.
-      * @param callback    The callback to send the index of the choosen activity, or the result.
-      */
-    void chooseActivity(in jsval options, in jsval activities,
-        in nsIActivityUIGlueCallback callback);
-};
deleted file mode 100644
--- a/dom/activities/moz.build
+++ /dev/null
@@ -1,40 +0,0 @@
-# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
-# 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/.
-
-DIRS += ['interfaces']
-
-XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini']
-
-MOCHITEST_CHROME_MANIFESTS += ['tests/mochi/mochitest.ini']
-
-EXPORTS.mozilla.dom += [
-    'Activity.h',
-]
-
-SOURCES += [
-    'Activity.cpp',
-]
-
-EXTRA_COMPONENTS += [
-    'Activities.manifest',
-    'ActivityMessageConfigurator.js',
-    'ActivityProxy.js',
-    'ActivityRequestHandler.js',
-    'ActivityWrapper.js',
-]
-
-EXTRA_JS_MODULES += [
-    'ActivitiesService.jsm',
-    'ActivitiesServiceFilter.jsm',
-]
-
-LOCAL_INCLUDES += [
-    '/dom/base',
-]
-
-include('/ipc/chromium/chromium-config.mozbuild')
-
-FINAL_LIBRARY = 'xul'
deleted file mode 100644
--- a/dom/activities/tests/mochi/common.js
+++ /dev/null
@@ -1,37 +0,0 @@
-var { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-const ACTIVITY_GLUE_CID = Components.ID("{f4cfbe10-a106-4cd1-b04e-0d2a6aac138b}");
-const SYS_MSG_GLUE_CID = Components.ID("{b0b6b9af-bc4e-4200-bffe-fb7691065ec9}");
-
-const gRootUrl = "http://test/chrome/dom/activities/tests/mochi/";
-
-function registerComponent(aObject, aDescription, aContract, aCid) {
-  info("Registering " + aCid);
-
-  var componentManager =
-    Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
-  componentManager.registerFactory(aCid, aDescription, aContract, aObject);
-
-  // Keep the id on the object so we can unregister later.
-  aObject.cid = aCid;
-}
-
-function unregisterComponent(aObject) {
-  info("Unregistering " + aObject.cid);
-  var componentManager =
-    Components.manager.QueryInterface(Ci.nsIComponentRegistrar);
-  componentManager.unregisterFactory(aObject.cid, aObject);
-}
-
-function cbError(aEvent) {
-  ok(false, "Error callback invoked " +
-            aEvent.target.error.name + " " + aEvent.target.error.message);
-  finish();
-}
-
-function unexpectedSuccess(aMsg) {
-  return function() {
-    ok(false, "Should not have succeeded: " + aMsg);
-    finish();
-  }
-}
deleted file mode 100644
--- a/dom/activities/tests/mochi/manifest.webapp
+++ /dev/null
@@ -1,17 +0,0 @@
-{
-  "name": "Random app",
-  "activities": {
-    "import-app": { "blob": { "required": true } },
-    "bug1176712": [{
-      "filters": {
-        "type": "type1"
-      },
-      "href": "href1"
-    }, {
-      "filters": {
-        "type": "type2"
-      },
-      "href": "href2"
-    }]
-  }
-}
deleted file mode 100644
--- a/dom/activities/tests/mochi/manifest.webapp^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: application/manifest+json
\ No newline at end of file
deleted file mode 100644
--- a/dom/activities/tests/mochi/mochitest.ini
+++ /dev/null
@@ -1,11 +0,0 @@
-[DEFAULT]
-skip-if = (buildapp != 'b2g' && buildapp != 'mulet')
-support-files =
-  common.js
-  system.webapp
-  system.webapp^headers^
-  manifest.webapp
-  manifest.webapp^headers^
-
-[test_dev_mode_activity.html]
-[test_same_name_multiple_filters.html]
deleted file mode 100644
--- a/dom/activities/tests/mochi/system.webapp
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-  "name": "System app",
-  "activities": {
-    "import-app": { "blob": { "required": true } }
-  }
-}
deleted file mode 100644
--- a/dom/activities/tests/mochi/system.webapp^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: application/manifest+json
\ No newline at end of file
deleted file mode 100644
--- a/dom/activities/tests/mochi/test_dev_mode_activity.html
+++ /dev/null
@@ -1,269 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={1123846}
--->
-<head>
-  <title>Test for Bug {1123846}</title>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/chrome-harness.js"></script>
-  <script type="application/javascript"
-          src="http://test/chrome/dom/activities/tests/mochi/common.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={1123846}">Mozilla Bug {1123846}</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-<script class="testbody" type="application/javascript;version=1.7">
-
-
-/**
-  * Tests the developer mode activities that can only be provided by the
-  * system app.
-  *
-  * We test the following:
-  * 1) No dev mode, no system app installed (failure).
-  * 2) No dev mode, system app installed (failure).
-  * 3) No dev mode, system app and other app installed (failure).
-  * 4) Dev mode, system app and other app installed (success, only system app returned).
-  */
-
-var gGenerator = runTest();
-
-function go() {
-  SpecialPowers.pushPermissions(
-    [{ "type": "webapps-manage", "allow": 1, "context": document },
-     { "type": "browser", "allow": 1, "context": document },
-     { "type": "embed-apps", "allow": 1, "context": document }],
-    function() {
-      SpecialPowers.pushPrefEnv(
-        {'set': [["dom.mozBrowserFramesEnabled", true],
-                 ["dom.sysmsg.enabled", true],
-                 ["dom.apps.developer_mode", false],
-                 ["dom.activities.developer_mode_only", "import-app"]]},
-        continueTest) });
-}
-
-SimpleTest.waitForExplicitFinish();
-
-var systemAppUrl = gRootUrl + "system.webapp";
-var otherAppUrl = gRootUrl + "manifest.webapp";
-
-function installApp(aUrl) {
-  var request = navigator.mozApps.install(aUrl, { });
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  return request;
-}
-
-function installSystemApp() {
-  return installApp(systemAppUrl);
-}
-
-function installOtherApp() {
-  return installApp(otherAppUrl);
-}
-
-function uninstall(aApp) {
-  info("Uninstalling " + (aApp ? aApp.manifestURL : "NO APP!!"));
-  var request = navigator.mozApps.mgmt.uninstall(aApp);
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-}
-
-var ActivityGlue = {
-  // nsISupports implementation.
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsISupports) ||
-        iid.equals(Ci.nsIFactory) ||
-        iid.equals(Ci.nsIActivityUIGlue)) {
-      return this;
-    }
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  // nsIFactory implementation.
-  createInstance: function(outer, iid) {
-    return this.QueryInterface(iid);
-  },
-
-  // nsIActivityUIGlue implementation.
-  chooseActivity: function(aOptions, aActivities, aCallback) {
-    aCallback.handleEvent(Ci.nsIActivityUIGlueCallback.WEBAPPS_ACTIVITY,
-                          aActivities.length == 1 ? 0 : -1);
-  }
-};
-
-var SystemMessageGlue = {
-  // nsISupports implementation.
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsISupports) ||
-        iid.equals(Ci.nsIFactory) ||
-        iid.equals(Ci.nsISystemMessageGlue)) {
-      return this;
-    }
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  // nsIFactory implementation.
-  createInstance: function(outer, iid) {
-    return this.QueryInterface(iid);
-  },
-
-  // nsISystemMessageGlue implementation.
-  openApp(pageURL, manifestURL, type, target, showApp, onlyShowApp, extra) {
-    // We should only try to open a page in the system app.
-    is(manifestURL, systemAppUrl, "Opening a page in the system app.");
-  }
-};
-
-registerComponent(ActivityGlue,
-                  "Activity Glue",
-                  "@mozilla.org/dom/activities/ui-glue;1",
-                  ACTIVITY_GLUE_CID);
-
-registerComponent(SystemMessageGlue,
-                  "System Message Glue",
-                  "@mozilla.org/dom/messages/system-message-glue;1",
-                  SYS_MSG_GLUE_CID);
-
-function finish() {
-  unregisterComponent(ActivityGlue);
-  unregisterComponent(SystemMessageGlue);
-  obsService.removeObserver(continueTest, "new-activity-registered-success");
-  obsService.removeObserver(continueTest, "new-activity-registered-failure");
-
-  SimpleTest.finish();
-}
-
-function continueTest() {
-  try {
-    gGenerator.next();
-  } catch (e if e instanceof StopIteration) {
-    finish();
-  }
-}
-
-var obsService = Cc["@mozilla.org/observer-service;1"]
-                   .getService(Ci.nsIObserverService);
-
-obsService.addObserver(continueTest, "new-activity-registered-success", false);
-obsService.addObserver(continueTest, "new-activity-registered-failure", false);
-
-/**
-  * Test dev mode activity.
-  */
-function runTest() {
-  SpecialPowers.autoConfirmAppInstall(continueTest);
-  yield undefined;
-
-  SpecialPowers.autoConfirmAppUninstall(continueTest);
-  yield undefined;
-
-  // Check how many apps we are starting with.
-  var request = navigator.mozApps.mgmt.getAll();
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  yield undefined;
-  var initialAppsCount = request.result.length;
-  info("Starting with " + initialAppsCount + " apps installed.");
-
-  // 1) No dev mode, no system app installed (failure).
-  var activity = new MozActivity({ name: "import-app" });
-  activity.onerror = function() {
-    ok(true, "1) No dev mode, no system app installed");
-    continueTest();
-  }
-  activity.onsuccess = unexpectedSuccess("1) No dev mode, no system app installed");
-  yield undefined;
-
-
-  // 2) No dev mode, system app installed (failure).
-  // Configure the system app manifest url.
-  SpecialPowers.pushPrefEnv(
-        {'set': [["b2g.system_manifest_url", systemAppUrl]]},
-        continueTest);
-  yield undefined;
-
-  // Install the system app.
-  request = installSystemApp();
-  yield undefined;
-  var systemApp = request.result;
-  ok(systemApp, "systemApp is non-null");
-
-  // yielding for the activity install observer.
-  yield undefined;
-
-  activity = new MozActivity({ name: "import-app" });
-  activity.onerror = function() {
-    ok(true, "2) No dev mode, system app installed");
-    continueTest();
-  }
-  activity.onsuccess = unexpectedSuccess("2) No dev mode, system app installed");
-  yield undefined;
-
-  // 3) No dev mode, system app and other app installed (failure).
-  request = installOtherApp();
-  yield undefined;
-  var otherApp = request.result;
-  ok(otherApp, "otherApp is non-null");
-
-  // yielding for the activity install observer.
-  yield undefined;
-
-  activity = new MozActivity({ name: "import-app" });
-  activity.onerror = function() {
-    ok(true, "3) No dev mode, system app and other app installed");
-    continueTest();
-  }
-  activity.onsuccess = unexpectedSuccess("3) No dev mode, system app and other app installed");
-  yield undefined;
-
-  // 4) Dev mode, system app and other app installed.
-  SpecialPowers.pushPrefEnv(
-        {'set': [["dom.apps.developer_mode", true]]},
-        continueTest);
-  yield undefined;
-
-  activity = new MozActivity({ name: "import-app" });
-  activity.onsuccess = function() {
-    ok(true, "4) Dev mode, system app and other app installed");
-    continueTest();
-  }
-  activity.onerror = function(aEvent) {
-    ok(false, "4) Got error: " + aEvent.error.name);
-    finish();
-  }
-  yield undefined;
-
-  // Cleanup
-  uninstall(systemApp);
-  yield undefined;
-
-  uninstall(otherApp);
-  yield undefined;
-
-  // Check that we restored the app registry.
-  request = navigator.mozApps.mgmt.getAll();
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  yield undefined;
-
-  is(request.result.length, initialAppsCount, "All apps are uninstalled.");
-}
-
-addLoadEvent(go);
-
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/activities/tests/mochi/test_same_name_multiple_filters.html
+++ /dev/null
@@ -1,220 +0,0 @@
-<!DOCTYPE html>
-<html>
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id={1176712}
--->
-<head>
-  <title>Test for Bug {1176712}</title>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/chrome-harness.js"></script>
-  <script type="application/javascript"
-          src="http://test/chrome/dom/activities/tests/mochi/common.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id={1176712}">Mozilla Bug {1176712}</a>
-<p id="display"></p>
-<div id="content" style="display: none">
-
-</div>
-<pre id="test">
-<script class="testbody" type="application/javascript;version=1.7">
-
-var gGenerator = runTest();
-
-function go() {
-  SpecialPowers.pushPermissions(
-    [{ "type": "webapps-manage", "allow": 1, "context": document },
-     { "type": "browser", "allow": 1, "context": document },
-     { "type": "embed-apps", "allow": 1, "context": document }],
-    function() {
-      SpecialPowers.pushPrefEnv(
-        {'set': [["dom.mozBrowserFramesEnabled", true],
-                 ["dom.sysmsg.enabled", true]]},
-        continueTest) });
-}
-
-SimpleTest.waitForExplicitFinish();
-
-function installApp(aUrl) {
-  var request = navigator.mozApps.install(aUrl, { });
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  return request;
-}
-
-function uninstall(aApp) {
-  info("Uninstalling " + (aApp ? aApp.manifestURL : "NO APP!!"));
-  var request = navigator.mozApps.mgmt.uninstall(aApp);
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-}
-
-var ActivityGlue = {
-  // nsISupports implementation.
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsISupports) ||
-        iid.equals(Ci.nsIFactory) ||
-        iid.equals(Ci.nsIActivityUIGlue)) {
-      return this;
-    }
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  // nsIFactory implementation.
-  createInstance: function(outer, iid) {
-    return this.QueryInterface(iid);
-  },
-
-  // nsIActivityUIGlue implementation.
-  chooseActivity: function(aOptions, aActivities, aCallback) {
-    aCallback.handleEvent(Ci.nsIActivityUIGlueCallback.WEBAPPS_ACTIVITY,
-                          aActivities.length == 1 ? 0 : -1);
-  }
-};
-
-var SystemMessageGlue = {
-  // nsISupports implementation.
-  QueryInterface: function(iid) {
-    if (iid.equals(Ci.nsISupports) ||
-        iid.equals(Ci.nsIFactory) ||
-        iid.equals(Ci.nsISystemMessageGlue)) {
-      return this;
-    }
-
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  // nsIFactory implementation.
-  createInstance: function(outer, iid) {
-    return this.QueryInterface(iid);
-  },
-
-  // nsISystemMessageGlue implementation.
-  openApp(pageURL, manifestURL, type, target, showApp, onlyShowApp, extra) {
-  }
-};
-
-registerComponent(ActivityGlue,
-                  "Activity Glue",
-                  "@mozilla.org/dom/activities/ui-glue;1",
-                  ACTIVITY_GLUE_CID);
-
-registerComponent(SystemMessageGlue,
-                  "System Message Glue",
-                  "@mozilla.org/dom/messages/system-message-glue;1",
-                  SYS_MSG_GLUE_CID);
-
-function finish() {
-  unregisterComponent(ActivityGlue);
-  unregisterComponent(SystemMessageGlue);
-  SimpleTest.finish();
-}
-
-function continueTest() {
-  try {
-    gGenerator.next();
-  } catch (e if e instanceof StopIteration) {
-    finish();
-  }
-}
-
-function runTest() {
-  SpecialPowers.autoConfirmAppInstall(continueTest);
-  yield undefined;
-
-  SpecialPowers.autoConfirmAppUninstall(continueTest);
-  yield undefined;
-
-  // Check how many apps we are starting with.
-  var request = navigator.mozApps.mgmt.getAll();
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  yield undefined;
-  var initialAppsCount = request.result.length;
-  info("Starting with " + initialAppsCount + " apps installed.");
-
-  // Before app installed
-
-  var activity = new MozActivity({
-    name: "bug1176712",
-    data: {
-      type: "type1"
-    }
-  });
-  activity.onsuccess = unexpectedSuccess("Shouldn't launch unregistered activity");
-  activity.onerror = () => {
-    ok(activity.error.name == "NO_PROVIDER", "Expected NO_PROVIDER");
-    continueTest();
-  };
-  yield undefined;
-
-  var activity = new MozActivity({
-    name: "bug1176712",
-    data: {
-      type: "type2"
-    }
-  });
-  activity.onsuccess = unexpectedSuccess("Shouldn't launch unregistered activity");
-  activity.onerror = () => {
-    ok(activity.error.name == "NO_PROVIDER", "Expected NO_PROVIDER");
-    continueTest();
-  };
-  yield undefined;
-
-  var request = installApp(gRootUrl + "manifest.webapp");
-  yield undefined;
-  var app = request.result;
-  ok(app, "App installed");
-
-  // After app installed
-
-  var activity = new MozActivity({
-    name: "bug1176712",
-    data: {
-      type: "type1"
-    }
-  });
-  activity.onsuccess = function() {
-    ok(true, "Activity launch succeed");
-    continueTest();
-  }
-  activity.onerror = cbError;
-  yield undefined;
-
-  var activity = new MozActivity({
-    name: "bug1176712",
-    data: {
-      type: "type2"
-    }
-  });
-  activity.onsuccess = function() {
-    ok(true, "Activity launch succeed");
-    continueTest();
-  }
-  activity.onerror = cbError;
-  yield undefined;
-
-  // Cleanup
-  uninstall(app);
-  yield undefined;
-
-  // Check that we restored the app registry.
-  request = navigator.mozApps.mgmt.getAll();
-  request.onerror = cbError;
-  request.onsuccess = continueTest;
-  yield undefined;
-
-  is(request.result.length, initialAppsCount, "All apps are uninstalled.");
-}
-
-addLoadEvent(go);
-
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/activities/tests/unit/test_activityFilters.js
+++ /dev/null
@@ -1,157 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-function run_test() {
-  Components.utils.import("resource:///modules/ActivitiesServiceFilter.jsm")
-
-  do_check_true(!!ActivitiesServiceFilter);
-
-  // No requests, no filters:
-  do_check_true(ActivitiesServiceFilter.match(null, null));
-  do_check_true(ActivitiesServiceFilter.match({}, {}));
-
-  // No filters:
-  do_check_true(ActivitiesServiceFilter.match({foobar: 42}, null));
-
-  // Empty request:
-  do_check_true(ActivitiesServiceFilter.match({}, {a: 'foobar', b: [1, 2, 3], c: 42}));
-
-
-  // Simple match:
-  do_check_true(ActivitiesServiceFilter.match({a: 'foobar'},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'foobar', b: 2, c: true},
-                                               {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_true(ActivitiesServiceFilter.match({a: 'foobar', b: 2, c: 42},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'foobar2'},
-                                               {a: 'foobar', b: [1, 2, 3], c: 42}));
-
-  // Simple match in array:
-  do_check_true(ActivitiesServiceFilter.match({b: 2},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_false(ActivitiesServiceFilter.match({b: 4},
-                                               {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_true(ActivitiesServiceFilter.match({b: [2, 4]},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_false(ActivitiesServiceFilter.match({b: [4, 5]},
-                                               {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_false(ActivitiesServiceFilter.match({a: [4, 'foobar2']},
-                                               {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_true(ActivitiesServiceFilter.match({a: [4, 'foobar']},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_true(ActivitiesServiceFilter.match({a: ['foo', 'bar']},
-                                              {a: 'foo'}));
-
-  // Unknown property
-  do_check_true(ActivitiesServiceFilter.match({k: 4},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-  do_check_true(ActivitiesServiceFilter.match({k: [1,2,3,4]},
-                                              {a: 'foobar', b: [1, 2, 3], c: 42}));
-
-  // Required/non required
-  do_check_false(ActivitiesServiceFilter.match({},
-                                               {a: { required: true, value: 'foobar'}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 'foobar'},
-                                              {a: { required: true, value: 'foobar'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'foobar2'},
-                                               {a: { required: true, value: 'foobar'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'foobar2'},
-                                               {a: { required: true, value: ['a', 'b', 'foobar']}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 'foobar'},
-                                              {a: { required: true, value: ['a', 'b', 'foobar']}}));
-  do_check_true(ActivitiesServiceFilter.match({a: ['k', 'z', 'foobar']},
-                                              {a: { required: true, value: ['a', 'b', 'foobar']}}));
-  do_check_false(ActivitiesServiceFilter.match({a: ['k', 'z', 'foobar2']},
-                                               {a: { required: true, value: ['a', 'b', 'foobar']}}));
-
-  // Empty values
-  do_check_true(ActivitiesServiceFilter.match({a: 42},
-                                              {a: { required: true}}));
-  do_check_false(ActivitiesServiceFilter.match({},
-                                               {a: { required: true}}));
-
-  // Boolean
-  do_check_true(ActivitiesServiceFilter.match({a: false},
-                                              {a: { required: true, value: false}}));
-  do_check_false(ActivitiesServiceFilter.match({a: true},
-                                               {a: { required: true, value: false}}));
-  do_check_true(ActivitiesServiceFilter.match({a: [false, true]},
-                                              {a: { required: true, value: false}}));
-  do_check_true(ActivitiesServiceFilter.match({a: [false, true]},
-                                              {a: { required: true, value: [false,true]}}));
-
-  // Number
-  do_check_true(ActivitiesServiceFilter.match({a: 42},
-                                              {a: { required: true, value: 42}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, value: 42}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, min: 1}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, min: 2}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, min: 3}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, max: 1}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, max: 2}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, max: 3}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, min: 1, max: 1}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, min: 1, max: 2}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, min: 2, max: 2}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, value: 'foo'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, min: 100, max: 0}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 2},
-                                              {a: { required: true, min: 'a', max: 'b'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 2},
-                                               {a: { required: true, min: 10, max: 1}}));
-
-  // String
-  do_check_true(ActivitiesServiceFilter.match({a: 'foo'},
-                                              {a: { required: true, value: 'foo'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'foo2'},
-                                               {a: { required: true, value: 'foo'}}));
-
-  // Number VS string
-  do_check_true(ActivitiesServiceFilter.match({a: '42'},
-                                              {a: { required: true, value: 42}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 42},
-                                              {a: { required: true, value: '42'}}));
-  do_check_true(ActivitiesServiceFilter.match({a: '-42e+12'},
-                                              {a: { required: true, value: -42e+12}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 42},
-                                              {a: { required: true, min: '1', max: '50'}}));
-  do_check_true(ActivitiesServiceFilter.match({a: '42'},
-                                              {a: 42 }));
-  do_check_true(ActivitiesServiceFilter.match({a: 42},
-                                              {a: '42' }));
-  do_check_false(ActivitiesServiceFilter.match({a: 42},
-                                               {a: { min: '44' }}));
-  do_check_false(ActivitiesServiceFilter.match({a: 42},
-                                               {a: { max: '0' }}));
-
-  // String + Pattern
-  do_check_true(ActivitiesServiceFilter.match({a: 'foobar'},
-                                              {a: { required: true, pattern: 'foobar'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'aafoobar'},
-                                               {a: { required: true, pattern: 'foobar'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'aaFOOsdsad'},
-                                               {a: { required: true, pattern: 'foo', patternFlags: 'i'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'aafoobarasdsad'},
-                                               {a: { required: true, pattern: 'foo'}}));
-  do_check_false(ActivitiesServiceFilter.match({a: 'aaFOOsdsad'},
-                                               {a: { required: true, pattern: 'foobar'}}));
-  do_check_true(ActivitiesServiceFilter.match({a: 'FoOBaR'},
-                                              {a: { required: true, pattern: 'foobar', patternFlags: 'i'}}));
-
-  // Bug 923274
-  do_check_true(ActivitiesServiceFilter.match({a:[]}, {a:'a'}));
-  do_check_false(ActivitiesServiceFilter.match({a:[]}, {a: { required: true, value: 'a'}}));
-}
deleted file mode 100644
--- a/dom/activities/tests/unit/xpcshell.ini
+++ /dev/null
@@ -1,6 +0,0 @@
-[DEFAULT]
-head =
-tail =
-skip-if = toolkit == 'gonk'
-
-[test_activityFilters.js]
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -64,17 +64,17 @@ public:
     , mFinishedIsResolved(false)
   {
   }
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(Animation,
                                            DOMEventTargetHelper)
 
-  AnimationTimeline* GetParentObject() const { return mTimeline; }
+  nsIGlobalObject* GetParentObject() const { return GetOwnerGlobal(); }
   virtual JSObject* WrapObject(JSContext* aCx,
                                JS::Handle<JSObject*> aGivenProto) override;
 
   virtual CSSAnimation* AsCSSAnimation() { return nullptr; }
   virtual const CSSAnimation* AsCSSAnimation() const { return nullptr; }
   virtual CSSTransition* AsCSSTransition() { return nullptr; }
   virtual const CSSTransition* AsCSSTransition() const { return nullptr; }
 
--- a/dom/apps/PermissionsTable.jsm
+++ b/dom/apps/PermissionsTable.jsm
@@ -497,22 +497,16 @@ this.PermissionsTable =  { geolocation: 
                               trusted: DENY_ACTION,
                               privileged: ALLOW_ACTION,
                               certified: ALLOW_ACTION
                            },
                            "system-app-only-audio-channels-in-app": {
                              app: DENY_ACTION,
                              privileged: DENY_ACTION,
                              certified: ALLOW_ACTION
-                           },
-                           "killswitch": {
-                             app: DENY_ACTION,
-                             trusted: DENY_ACTION,
-                             privileged: DENY_ACTION,
-                             certified: ALLOW_ACTION
                            }
                          };
 
 /**
  * Append access modes to the permission name as suffixes.
  *   e.g. permission name 'contacts' with ['read', 'write'] =
  *   ['contacts-read', contacts-write']
  * @param string aPermName
--- a/dom/apps/Webapps.jsm
+++ b/dom/apps/Webapps.jsm
@@ -31,17 +31,16 @@ function buildIDToTime() {
 
 const PLATFORM_BUILD_ID_TIME = buildIDToTime();
 
 this.EXPORTED_SYMBOLS = ["DOMApplicationRegistry"];
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/FileUtils.jsm");
-Cu.import('resource://gre/modules/ActivitiesService.jsm');
 Cu.import("resource://gre/modules/AppsUtils.jsm");
 Cu.import("resource://gre/modules/AppDownloadManager.jsm");
 Cu.import("resource://gre/modules/osfile.jsm");
 Cu.import("resource://gre/modules/Task.jsm");
 Cu.import("resource://gre/modules/Promise.jsm");
 Cu.import("resource://gre/modules/MessageBroadcaster.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "UserCustomizations", function() {
--- a/dom/audiochannel/AudioChannelAgent.cpp
+++ b/dom/audiochannel/AudioChannelAgent.cpp
@@ -2,22 +2,21 @@
 /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 /* 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/. */
 
 #include "AudioChannelAgent.h"
 #include "AudioChannelService.h"
 #include "mozilla/Preferences.h"
-#include "nsIAppsService.h"
+#include "nsContentUtils.h"
 #include "nsIDocument.h"
 #include "nsIDOMWindow.h"
-#include "nsIPrincipal.h"
 #include "nsPIDOMWindow.h"
-#include "nsXULAppAPI.h"
+#include "nsIURI.h"
 
 using namespace mozilla::dom;
 
 NS_IMPL_CYCLE_COLLECTION_CLASS(AudioChannelAgent)
 
 NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(AudioChannelAgent)
   tmp->Shutdown();
   NS_IMPL_CYCLE_COLLECTION_UNLINK(mWindow)
@@ -107,48 +106,37 @@ AudioChannelAgent::FindCorrectWindow(nsP
     return NS_OK;
   }
 
   nsCOMPtr<nsIDocument> doc = parent->GetExtantDoc();
   if (!doc) {
     return NS_OK;
   }
 
-  nsCOMPtr<nsIPrincipal> principal = doc->NodePrincipal();
-
-  uint32_t appId;
-  nsresult rv = principal->GetAppId(&appId);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
+  if (nsContentUtils::IsChromeDoc(doc)) {
+    return NS_OK;
   }
 
-  if (appId == nsIScriptSecurityManager::NO_APP_ID ||
-      appId == nsIScriptSecurityManager::UNKNOWN_APP_ID) {
+  nsAdoptingCString systemAppUrl =
+    mozilla::Preferences::GetCString("b2g.system_startup_url");
+  if (!systemAppUrl) {
     return NS_OK;
   }
 
-  nsCOMPtr<nsIAppsService> appsService = do_GetService(APPS_SERVICE_CONTRACTID);
-  if (NS_WARN_IF(!appsService)) {
-    return NS_ERROR_FAILURE;
-  }
+  nsCOMPtr<nsIPrincipal> principal = doc->NodePrincipal();
+  nsCOMPtr<nsIURI> uri;
+  principal->GetURI(getter_AddRefs(uri));
 
-  nsAdoptingString systemAppManifest =
-    mozilla::Preferences::GetString("b2g.system_manifest_url");
-  if (!systemAppManifest) {
-    return NS_OK;
-  }
+  if (uri) {
+    nsAutoCString spec;
+    uri->GetSpec(spec);
 
-  uint32_t systemAppId;
-  rv = appsService->GetAppLocalIdByManifestURL(systemAppManifest, &systemAppId);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return rv;
-  }
-
-  if (systemAppId == appId) {
-    return NS_OK;
+    if (spec.Equals(systemAppUrl)) {
+      return NS_OK;
+    }
   }
 
   return FindCorrectWindow(parent);
 }
 
 nsresult
 AudioChannelAgent::InitInternal(nsPIDOMWindowInner* aWindow,
                                 int32_t aChannelType,
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -72,17 +72,16 @@
 #include "nsNetUtil.h"
 #include "nsStringStream.h"
 #include "nsComponentManagerUtils.h"
 #include "nsIStringStream.h"
 #include "nsIHttpChannel.h"
 #include "nsIHttpChannelInternal.h"
 #include "TimeManager.h"
 #include "DeviceStorage.h"
-#include "nsIDOMNavigatorSystemMessages.h"
 #include "nsStreamUtils.h"
 #include "nsIAppsService.h"
 #include "mozIApplication.h"
 #include "WidgetUtils.h"
 #include "nsIPresentationService.h"
 
 #include "mozilla/dom/MediaDevices.h"
 #include "MediaManager.h"
@@ -253,17 +252,16 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(
 #ifdef MOZ_B2G_BT
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBluetooth)
 #endif
 #ifdef MOZ_AUDIO_CHANNEL_MANAGER
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAudioChannelManager)
 #endif
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCameraManager)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaDevices)
-  NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMessagesManager)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTimeManager)
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mServiceWorkerContainer)
 
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow)
 #ifdef MOZ_EME
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaKeySystemAccessManager)
 #endif
   NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mDeviceStorageAreaListener)
@@ -368,20 +366,16 @@ Navigator::Invalidate()
   if (mBluetooth) {
     mBluetooth = nullptr;
   }
 #endif
 
   mCameraManager = nullptr;
   mMediaDevices = nullptr;
 
-  if (mMessagesManager) {
-    mMessagesManager = nullptr;
-  }
-
 #ifdef MOZ_AUDIO_CHANNEL_MANAGER
   if (mAudioChannelManager) {
     mAudioChannelManager = nullptr;
   }
 #endif
 
   uint32_t len = mDeviceStorageStores.Length();
   for (uint32_t i = 0; i < len; ++i) {
@@ -2126,112 +2120,16 @@ Navigator::GetMozBluetooth(ErrorResult& 
     }
     mBluetooth = bluetooth::BluetoothManager::Create(mWindow);
   }
 
   return mBluetooth;
 }
 #endif //MOZ_B2G_BT
 
-nsresult
-Navigator::EnsureMessagesManager()
-{
-  if (mMessagesManager) {
-    return NS_OK;
-  }
-
-  NS_ENSURE_STATE(mWindow);
-
-  nsresult rv;
-  nsCOMPtr<nsIDOMNavigatorSystemMessages> messageManager =
-    do_CreateInstance("@mozilla.org/system-message-manager;1", &rv);
-
-  nsCOMPtr<nsIDOMGlobalPropertyInitializer> gpi =
-    do_QueryInterface(messageManager);
-  NS_ENSURE_TRUE(gpi, NS_ERROR_FAILURE);
-
-  // We don't do anything with the return value.
-  AutoJSContext cx;
-  JS::Rooted<JS::Value> prop_val(cx);
-  rv = gpi->Init(mWindow, &prop_val);
-  NS_ENSURE_SUCCESS(rv, rv);
-
-  mMessagesManager = messageManager.forget();
-
-  return NS_OK;
-}
-
-bool
-Navigator::MozHasPendingMessage(const nsAString& aType, ErrorResult& aRv)
-{
-  // The WebIDL binding is responsible for the pref check here.
-  nsresult rv = EnsureMessagesManager();
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
-    return false;
-  }
-
-  bool result = false;
-  rv = mMessagesManager->MozHasPendingMessage(aType, &result);
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
-    return false;
-  }
-  return result;
-}
-
-void
-Navigator::MozSetMessageHandlerPromise(Promise& aPromise,
-                                       ErrorResult& aRv)
-{
-  // The WebIDL binding is responsible for the pref check here.
-  aRv = EnsureMessagesManager();
-  if (NS_WARN_IF(aRv.Failed())) {
-    return;
-  }
-
-  bool result = false;
-  aRv = mMessagesManager->MozIsHandlingMessage(&result);
-  if (NS_WARN_IF(aRv.Failed())) {
-    return;
-  }
-
-  if (!result) {
-    aRv.Throw(NS_ERROR_DOM_INVALID_ACCESS_ERR);
-    return;
-  }
-
-  aRv = mMessagesManager->MozSetMessageHandlerPromise(&aPromise);
-  if (NS_WARN_IF(aRv.Failed())) {
-    return;
-  }
-}
-
-void
-Navigator::MozSetMessageHandler(const nsAString& aType,
-                                systemMessageCallback* aCallback,
-                                ErrorResult& aRv)
-{
-  // The WebIDL binding is responsible for the pref check here.
-  nsresult rv = EnsureMessagesManager();
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
-    return;
-  }
-
-  CallbackObjectHolder<systemMessageCallback, nsIDOMSystemMessageCallback>
-    holder(aCallback);
-  nsCOMPtr<nsIDOMSystemMessageCallback> callback = holder.ToXPCOMCallback();
-
-  rv = mMessagesManager->MozSetMessageHandler(aType, callback);
-  if (NS_FAILED(rv)) {
-    aRv.Throw(rv);
-  }
-}
-
 #ifdef MOZ_TIME_MANAGER
 time::TimeManager*
 Navigator::GetMozTime(ErrorResult& aRv)
 {
   if (!mWindow) {
     aRv.Throw(NS_ERROR_UNEXPECTED);
     return nullptr;
   }
--- a/dom/base/Navigator.h
+++ b/dom/base/Navigator.h
@@ -142,19 +142,16 @@ public:
    */
   void SetWindow(nsPIDOMWindowInner *aInnerWindow);
 
   /**
    * Called when the inner window navigates to a new page.
    */
   void OnNavigation();
 
-  // Helper to initialize mMessagesManager.
-  nsresult EnsureMessagesManager();
-
   // The XPCOM GetProduct is OK
   // The XPCOM GetLanguage is OK
   void GetUserAgent(nsString& aUserAgent, ErrorResult& /* unused */)
   {
     GetUserAgent(aUserAgent);
   }
   bool OnLine();
   void RegisterProtocolHandler(const nsAString& aScheme, const nsAString& aURL,
@@ -246,21 +243,16 @@ public:
   Telephony* GetMozTelephony(ErrorResult& aRv);
   Voicemail* GetMozVoicemail(ErrorResult& aRv);
   TVManager* GetTv();
   InputPortManager* GetInputPortManager(ErrorResult& aRv);
   already_AddRefed<LegacyMozTCPSocket> MozTCPSocket();
   network::Connection* GetConnection(ErrorResult& aRv);
   nsDOMCameraManager* GetMozCameras(ErrorResult& aRv);
   MediaDevices* GetMediaDevices(ErrorResult& aRv);
-  void MozSetMessageHandler(const nsAString& aType,
-                            systemMessageCallback* aCallback,
-                            ErrorResult& aRv);
-  bool MozHasPendingMessage(const nsAString& aType, ErrorResult& aRv);
-  void MozSetMessageHandlerPromise(Promise& aPromise, ErrorResult& aRv);
 
 #ifdef MOZ_B2G
   already_AddRefed<Promise> GetMobileIdAssertion(const MobileIdOptions& options,
                                                  ErrorResult& aRv);
 #endif
 #ifdef MOZ_B2G_RIL
   MobileConnectionArray* GetMozMobileConnections(ErrorResult& aRv);
 #endif // MOZ_B2G_RIL
@@ -388,17 +380,16 @@ private:
 #ifdef MOZ_B2G_BT
   RefPtr<bluetooth::BluetoothManager> mBluetooth;
 #endif
 #ifdef MOZ_AUDIO_CHANNEL_MANAGER
   RefPtr<system::AudioChannelManager> mAudioChannelManager;
 #endif
   RefPtr<nsDOMCameraManager> mCameraManager;
   RefPtr<MediaDevices> mMediaDevices;
-  nsCOMPtr<nsIDOMNavigatorSystemMessages> mMessagesManager;
   nsTArray<nsWeakPtr> mDeviceStorageStores;
   RefPtr<time::TimeManager> mTimeManager;
   RefPtr<ServiceWorkerContainer> mServiceWorkerContainer;
   nsCOMPtr<nsPIDOMWindowInner> mWindow;
   RefPtr<DeviceStorageAreaListener> mDeviceStorageAreaListener;
   RefPtr<Presentation> mPresentation;
 #ifdef MOZ_GAMEPAD
   RefPtr<GamepadServiceTest> mGamepadServiceTest;
--- a/dom/base/nsGkAtomList.h
+++ b/dom/base/nsGkAtomList.h
@@ -368,17 +368,16 @@ GK_ATOM(end_before, "end_before")
 GK_ATOM(equalsize, "equalsize")
 GK_ATOM(error, "error")
 GK_ATOM(even, "even")
 GK_ATOM(event, "event")
 GK_ATOM(events, "events")
 GK_ATOM(excludeResultPrefixes, "exclude-result-prefixes")
 GK_ATOM(excludes, "excludes")
 GK_ATOM(expr, "expr")
-GK_ATOM(expectingSystemMessage, "expecting-system-message")
 GK_ATOM(extends, "extends")
 GK_ATOM(extensionElementPrefixes, "extension-element-prefixes")
 GK_ATOM(face, "face")
 GK_ATOM(fallback, "fallback")
 GK_ATOM(_false, "false")
 GK_ATOM(farthest, "farthest")
 GK_ATOM(field, "field")
 GK_ATOM(fieldset, "fieldset")
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -72,20 +72,16 @@
 #   and the other should have 'workers':False (or left unset). These will
 #   be used to generate bindings for workers and for mainthread, as you would
 #   expect.
 # Nothing else is allowed.  If you have a list with a single 'workers':False
 # entry, just make it not a list.
 
 DOMInterfaces = {
 
-'MozActivity': {
-    'nativeType': 'mozilla::dom::Activity',
-},
-
 'AbstractWorker': {
     'concrete': False
 },
 
 'AnimationEffectReadOnly': {
     'concrete': False
 },
 
--- a/dom/bindings/GenerateCSS2PropertiesWebIDL.py
+++ b/dom/bindings/GenerateCSS2PropertiesWebIDL.py
@@ -12,16 +12,17 @@ from mozbuild import shellutil
 # Generates a line of WebIDL with the given spelling of the property name
 # (whether camelCase, _underscorePrefixed, etc.) and the given array of
 # extended attributes.
 def generateLine(propName, extendedAttrs):
     return "  [%s] attribute DOMString %s;\n" % (", ".join(extendedAttrs),
                                                  propName)
 def generate(output, idlFilename, preprocessorHeader):
     cpp = shellutil.split(buildconfig.substs['CPP'])
+    cpp += shellutil.split(buildconfig.substs['ACDEFINES'])
     cpp.append(preprocessorHeader)
     preprocessed = subprocess.check_output(cpp)
 
     propList = eval(preprocessed)
     props = ""
     for [name, prop, id, flags, pref, proptype] in propList:
         if "CSS_PROPERTY_INTERNAL" in flags:
             continue
--- a/dom/browser-element/BrowserElementAudioChannel.cpp
+++ b/dom/browser-element/BrowserElementAudioChannel.cpp
@@ -5,33 +5,26 @@
 #include "BrowserElementAudioChannel.h"
 
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
 #include "mozilla/dom/BrowserElementAudioChannelBinding.h"
 #include "mozilla/dom/DOMRequest.h"
 #include "mozilla/dom/Element.h"
 #include "mozilla/dom/TabParent.h"
-#include "mozilla/dom/Promise.h"
-#include "mozilla/dom/PromiseNativeHandler.h"
 #include "mozilla/dom/ToJSValue.h"
 #include "AudioChannelService.h"
-#include "nsIAppsService.h"
+#include "nsContentUtils.h"
 #include "nsIBrowserElementAPI.h"
 #include "nsIDocShell.h"
-#include "nsIDOMDocument.h"
 #include "nsIDOMDOMRequest.h"
 #include "nsIObserverService.h"
 #include "nsISupportsPrimitives.h"
-#include "nsISystemMessagesInternal.h"
 #include "nsITabParent.h"
-#include "nsNetUtil.h"
 #include "nsPIDOMWindow.h"
-#include "nsServiceManagerUtils.h"
-#include "nsContentUtils.h"
 
 namespace mozilla {
 namespace dom {
 
 NS_IMPL_ADDREF_INHERITED(BrowserElementAudioChannel, DOMEventTargetHelper)
 NS_IMPL_RELEASE_INHERITED(BrowserElementAudioChannel, DOMEventTargetHelper)
 
 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(BrowserElementAudioChannel)
@@ -46,22 +39,20 @@ NS_IMPL_CYCLE_COLLECTION_INHERITED(Brows
                                    mTabParent,
                                    mBrowserElementAPI)
 
 /* static */ already_AddRefed<BrowserElementAudioChannel>
 BrowserElementAudioChannel::Create(nsPIDOMWindowInner* aWindow,
                                    nsIFrameLoader* aFrameLoader,
                                    nsIBrowserElementAPI* aAPI,
                                    AudioChannel aAudioChannel,
-                                   const nsAString& aManifestURL,
                                    ErrorResult& aRv)
 {
   RefPtr<BrowserElementAudioChannel> ac =
-    new BrowserElementAudioChannel(aWindow, aFrameLoader, aAPI,
-                                   aAudioChannel, aManifestURL);
+    new BrowserElementAudioChannel(aWindow, aFrameLoader, aAPI, aAudioChannel);
 
   aRv = ac->Initialize();
   if (NS_WARN_IF(aRv.Failed())) {
     return nullptr;
   }
 
   MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
          ("BrowserElementAudioChannel, Create, channel = %p, type = %d\n",
@@ -69,23 +60,21 @@ BrowserElementAudioChannel::Create(nsPID
 
   return ac.forget();
 }
 
 BrowserElementAudioChannel::BrowserElementAudioChannel(
 						nsPIDOMWindowInner* aWindow,
 						nsIFrameLoader* aFrameLoader,
                                                 nsIBrowserElementAPI* aAPI,
-                                                AudioChannel aAudioChannel,
-                                                const nsAString& aManifestURL)
+                                                AudioChannel aAudioChannel)
   : DOMEventTargetHelper(aWindow)
   , mFrameLoader(aFrameLoader)
   , mBrowserElementAPI(aAPI)
   , mAudioChannel(aAudioChannel)
-  , mManifestURL(aManifestURL)
   , mState(eStateUnknown)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
   if (obs) {
     nsAutoString name;
     AudioChannelService::GetAudioChannelString(aAudioChannel, name);
@@ -310,53 +299,16 @@ public:
 protected:
   virtual void DoWork(AudioChannelService* aService, JSContext* aCx) override
   {
     JS::Rooted<JS::Value> value(aCx);
     mRequest->FireSuccess(value);
   }
 };
 
-class RespondSuccessHandler final : public PromiseNativeHandler
-{
-public:
-  NS_DECL_ISUPPORTS
-
-  explicit RespondSuccessHandler(DOMRequest* aRequest)
-    : mDomRequest(aRequest)
-  {};
-
-  virtual void
-  ResolvedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
-
-  virtual void
-  RejectedCallback(JSContext* aCx, JS::Handle<JS::Value> aValue) override;
-
-private:
-  ~RespondSuccessHandler() {};
-
-  RefPtr<DOMRequest> mDomRequest;
-};
-NS_IMPL_ISUPPORTS0(RespondSuccessHandler);
-
-void
-RespondSuccessHandler::ResolvedCallback(JSContext* aCx,
-                                        JS::Handle<JS::Value> aValue)
-{
-  JS::Rooted<JS::Value> value(aCx);
-  mDomRequest->FireSuccess(value);
-}
-
-void
-RespondSuccessHandler::RejectedCallback(JSContext* aCx,
-                                        JS::Handle<JS::Value> aValue)
-{
-  mDomRequest->FireError(NS_ERROR_FAILURE);
-}
-
 } // anonymous namespace
 
 already_AddRefed<dom::DOMRequest>
 BrowserElementAudioChannel::GetVolume(ErrorResult& aRv)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (!mFrameWindow) {
@@ -499,67 +451,16 @@ BrowserElementAudioChannel::IsActive(Err
 
   nsCOMPtr<nsIRunnable> runnable =
     new IsActiveRunnable(GetOwner(), mFrameWindow, domRequest, mAudioChannel);
   NS_DispatchToMainThread(runnable);
 
   return domRequest.forget();
 }
 
-already_AddRefed<dom::DOMRequest>
-BrowserElementAudioChannel::NotifyChannel(const nsAString& aEvent,
-                                          ErrorResult& aRv)
-{
-  MOZ_ASSERT(NS_IsMainThread());
-  MOZ_ASSERT(XRE_IsParentProcess());
-
-  if (!mFrameWindow) {
-    nsCOMPtr<nsIDOMDOMRequest> request;
-    aRv = mBrowserElementAPI->NotifyChannel(aEvent, mManifestURL,
-                                            (uint32_t)mAudioChannel,
-                                            getter_AddRefs(request));
-    if (NS_WARN_IF(aRv.Failed())) {
-      return nullptr;
-    }
-
-    return request.forget().downcast<DOMRequest>();
-  }
-
-  nsCOMPtr<nsISystemMessagesInternal> systemMessenger =
-    do_GetService("@mozilla.org/system-message-internal;1");
-  MOZ_ASSERT(systemMessenger);
-
-  JS::Rooted<JS::Value> value(nsContentUtils::RootingCxForThread());
-  value.setInt32((uint32_t)mAudioChannel);
-
-  nsCOMPtr<nsIURI> manifestURI;
-  nsresult rv = NS_NewURI(getter_AddRefs(manifestURI), mManifestURL);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return nullptr;
-  }
-
-  // Since the pageURI of the app has been registered to the system messager,
-  // when the app was installed. The system messager can only use the manifest
-  // to send the message to correct page.
-  nsCOMPtr<nsISupports> promise;
-  rv = systemMessenger->SendMessage(aEvent, value, nullptr, manifestURI,
-                                    JS::UndefinedHandleValue,
-                                    getter_AddRefs(promise));
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return nullptr;
-  }
-
-  RefPtr<Promise> promiseIns = static_cast<Promise*>(promise.get());
-  RefPtr<DOMRequest> request = new DOMRequest(GetOwner());
-  RefPtr<RespondSuccessHandler> handler = new RespondSuccessHandler(request);
-  promiseIns->AppendNativeHandler(handler);
-
-  return request.forget();
-}
-
 NS_IMETHODIMP
 BrowserElementAudioChannel::Observe(nsISupports* aSubject, const char* aTopic,
                                     const char16_t* aData)
 {
   nsAutoString name;
   AudioChannelService::GetAudioChannelString(mAudioChannel, name);
 
   nsAutoCString topic;
@@ -623,44 +524,37 @@ BrowserElementAudioChannel::ProcessState
 bool
 BrowserElementAudioChannel::IsSystemAppWindow(nsPIDOMWindowOuter* aWindow) const
 {
   nsCOMPtr<nsIDocument> doc = aWindow->GetExtantDoc();
   if (!doc) {
     return false;
   }
 
-  uint32_t appId;
-  nsCOMPtr<nsIPrincipal> principal = doc->NodePrincipal();
-  nsresult rv = principal->GetAppId(&appId);
-  if (NS_WARN_IF(NS_FAILED(rv))) {
-    return false;
+  if (nsContentUtils::IsChromeDoc(doc)) {
+    return true;
   }
 
-  if (appId == nsIScriptSecurityManager::NO_APP_ID ||
-      appId == nsIScriptSecurityManager::UNKNOWN_APP_ID) {
+  nsAdoptingCString systemAppUrl =
+    mozilla::Preferences::GetCString("b2g.system_startup_url");
+  if (!systemAppUrl) {
     return false;
   }
 
-  nsCOMPtr<nsIAppsService> appsService = do_GetService(APPS_SERVICE_CONTRACTID);
-  if (NS_WARN_IF(!appsService)) {
-    return false;
-  }
+  nsCOMPtr<nsIPrincipal> principal = doc->NodePrincipal();
+  nsCOMPtr<nsIURI> uri;
+  principal->GetURI(getter_AddRefs(uri));
 
-  nsAdoptingString systemAppManifest =
-    mozilla::Preferences::GetString("b2g.system_manifest_url");
-  if (!systemAppManifest) {
-    return false;
-  }
+  if (uri) {
+    nsAutoCString spec;
+    uri->GetSpec(spec);
 
-  uint32_t systemAppId;
-  appsService->GetAppLocalIdByManifestURL(systemAppManifest, &systemAppId);
-
-  if (systemAppId == appId) {
-    return true;
+    if (spec.Equals(systemAppUrl)) {
+      return true;
+    }
   }
 
   return false;
 }
 
 nsresult
 BrowserElementAudioChannel::IsFromNestedFrame(nsISupports* aSubject,
                                               bool& aIsNested) const
--- a/dom/browser-element/BrowserElementAudioChannel.h
+++ b/dom/browser-element/BrowserElementAudioChannel.h
@@ -35,17 +35,16 @@ public:
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(BrowserElementAudioChannel,
                                            DOMEventTargetHelper)
 
   static already_AddRefed<BrowserElementAudioChannel>
   Create(nsPIDOMWindowInner* aWindow,
          nsIFrameLoader* aFrameLoader,
          nsIBrowserElementAPI* aAPI,
          AudioChannel aAudioChannel,
-         const nsAString& aManifestURL,
          ErrorResult& aRv);
 
   // WebIDL methods
 
   virtual JSObject* WrapObject(JSContext *aCx,
                                JS::Handle<JSObject*> aGivenProto) override;
 
   AudioChannel Name() const;
@@ -53,27 +52,23 @@ public:
   already_AddRefed<dom::DOMRequest> GetVolume(ErrorResult& aRv);
   already_AddRefed<dom::DOMRequest> SetVolume(float aVolume, ErrorResult& aRv);
 
   already_AddRefed<dom::DOMRequest> GetMuted(ErrorResult& aRv);
   already_AddRefed<dom::DOMRequest> SetMuted(bool aMuted, ErrorResult& aRv);
 
   already_AddRefed<dom::DOMRequest> IsActive(ErrorResult& aRv);
 
-  already_AddRefed<dom::DOMRequest> NotifyChannel(const nsAString& aEvent,
-                                                  ErrorResult& aRv);
-
   IMPL_EVENT_HANDLER(activestatechanged);
 
 private:
   BrowserElementAudioChannel(nsPIDOMWindowInner* aWindow,
                              nsIFrameLoader* aFrameLoader,
                              nsIBrowserElementAPI* aAPI,
-                             AudioChannel aAudioChannel,
-                             const nsAString& aManifestURL);
+                             AudioChannel aAudioChannel);
 
   bool IsSystemAppWindow(nsPIDOMWindowOuter* aWindow) const;
 
   // This method is used to check whether we're in the nested-mozbrower-frame
   // situation, see bug1214148.
   nsresult IsFromNestedFrame(nsISupports* aSubject,
                              bool& aIsNested) const;
 
@@ -83,17 +78,16 @@ private:
 
   void ProcessStateChanged(const char16_t* aData);
 
   nsCOMPtr<nsIFrameLoader> mFrameLoader;
   nsCOMPtr<nsIBrowserElementAPI> mBrowserElementAPI;
   nsCOMPtr<nsITabParent> mTabParent;
   nsCOMPtr<nsPIDOMWindowOuter> mFrameWindow;
   AudioChannel mAudioChannel;
-  nsString mManifestURL;
 
   enum {
     eStateActive,
     eStateInactive,
     eStateUnknown
   } mState;
 };
 
--- a/dom/browser-element/BrowserElementParent.js
+++ b/dom/browser-element/BrowserElementParent.js
@@ -19,20 +19,16 @@ Cu.import("resource://gre/modules/NetUti
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/BrowserElementPromptService.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "DOMApplicationRegistry", function () {
   Cu.import("resource://gre/modules/Webapps.jsm");
   return DOMApplicationRegistry;
 });
 
-XPCOMUtils.defineLazyServiceGetter(this, "systemMessenger",
-                                   "@mozilla.org/system-message-internal;1",
-                                   "nsISystemMessagesInternal");
-
 function debug(msg) {
   //dump("BrowserElementParent - " + msg + "\n");
 }
 
 function getIntPref(prefName, def) {
   try {
     return Services.prefs.getIntPref(prefName);
   }
@@ -1182,36 +1178,16 @@ BrowserElementParent.prototype = {
                                  muted: aMuted});
   },
 
   isAudioChannelActive: function(aAudioChannel) {
     return this._sendDOMRequest('get-is-audio-channel-active',
                                 {audioChannel: aAudioChannel});
   },
 
-  notifyChannel: function(aEvent, aManifest, aAudioChannel) {
-    var self = this;
-    var req = Services.DOMRequest.createRequest(self._window);
-
-    // Since the pageURI of the app has been registered to the system messager,
-    // when the app was installed. The system messager can only use the manifest
-    // to send the message to correct page.
-    let manifestURL = Services.io.newURI(aManifest, null, null);
-    systemMessenger.sendMessage(aEvent, aAudioChannel, null, manifestURL)
-      .then(function() {
-        Services.DOMRequest.fireSuccess(req,
-          Cu.cloneInto(true, self._window));
-      }, function() {
-        debug("Error : NotifyChannel fail.");
-        Services.DOMRequest.fireErrorAsync(req,
-          Cu.cloneInto("NotifyChannel fail.", self._window));
-      });
-    return req;
-  },
-
   getWebManifest: defineDOMRequestMethod('get-web-manifest'),
   /**
    * Called when the visibility of the window which owns this iframe changes.
    */
   _ownerVisibilityChange: function() {
     this._sendAsyncMsg('owner-visibility-change',
                        {visible: !this._window.document.hidden});
   },
--- a/dom/browser-element/mochitest/browserElement_ActiveStateChange.js
+++ b/dom/browser-element/mochitest/browserElement_ActiveStateChange.js
@@ -67,17 +67,16 @@ function runTests() {
 
   finish();
   yield undefined;
 }
 
 function setupTestFrame() {
   testFrame = document.createElement('iframe');
   testFrame.setAttribute('mozbrowser', 'true');
-  testFrame.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   testFrame.src = fileURL;
 
   function loadend() {
     testFrame.removeEventListener('mozbrowserloadend', loadend);
     ok("allowedAudioChannels" in testFrame, "allowedAudioChannels exist");
     var channels = testFrame.allowedAudioChannels;
     is(channels.length, 1, "1 audio channel by default");
 
@@ -97,14 +96,14 @@ function setupTestFrame() {
   }
 
   testFrame.addEventListener('mozbrowserloadend', loadend);
   testFrame.addEventListener('mozbrowsershowmodalprompt', alertError);
   document.body.appendChild(testFrame);
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(setupTestFrame);
   });
 });
 
--- a/dom/browser-element/mochitest/browserElement_AudioChannel.js
+++ b/dom/browser-element/mochitest/browserElement_AudioChannel.js
@@ -8,17 +8,16 @@
 SimpleTest.waitForExplicitFinish();
 browserElementTestHelpers.setEnabledPref(true);
 browserElementTestHelpers.addPermission();
 
 function noaudio() {
   info("Test : no-audio");
   var iframe = document.createElement('iframe');
   iframe.setAttribute('mozbrowser', 'true');
-  iframe.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   iframe.src = 'http://example.org/tests/dom/browser-element/mochitest/file_empty.html';
 
   function noaudio_loadend() {
     ok("mute" in iframe, "iframe.mute exists");
     ok("unmute" in iframe, "iframe.unmute exists");
     ok("getMuted" in iframe, "iframe.getMuted exists");
     ok("getVolume" in iframe, "iframe.getVolume exists");
     ok("setVolume" in iframe, "iframe.setVolume exists");
@@ -142,17 +141,16 @@ function noaudio() {
   iframe.addEventListener('mozbrowserloadend', noaudio_loadend);
   document.body.appendChild(iframe);
 }
 
 function audio() {
   info("Test : audio");
   var iframe = document.createElement('iframe');
   iframe.setAttribute('mozbrowser', 'true');
-  iframe.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   iframe.src = 'http://example.org/tests/dom/browser-element/mochitest/iframe_file_audio.html';
 
   function audio_loadend() {
     ok("mute" in iframe, "iframe.mute exists");
     ok("unmute" in iframe, "iframe.unmute exists");
     ok("getMuted" in iframe, "iframe.getMuted exists");
     ok("getVolume" in iframe, "iframe.getVolume exists");
     ok("setVolume" in iframe, "iframe.setVolume exists");
@@ -166,17 +164,17 @@ function audio() {
     ok(ac instanceof BrowserElementAudioChannel, "Correct class");
     ok("getVolume" in ac, "ac.getVolume exists");
     ok("setVolume" in ac, "ac.setVolume exists");
     ok("getMuted" in ac, "ac.getMuted exists");
     ok("setMuted" in ac, "ac.setMuted exists");
     ok("isActive" in ac, "ac.isActive exists");
 
     ac.onactivestatechanged = function() {
-      ok("activestatechanged event received.");
+      ok(true, "activestatechanged event received.");
       ac.onactivestatechanged = null;
       document.body.removeChild(iframe);
       runTests();
     }
   }
 
   iframe.addEventListener('mozbrowserloadend', audio_loadend);
   document.body.appendChild(iframe);
@@ -190,13 +188,13 @@ function runTests() {
     return;
   }
 
   var test = tests.shift();
   test();
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(runTests);
   });
 });
--- a/dom/browser-element/mochitest/browserElement_AudioChannelMutedByDefault.js
+++ b/dom/browser-element/mochitest/browserElement_AudioChannelMutedByDefault.js
@@ -67,17 +67,16 @@ function setCommand(aArg) {
 
 function runTests() {
   setCommand('play');
 }
 
 function setupTestFrame() {
   testFrame = document.createElement('iframe');
   testFrame.setAttribute('mozbrowser', 'true');
-  testFrame.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   testFrame.src = fileURL;
 
   function loadend() {
     testFrame.removeEventListener('mozbrowserloadend', loadend);
     ok("allowedAudioChannels" in testFrame, "allowedAudioChannels exist");
     var channels = testFrame.allowedAudioChannels;
     is(channels.length, 1, "1 audio channel by default");
 
@@ -92,14 +91,14 @@ function setupTestFrame() {
 
   info("Set EventListeners.");
   testFrame.addEventListener('mozbrowsershowmodalprompt', alertListener);
   testFrame.addEventListener('mozbrowserloadend', loadend);
   document.body.appendChild(testFrame);
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"],
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href],
                                      ["dom.audiochannel.mutedByDefault", true]]},
                             function() {
     SimpleTest.executeSoon(setupTestFrame);
   });
-});
\ No newline at end of file
+});
--- a/dom/browser-element/mochitest/browserElement_AudioChannelSeeking.js
+++ b/dom/browser-element/mochitest/browserElement_AudioChannelSeeking.js
@@ -93,17 +93,16 @@ function runTests() {
 
   finish();
   yield undefined;
 }
 
 function setupTestFrame() {
   testFrame = document.createElement('iframe');
   testFrame.setAttribute('mozbrowser', 'true');
-  testFrame.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   testFrame.src = fileURL;
 
   function loadend() {
     testFrame.removeEventListener('mozbrowserloadend', loadend);
     ok("allowedAudioChannels" in testFrame, "allowedAudioChannels exist");
     var channels = testFrame.allowedAudioChannels;
     is(channels.length, 1, "1 audio channel by default");
 
@@ -118,13 +117,13 @@ function setupTestFrame() {
   testFrame.addEventListener('mozbrowserloadend', loadend);
   ok(true, "Add event-listeners.");
 
   document.body.appendChild(testFrame);
   ok(true, "Append test-frame to document.");
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(setupTestFrame);
   });
-});
\ No newline at end of file
+});
--- a/dom/browser-element/mochitest/browserElement_AudioChannel_nested.js
+++ b/dom/browser-element/mochitest/browserElement_AudioChannel_nested.js
@@ -7,17 +7,16 @@
 
 SimpleTest.waitForExplicitFinish();
 browserElementTestHelpers.setEnabledPref(true);
 browserElementTestHelpers.addPermission();
 
 function runTests() {
   var iframe = document.createElement('iframe');
   iframe.setAttribute('mozbrowser', 'true');
-  iframe.setAttribute('mozapp', 'http://example.org/manifest.webapp');
 
   var listener = function(e) {
     var message = e.detail.message;
     if (/^OK/.exec(message)) {
       ok(true, "Message from app: " + message);
     } else if (/^KO/.exec(message)) {
       ok(false, "Message from app: " + message);
     } else if (/DONE/.exec(message)) {
@@ -67,13 +66,13 @@ function runTests() {
     {'type': 'browser', 'allow': 1, 'context': context},
     {'type': 'embed-apps', 'allow': 1, 'context': context}
   ], function() {
     iframe.src = 'http://example.org/tests/dom/browser-element/mochitest/file_browserElement_AudioChannel_nested.html';
   });
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(runTests);
   });
 });
--- a/dom/browser-element/mochitest/browserElement_AudioPlayback.js
+++ b/dom/browser-element/mochitest/browserElement_AudioPlayback.js
@@ -64,13 +64,13 @@ function runTest() {
        'mozbrowseraudioplaybackchange should dispatch to the correct browser');
   });
 
   // Load a simple page to get the process started.
   iframe.src = browserElementTestHelpers.emptyPage1;
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(runTest);
   });
 });
--- a/dom/browser-element/mochitest/browserElement_MultipleAudioChannels.js
+++ b/dom/browser-element/mochitest/browserElement_MultipleAudioChannels.js
@@ -14,18 +14,18 @@ addLoadEvent(() => {
   SpecialPowers.pushPermissions(
     [{ "type": "webapps-manage", "allow": 1, "context": document },
      { "type": "browser", "allow": 1, "context": document },
      { "type": "embed-apps", "allow": 1, "context": document }],
     function() {
       SpecialPowers.pushPrefEnv(
         {'set': [["dom.mozBrowserFramesEnabled", true],
                  ["dom.webapps.useCurrentProfile", true],
-                 ["media.useAudioChannelAPI", true],
-                 ["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+                 ["b2g.system_startup_url", window.location.href],
+                 ["media.useAudioChannelAPI", true]]},
         () => { generator.next(); })
     });
 });
 
 function error(message) {
   ok(false, message);
   SimpleTest.finish();
 }
@@ -69,17 +69,16 @@ function runTest(aOOPCEnabled) {
   request.onsuccess = () => {
     app = request.result;
     ok(app, "App is installed.");
     is(app.manifestURL, manifestURI, "App manifest url is correct.");
 
     var iframe = document.createElement('iframe');
     iframe.setAttribute('mozbrowser', true);
     iframe.setAttribute('remote', aOOPCEnabled);
-    iframe.setAttribute('mozapp', manifestURI);
     iframe.src = srcURI;
 
     iframe.addEventListener('mozbrowserloadend', () => {
       var channels = iframe.allowedAudioChannels;
       is(channels.length, channelsNum, "Have two channels.");
 
       var activeCounter = 0;
       for (var idx = 0; idx < channelsNum; idx++) {
--- a/dom/browser-element/mochitest/browserElement_NoAudioTrack.js
+++ b/dom/browser-element/mochitest/browserElement_NoAudioTrack.js
@@ -56,17 +56,16 @@ function runTests() {
 
   finish();
   yield undefined;
 }
 
 function setupTestFrame() {
   testFrame = document.createElement('iframe');
   testFrame.setAttribute('mozbrowser', 'true');
-  testFrame.setAttribute('mozapp', 'http://example.org/manifest.webapp');
   testFrame.src = fileURL;
 
   function loadend() {
     testFrame.removeEventListener('mozbrowserloadend', loadend);
     ok("allowedAudioChannels" in testFrame, "allowedAudioChannels exist");
     var channels = testFrame.allowedAudioChannels;
     is(channels.length, 1, "1 audio channel by default");
 
@@ -86,13 +85,13 @@ function setupTestFrame() {
   testFrame.addEventListener('mozbrowsershowmodalprompt', alertListener);
   ok(true, "Add event-listeners.");
 
   document.body.appendChild(testFrame);
   ok(true, "Append test-frame to document.");
 }
 
 addEventListener('testready', function() {
-  SpecialPowers.pushPrefEnv({'set': [["b2g.system_manifest_url", "http://mochi.test:8888/manifest.webapp"]]},
+  SpecialPowers.pushPrefEnv({'set': [["b2g.system_startup_url", window.location.href]]},
                             function() {
     SimpleTest.executeSoon(setupTestFrame);
   });
 });
deleted file mode 100644
--- a/dom/browser-element/mochitest/browserElement_NotifyChannel.js
+++ /dev/null
@@ -1,128 +0,0 @@
-"use strict";
-
-SimpleTest.waitForExplicitFinish();
-
-const { classes: Cc, interfaces: Ci } = Components;
-const systemMessenger = Cc["@mozilla.org/system-message-internal;1"]
-                          .getService(Ci.nsISystemMessagesInternal);
-const ioService = Cc["@mozilla.org/network/io-service;1"]
-                    .getService(Ci.nsIIOService);
-
-var tests = [false /* INPROC */, true /* OOP */];
-var rootURI = "http://test/chrome/dom/browser-element/mochitest/";
-var manifestURI = rootURI + "manifest.webapp";
-var srcURI = rootURI +  "file_browserElement_NotifyChannel.html";
-var generator = runTests();
-var app = null;
-
-addLoadEvent(() => {
-  SpecialPowers.pushPermissions(
-    [{ "type": "webapps-manage", "allow": 1, "context": document },
-     { "type": "browser", "allow": 1, "context": document },
-     { "type": "embed-apps", "allow": 1, "context": document }],
-    function() {
-      SpecialPowers.pushPrefEnv(
-        {'set': [["dom.mozBrowserFramesEnabled", true],
-                 ["dom.sysmsg.enabled", true]]},
-        () => { generator.next(); })
-    });
-});
-
-function error(message) {
-  ok(false, message);
-  SimpleTest.finish();
-}
-
-function continueTest() {
-  try {
-    generator.next();
-  } catch (e if e instanceof StopIteration) {
-    error("Stop test because of exception!");
-  }
-}
-
-function registerPage(aEvent) {
-  systemMessenger.registerPage(aEvent,
-                               ioService.newURI(srcURI, null, null),
-                               ioService.newURI(manifestURI, null, null));
-}
-
-function uninstallApp() {
-  if (app) {
-    var request = navigator.mozApps.mgmt.uninstall(app);
-    app = null;
-    request.onerror = () => {
-      error("Uninstall app failed!");
-    };
-    request.onsuccess = () => {
-      is(request.result, manifestURI, "App uninstalled.");
-      runNextTest();
-    }
-  }
-}
-
-function runTest(aEnable) {
-  var request = navigator.mozApps.install(manifestURI, {});
-  request.onerror = () => {
-    error("Install app failed!");
-  };
-
-  request.onsuccess = () => {
-    app = request.result;
-    ok(app, "App is installed. remote = " + aEnable);
-    is(app.manifestURL, manifestURI, "App manifest url is correct.");
-
-    var iframe = document.createElement('iframe');
-    iframe.setAttribute('mozbrowser', true);
-    iframe.setAttribute('remote', aEnable);
-    iframe.setAttribute('mozapp', manifestURI);
-    iframe.src = srcURI;
-
-    function loadend() {
-      iframe.removeEventListener('mozbrowserloadend', loadend);
-      iframe.addEventListener("mozbrowsershowmodalprompt", getInterruption);
-      var channels = iframe.allowedAudioChannels;
-      is(channels.length, 1, "1 audio channel by default");
-
-      var ac = channels[0];
-      ok(ac instanceof BrowserElementAudioChannel, "Correct class");
-      ok("notifyChannel" in ac, "ac.notifyChannel exists");
-
-      var message = "audiochannel-interruption-begin";
-      registerPage(message);
-      ac.notifyChannel(message);
-
-      function getInterruption(e) {
-        e.target.removeEventListener("mozbrowsershowmodalprompt", getInterruption);
-        is(e.detail.message, message,
-           "App got audiochannel-interruption-begin.");
-
-        document.body.removeChild(iframe);
-        uninstallApp();
-      }
-    };
-
-    iframe.addEventListener("mozbrowserloadend", loadend);
-    document.body.appendChild(iframe);
-  };
-}
-
-function runNextTest() {
-  if (tests.length) {
-    var isEnabledOOP = tests.shift();
-    runTest(isEnabledOOP);
-  } else {
-    SimpleTest.finish();
-  }
-}
-
-function runTests() {
-  SpecialPowers.autoConfirmAppInstall(continueTest);
-  yield undefined;
-
-  SpecialPowers.autoConfirmAppUninstall(continueTest);
-  yield undefined;
-
-  runNextTest();
-  yield undefined;
-}
--- a/dom/browser-element/mochitest/chrome.ini
+++ b/dom/browser-element/mochitest/chrome.ini
@@ -1,18 +1,12 @@
 [DEFAULT]
 skip-if = (buildapp != 'b2g' && buildapp != 'mulet') || (buildapp == 'b2g' && (toolkit != 'gonk' || debug))
 
 support-files =
   audio.ogg
   browserElement_MultipleAudioChannels.js
-  browserElement_NotifyChannel.js
   file_browserElement_MultipleAudioChannels.html
-  file_browserElement_NotifyChannel.html
-  manifest.webapp
-  manifest.webapp^headers^
   multipleAudioChannels_manifest.webapp
   multipleAudioChannels_manifest.webapp^headers^
 
 [test_browserElement_MultipleAudioChannels.html]
 tags = audiochannel
-[test_browserElement_NotifyChannel.html]
-tags = audiochannel
deleted file mode 100644
--- a/dom/browser-element/mochitest/file_browserElement_NotifyChannel.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <title>Test of browser element audio channel method, notifyChannel</title>
-</head>
-<body>
-<script type="application/javascript;version=1.8">
-  "use strict";
-  navigator.mozSetMessageHandler('audiochannel-interruption-begin',
-    function (e) {
-      alert("audiochannel-interruption-begin");
-  });
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/dom/browser-element/mochitest/manifest.webapp
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-  "name": "NotifyChannel Test",
-  "launch_path": "/index.html",
-  "messages": [
-    { "audiochannel-interruption-begin": "./file_browserElement_NotifyChannel.html" }
-  ]
-}
deleted file mode 100644
--- a/dom/browser-element/mochitest/manifest.webapp^headers^
+++ /dev/null
@@ -1,1 +0,0 @@
-Content-Type: application/manifest+json
\ No newline at end of file
--- a/dom/browser-element/mochitest/priority/mochitest.ini
+++ b/dom/browser-element/mochitest/priority/mochitest.ini
@@ -22,13 +22,11 @@ support-files =
 [test_BackgroundLRU.html]
 [test_Activity.html]
 [test_Audio.html]
 [test_Keyboard.html]
 [test_MultipleActivities.html]
 [test_MultipleFrames.html]
 [test_Preallocated.html]
 disabled = bug 968604, bug 987164
-[test_ExpectingSystemMessage.html]
-[test_ExpectingSystemMessage2.html]
 [test_NestedFrames.html]
 [test_WebGLContextLost.html]
 disabled = bug 865844
deleted file mode 100644
--- a/dom/browser-element/mochitest/priority/test_ExpectingSystemMessage.html
+++ /dev/null
@@ -1,54 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-Test that a high-priority frame that's expecting a system message initially
-gets priority FOREGROUND_HIGH.
--->
-<head>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="../browserElementTestHelpers.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<script type="application/javascript;version=1.7">
-"use strict";
-
-SimpleTest.waitForExplicitFinish();
-browserElementTestHelpers.setEnabledPref(true);
-browserElementTestHelpers.addPermission();
-browserElementTestHelpers.enableProcessPriorityManager();
-SpecialPowers.addPermission("embed-apps", true, document);
-
-function runTest() {
-  var iframe = document.createElement('iframe');
-  iframe.setAttribute('mozbrowser', true);
-  iframe.setAttribute('expecting-system-message', true);
-  iframe.setAttribute('mozapptype', 'critical');
-  iframe.setAttribute('mozapp', 'http://example.org/manifest.webapp');
-
-  iframe.src = browserElementTestHelpers.emptyPage1;
-
-  var childID = null;
-  expectOnlyOneProcessCreated('FOREGROUND_HIGH').then(function(chid) {
-    childID = chid;
-  }).then(function() {
-    // We go back to foreground when the wake lock taken on behalf of our new
-    // process times out.
-    return expectPriorityChange(childID, 'FOREGROUND');
-  }).then(SimpleTest.finish);
-
-  document.body.appendChild(iframe);
-}
-
-addEventListener('testready', function() {
-  // Cause the CPU wake lock taken on behalf of this new process to time out
-  // after 1s.
-  SpecialPowers.pushPrefEnv(
-    {set: [["dom.ipc.systemMessageCPULockTimeoutSec", 1]]},
-    runTest);
-});
-
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/dom/browser-element/mochitest/priority/test_ExpectingSystemMessage2.html
+++ /dev/null
@@ -1,74 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<!--
-Test that a regular (not mozapptype=critical) frame that's expecting a system
-message gets priority BACKGROUND_PERCEIVABLE when it's in the background.
--->
-<head>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="../browserElementTestHelpers.js"></script>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-</head>
-<body>
-
-<script type="application/javascript;version=1.7">
-"use strict";
-
-SimpleTest.waitForExplicitFinish();
-browserElementTestHelpers.setEnabledPref(true);
-browserElementTestHelpers.addPermission();
-browserElementTestHelpers.enableProcessPriorityManager();
-SpecialPowers.addPermission("embed-apps", true, document);
-
-// Give our origin permission to open browsers, and remove it when the test is complete.
-var principal = SpecialPowers.wrap(document).nodePrincipal;
-SpecialPowers.addPermission("browser", true, {url: SpecialPowers.wrap(principal.URI).spec,
-                                              originAttributes: {
-                                                appId: principal.appId,
-                                                inIsolatedMozBrowser: true
-                                              }});
-
-addEventListener('unload', function() {
-  var principal = SpecialPowers.wrap(document).nodePrincipal;
-  SpecialPowers.removePermission("browser", {url: SpecialPowers.wrap(principal.URI).spec,
-                                             originAttributes: {
-                                               appId: principal.appId,
-                                               inIsolatedMozBrowser: true
-                                             }});
-});
-
-function runTest() {
-  var iframe = document.createElement('iframe');
-  iframe.setAttribute('mozbrowser', true);
-  iframe.setAttribute('expecting-system-message', true);
-  iframe.setAttribute('mozapp', 'http://example.org/manifest.webapp');
-
-  iframe.src = browserElementTestHelpers.emptyPage1;
-
-  var childID = null;
-  Promise.all([
-    expectOnlyOneProcessCreated('FOREGROUND').then(function(chid) {
-      childID = chid;
-    }),
-    expectMozbrowserEvent(iframe, 'loadend')
-  ]).then(function() {
-    var p = expectPriorityChange(childID, 'BACKGROUND_PERCEIVABLE');
-    iframe.setVisible(false);
-    return p;
-  }).then(SimpleTest.finish);
-
-  document.body.appendChild(iframe);
-}
-
-addEventListener('testready', function() {
-  // We don't want this wake lock to time out during the test; if it did, then
-  // we might see BACKGROUND priority instead of BACKGROUND_PERCEIVABLE.  So
-  // set the timeout to a large value.
-  SpecialPowers.pushPrefEnv(
-    {set: [["dom.ipc.systemMessageCPULockTimeoutSec", 99999]]},
-    runTest);
-});
-
-</script>
-</body>
-</html>
deleted file mode 100644
--- a/dom/browser-element/mochitest/test_browserElement_NotifyChannel.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <title>Test BrowserElementAudioChannel function : notifyChannel().</title>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript"
-          src="chrome://mochikit/content/chrome-harness.js"></script>
-  <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/>
-</head>
-<body>
-<script type="application/javascript;version=1.7" src="browserElement_NotifyChannel.js">
-</script>
-</body>
-</html>
--- a/dom/browser-element/nsIBrowserElementAPI.idl
+++ b/dom/browser-element/nsIBrowserElementAPI.idl
@@ -92,20 +92,16 @@ interface nsIBrowserElementAPI : nsISupp
   nsIDOMDOMRequest getAudioChannelVolume(in uint32_t audioChannel);
   nsIDOMDOMRequest setAudioChannelVolume(in uint32_t audioChannel, in float volume);
 
   nsIDOMDOMRequest getAudioChannelMuted(in uint32_t audioChannel);
   nsIDOMDOMRequest setAudioChannelMuted(in uint32_t audioChannel, in bool muted);
 
   nsIDOMDOMRequest isAudioChannelActive(in uint32_t audioChannel);
 
-  nsIDOMDOMRequest notifyChannel(in DOMString event,
-                                 in DOMString manifest,
-                                 in uint32_t audioChannel);
-
   void setNFCFocus(in boolean isFocus);
 
   nsIDOMDOMRequest executeScript(in DOMString script, in jsval options);
 
   /**
    * Returns an object that represents a Web Manifest:
    * http://w3c.github.io/manifest/
    */
--- a/dom/events/IMEContentObserver.cpp
+++ b/dom/events/IMEContentObserver.cpp
@@ -470,32 +470,32 @@ IMEContentObserver::NotifyIMEOfBlur()
   }
 
   // mWidget must have been non-nullptr if IME has focus.
   MOZ_RELEASE_ASSERT(widget);
 
   RefPtr<IMEContentObserver> kungFuDeathGrip(this);
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::NotifyIMEOfBlur(), "
+    ("0x%p IMEContentObserver::NotifyIMEOfBlur(), "
      "sending NOTIFY_IME_OF_BLUR", this));
 
   // For now, we need to send blur notification in any condition because
   // we don't have any simple ways to send blur notification asynchronously.
   // After this call, Destroy() or Unlink() will stop observing the content
   // and forget everything.  Therefore, if it's not safe to send notification
   // when script blocker is unlocked, we cannot send blur notification after
   // that and before next focus notification.
   // Anyway, as far as we know, IME doesn't try to query content when it loses
   // focus.  So, this may not cause any problem.
   mIMEHasFocus = false;
   IMEStateManager::NotifyIME(IMENotification(NOTIFY_IME_OF_BLUR), widget);
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::NotifyIMEOfBlur(), "
+    ("0x%p IMEContentObserver::NotifyIMEOfBlur(), "
      "sent NOTIFY_IME_OF_BLUR", this));
 }
 
 void
 IMEContentObserver::UnregisterObservers()
 {
   if (!mIsObserving) {
     return;
@@ -729,23 +729,23 @@ IMEContentObserver::HandleQueryContentEv
     aEvent->mReply.mContentsRoot = mRootContent;
     aEvent->mReply.mHasSelection = !mSelectionData.IsCollapsed();
     aEvent->mReply.mOffset = mSelectionData.mOffset;
     aEvent->mReply.mString = mSelectionData.String();
     aEvent->mReply.mWritingMode = mSelectionData.GetWritingMode();
     aEvent->mReply.mReversed = mSelectionData.mReversed;
     aEvent->mSucceeded = true;
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::HandleQueryContentEvent(aEvent={ "
+      ("0x%p IMEContentObserver::HandleQueryContentEvent(aEvent={ "
        "mMessage=%s })", this, ToChar(aEvent->mMessage)));
     return NS_OK;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::HandleQueryContentEvent(aEvent={ "
+    ("0x%p IMEContentObserver::HandleQueryContentEvent(aEvent={ "
      "mMessage=%s })", this, ToChar(aEvent->mMessage)));
 
   // If we can make the event's input offset absolute with TextComposition or
   // mSelection, we should set it here for reducing the cost of computing
   // selection start offset.  If ContentEventHandler receives a
   // WidgetQueryContentEvent whose input offset is relative to insertion point,
   // it computes current selection start offset (this may be expensive) and
   // make the offset absolute value itself.
@@ -1099,171 +1099,171 @@ IMEContentObserver::AttributeChanged(nsI
 }
 
 void
 IMEContentObserver::SuppressNotifyingIME()
 {
   mSuppressNotifications++;
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::SuppressNotifyingIME(), "
+    ("0x%p IMEContentObserver::SuppressNotifyingIME(), "
      "mSuppressNotifications=%u", this, mSuppressNotifications));
 }
 
 void
 IMEContentObserver::UnsuppressNotifyingIME()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::UnsuppressNotifyingIME(), "
+    ("0x%p IMEContentObserver::UnsuppressNotifyingIME(), "
      "mSuppressNotifications=%u", this, mSuppressNotifications));
 
   if (!mSuppressNotifications || --mSuppressNotifications) {
     return;
   }
   FlushMergeableNotifications();
 }
 
 NS_IMETHODIMP
 IMEContentObserver::EditAction()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::EditAction()", this));
+    ("0x%p IMEContentObserver::EditAction()", this));
 
   mEndOfAddedTextCache.Clear();
   mStartOfRemovingTextRangeCache.Clear();
   FlushMergeableNotifications();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 IMEContentObserver::BeforeEditAction()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::BeforeEditAction()", this));
+    ("0x%p IMEContentObserver::BeforeEditAction()", this));
 
   mEndOfAddedTextCache.Clear();
   mStartOfRemovingTextRangeCache.Clear();
   return NS_OK;
 }
 
 NS_IMETHODIMP
 IMEContentObserver::CancelEditAction()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::CancelEditAction()", this));
+    ("0x%p IMEContentObserver::CancelEditAction()", this));
 
   mEndOfAddedTextCache.Clear();
   mStartOfRemovingTextRangeCache.Clear();
   FlushMergeableNotifications();
   return NS_OK;
 }
 
 void
 IMEContentObserver::PostFocusSetNotification()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::PostFocusSetNotification()", this));
+    ("0x%p IMEContentObserver::PostFocusSetNotification()", this));
 
   mNeedsToNotifyIMEOfFocusSet = true;
 }
 
 void
 IMEContentObserver::PostTextChangeNotification()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::PostTextChangeNotification("
+    ("0x%p IMEContentObserver::PostTextChangeNotification("
      "mTextChangeData=%s)",
      this, TextChangeDataToString(mTextChangeData).get()));
 
   MOZ_ASSERT(mTextChangeData.IsValid(),
              "mTextChangeData must have text change data");
   mNeedsToNotifyIMEOfTextChange = true;
 }
 
 void
 IMEContentObserver::PostSelectionChangeNotification()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::PostSelectionChangeNotification(), "
+    ("0x%p IMEContentObserver::PostSelectionChangeNotification(), "
      "mSelectionData={ mCausedByComposition=%s, mCausedBySelectionEvent=%s }",
      this, ToChar(mSelectionData.mCausedByComposition),
      ToChar(mSelectionData.mCausedBySelectionEvent)));
 
   mNeedsToNotifyIMEOfSelectionChange = true;
 }
 
 void
 IMEContentObserver::MaybeNotifyIMEOfFocusSet()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::MaybeNotifyIMEOfFocusSet()", this));
+    ("0x%p IMEContentObserver::MaybeNotifyIMEOfFocusSet()", this));
 
   PostFocusSetNotification();
   FlushMergeableNotifications();
 }
 
 void
 IMEContentObserver::MaybeNotifyIMEOfTextChange(
                       const TextChangeDataBase& aTextChangeData)
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::MaybeNotifyIMEOfTextChange("
+    ("0x%p IMEContentObserver::MaybeNotifyIMEOfTextChange("
      "aTextChangeData=%s)",
      this, TextChangeDataToString(aTextChangeData).get()));
 
   mTextChangeData += aTextChangeData;
   PostTextChangeNotification();
   FlushMergeableNotifications();
 }
 
 void
 IMEContentObserver::MaybeNotifyIMEOfSelectionChange(
                       bool aCausedByComposition,
                       bool aCausedBySelectionEvent,
                       bool aOccurredDuringComposition)
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::MaybeNotifyIMEOfSelectionChange("
+    ("0x%p IMEContentObserver::MaybeNotifyIMEOfSelectionChange("
      "aCausedByComposition=%s, aCausedBySelectionEvent=%s, "
      "aOccurredDuringComposition)",
      this, ToChar(aCausedByComposition), ToChar(aCausedBySelectionEvent)));
 
   mSelectionData.AssignReason(aCausedByComposition,
                               aCausedBySelectionEvent,
                               aOccurredDuringComposition);
   PostSelectionChangeNotification();
   FlushMergeableNotifications();
 }
 
 void
 IMEContentObserver::MaybeNotifyIMEOfPositionChange()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::MaybeNotifyIMEOfPositionChange()", this));
+    ("0x%p IMEContentObserver::MaybeNotifyIMEOfPositionChange()", this));
   // If reflow is caused by ContentEventHandler during PositionChangeEvent
   // sending NOTIFY_IME_OF_POSITION_CHANGE, we don't need to notify IME of it
   // again since ContentEventHandler returns the result including this reflow's
   // result.
   if (mIsHandlingQueryContentEvent &&
       mSendingNotification == NOTIFY_IME_OF_POSITION_CHANGE) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::MaybeNotifyIMEOfPositionChange(), "
+      ("0x%p   IMEContentObserver::MaybeNotifyIMEOfPositionChange(), "
        "ignored since caused by ContentEventHandler during sending "
        "NOTIY_IME_OF_POSITION_CHANGE", this));
     return;
   }
   PostPositionChangeNotification();
   FlushMergeableNotifications();
 }
 
 void
 IMEContentObserver::MaybeNotifyCompositionEventHandled()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::MaybeNotifyCompositionEventHandled()",
+    ("0x%p IMEContentObserver::MaybeNotifyCompositionEventHandled()",
      this));
 
   PostCompositionEventHandledNotification();
   FlushMergeableNotifications();
 }
 
 bool
 IMEContentObserver::UpdateSelectionCache()
@@ -1290,37 +1290,37 @@ IMEContentObserver::UpdateSelectionCache
   mSelectionData.mOffset = selection.mReply.mOffset;
   *mSelectionData.mString = selection.mReply.mString;
   mSelectionData.SetWritingMode(selection.GetWritingMode());
   mSelectionData.mReversed = selection.mReply.mReversed;
 
   // WARNING: Don't modify the reason of selection change here.
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::UpdateSelectionCache(), "
+    ("0x%p IMEContentObserver::UpdateSelectionCache(), "
      "mSelectionData=%s",
      this, SelectionChangeDataToString(mSelectionData).get()));
 
   return mSelectionData.IsValid();
 }
 
 void
 IMEContentObserver::PostPositionChangeNotification()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::PostPositionChangeNotification()", this));
+    ("0x%p IMEContentObserver::PostPositionChangeNotification()", this));
 
   mNeedsToNotifyIMEOfPositionChange = true;
 }
 
 void
 IMEContentObserver::PostCompositionEventHandledNotification()
 {
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::"
+    ("0x%p IMEContentObserver::"
      "PostCompositionEventHandledNotification()", this));
 
   mNeedsToNotifyIMEOfCompositionEventHandled = true;
 }
 
 bool
 IMEContentObserver::IsReflowLocked() const
 {
@@ -1373,70 +1373,70 @@ IMEContentObserver::IsSafeToNotifyIME() 
 }
 
 void
 IMEContentObserver::FlushMergeableNotifications()
 {
   if (!IsSafeToNotifyIME()) {
     // So, if this is already called, this should do nothing.
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), "
+      ("0x%p IMEContentObserver::FlushMergeableNotifications(), "
        "FAILED, due to unsafe to notify IME", this));
     return;
   }
 
   // Notifying something may cause nested call of this method.  For example,
   // when somebody notified one of the notifications may dispatch query content
   // event. Then, it causes flushing layout which may cause another layout
   // change notification.
 
   if (mQueuedSender) {
     // So, if this is already called, this should do nothing.
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::FlushMergeableNotifications(), "
+      ("0x%p   IMEContentObserver::FlushMergeableNotifications(), "
        "FAILED, due to already flushing pending notifications", this));
     return;
   }
 
   if (!NeedsToNotifyIMEOfSomething()) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::FlushMergeableNotifications(), "
+      ("0x%p   IMEContentObserver::FlushMergeableNotifications(), "
        "FAILED, due to no pending notifications", this));
     return;
   }
 
   // NOTE: Reset each pending flag because sending notification may cause
   //       another change.
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), "
+    ("0x%p IMEContentObserver::FlushMergeableNotifications(), "
      "creating IMENotificationSender...", this));
 
   // If contents in selection range is modified, the selection range still
   // has removed node from the tree.  In such case, nsContentIterator won't
   // work well.  Therefore, we shouldn't use AddScriptRunnder() here since
   // it may kick runnable event immediately after DOM tree is changed but
   // the selection range isn't modified yet.
   mQueuedSender = new IMENotificationSender(this);
   NS_DispatchToCurrentThread(mQueuedSender);
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::FlushMergeableNotifications(), "
+    ("0x%p IMEContentObserver::FlushMergeableNotifications(), "
      "finished", this));
 }
 
 void
 IMEContentObserver::TryToFlushPendingNotifications()
 {
   if (!mQueuedSender || mSendingNotification != NOTIFY_IME_OF_NOTHING) {
     return;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::TryToFlushPendingNotifications(), "
+    ("0x%p IMEContentObserver::TryToFlushPendingNotifications(), "
      "performing queued IMENotificationSender forcibly", this));
   RefPtr<IMENotificationSender> queuedSender = mQueuedSender;
   queuedSender->Run();
 }
 
 /******************************************************************************
  * mozilla::IMEContentObserver::AChangeEvent
  ******************************************************************************/
@@ -1477,17 +1477,17 @@ IMEContentObserver::AChangeEvent::IsSafe
 {
   if (NS_WARN_IF(!nsContentUtils::IsSafeToRunScript())) {
     return false;
   }
   // While we're sending a notification, we shouldn't send another notification
   // recursively.
   if (mIMEContentObserver->mSendingNotification != NOTIFY_IME_OF_NOTHING) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::AChangeEvent::IsSafeToNotifyIME(), "
+      ("0x%p   IMEContentObserver::AChangeEvent::IsSafeToNotifyIME(), "
        "putting off sending notification due to detecting recursive call, "
        "mIMEContentObserver={ mSendingNotification=%s }",
        this, ToChar(mIMEContentObserver->mSendingNotification)));
     return false;
   }
   State state = mIMEContentObserver->GetState();
   if (aChangeEventType == eChangeEventType_Focus) {
     if (NS_WARN_IF(state != eState_Initializing && state != eState_Observing)) {
@@ -1505,17 +1505,17 @@ IMEContentObserver::AChangeEvent::IsSafe
  * mozilla::IMEContentObserver::IMENotificationSender
  ******************************************************************************/
  
 NS_IMETHODIMP
 IMEContentObserver::IMENotificationSender::Run()
 {
   if (NS_WARN_IF(mIsRunning)) {
     MOZ_LOG(sIMECOLog, LogLevel::Error,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), FAILED, "
+      ("0x%p IMEContentObserver::IMENotificationSender::Run(), FAILED, "
        "called recursively", this));
     return NS_OK;
   }
 
   AutoRestore<bool> running(mIsRunning);
   mIsRunning = true;
 
   // This instance was already performed forcibly.
@@ -1533,17 +1533,17 @@ IMEContentObserver::IMENotificationSende
     // If it's not safe to notify IME of focus, SendFocusSet() sets
     // mNeedsToNotifyIMEOfFocusSet true again.  For guaranteeing to send the
     // focus notification later,  we should put a new sender into the queue but
     // this case must be rare.  Note that if mIMEContentObserver is already
     // destroyed, mNeedsToNotifyIMEOfFocusSet is never set true again.
     if (mIMEContentObserver->mNeedsToNotifyIMEOfFocusSet) {
       MOZ_ASSERT(!mIMEContentObserver->mIMEHasFocus);
       MOZ_LOG(sIMECOLog, LogLevel::Debug,
-        ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), "
+        ("0x%p IMEContentObserver::IMENotificationSender::Run(), "
          "posting IMENotificationSender to current thread", this));
       mIMEContentObserver->mQueuedSender =
         new IMENotificationSender(mIMEContentObserver);
       NS_DispatchToCurrentThread(mIMEContentObserver->mQueuedSender);
       return NS_OK;
     }
     // This is the first notification to IME. So, we don't need to notify
     // anymore since IME starts to query content after it gets focus.
@@ -1593,261 +1593,261 @@ IMEContentObserver::IMENotificationSende
   }
 
   mIMEContentObserver->mQueuedSender = nullptr;
 
   // If notifications caused some new change, we should notify them now.
   if (mIMEContentObserver->NeedsToNotifyIMEOfSomething()) {
     if (mIMEContentObserver->GetState() == eState_StoppedObserving) {
       MOZ_LOG(sIMECOLog, LogLevel::Debug,
-        ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), "
+        ("0x%p IMEContentObserver::IMENotificationSender::Run(), "
          "waiting IMENotificationSender to be reinitialized", this));
     } else {
       MOZ_LOG(sIMECOLog, LogLevel::Debug,
-        ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::Run(), "
+        ("0x%p IMEContentObserver::IMENotificationSender::Run(), "
          "posting IMENotificationSender to current thread", this));
       mIMEContentObserver->mQueuedSender =
         new IMENotificationSender(mIMEContentObserver);
       NS_DispatchToCurrentThread(mIMEContentObserver->mQueuedSender);
     }
   }
   return NS_OK;
 }
 
 void
 IMEContentObserver::IMENotificationSender::SendFocusSet()
 {
   if (!CanNotifyIME(eChangeEventType_Focus)) {
     // If IMEContentObserver has already gone, we don't need to notify IME of
     // focus.
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendFocusSet(), FAILED, due to impossible to notify IME of focus",
        this));
     mIMEContentObserver->ClearPendingNotifications();
     return;
   }
 
   if (!IsSafeToNotifyIME(eChangeEventType_Focus)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::IMENotificationSender::"
+      ("0x%p   IMEContentObserver::IMENotificationSender::"
        "SendFocusSet(), retrying to send NOTIFY_IME_OF_FOCUS...", this));
     mIMEContentObserver->PostFocusSetNotification();
     return;
   }
 
   mIMEContentObserver->mIMEHasFocus = true;
   // Initialize selection cache with the first selection data.
   mIMEContentObserver->UpdateSelectionCache();
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendFocusSet(), sending NOTIFY_IME_OF_FOCUS...", this));
 
   MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification ==
                        NOTIFY_IME_OF_NOTHING);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_FOCUS;
   IMEStateManager::NotifyIME(IMENotification(NOTIFY_IME_OF_FOCUS),
                              mIMEContentObserver->mWidget);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING;
 
   // nsIMEUpdatePreference referred by ObserveEditableNode() may be different
   // before or after widget receives NOTIFY_IME_OF_FOCUS.  Therefore, we need
   // to guarantee to call ObserveEditableNode() after sending
   // NOTIFY_IME_OF_FOCUS.
   mIMEContentObserver->OnIMEReceivedFocus();
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendFocusSet(), sent NOTIFY_IME_OF_FOCUS", this));
 }
 
 void
 IMEContentObserver::IMENotificationSender::SendSelectionChange()
 {
   if (!CanNotifyIME(eChangeEventType_Selection)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendSelectionChange(), FAILED, due to impossible to notify IME of "
        "selection change", this));
     return;
   }
 
   if (!IsSafeToNotifyIME(eChangeEventType_Selection)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::IMENotificationSender::"
+      ("0x%p   IMEContentObserver::IMENotificationSender::"
        "SendSelectionChange(), retrying to send "
        "NOTIFY_IME_OF_SELECTION_CHANGE...", this));
     mIMEContentObserver->PostSelectionChangeNotification();
     return;
   }
 
   SelectionChangeData lastSelChangeData = mIMEContentObserver->mSelectionData;
   if (NS_WARN_IF(!mIMEContentObserver->UpdateSelectionCache())) {
     MOZ_LOG(sIMECOLog, LogLevel::Error,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendSelectionChange(), FAILED, due to UpdateSelectionCache() failure",
        this));
     return;
   }
 
   // The state may be changed since querying content causes flushing layout.
   if (!CanNotifyIME(eChangeEventType_Selection)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendSelectionChange(), FAILED, due to flushing layout having changed "
        "something", this));
     return;
   }
 
   // If the selection isn't changed actually, we shouldn't notify IME of
   // selection change.
   SelectionChangeData& newSelChangeData = mIMEContentObserver->mSelectionData;
   if (lastSelChangeData.IsValid() &&
       lastSelChangeData.mOffset == newSelChangeData.mOffset &&
       lastSelChangeData.String() == newSelChangeData.String() &&
       lastSelChangeData.GetWritingMode() == newSelChangeData.GetWritingMode() &&
       lastSelChangeData.mReversed == newSelChangeData.mReversed) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendSelectionChange(), not notifying IME of "
        "NOTIFY_IME_OF_SELECTION_CHANGE due to not changed actually", this));
     return;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendSelectionChange(), sending NOTIFY_IME_OF_SELECTION_CHANGE... "
      "newSelChangeData=%s",
      this, SelectionChangeDataToString(newSelChangeData).get()));
 
   IMENotification notification(NOTIFY_IME_OF_SELECTION_CHANGE);
   notification.SetData(mIMEContentObserver->mSelectionData);
 
   MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification ==
                        NOTIFY_IME_OF_NOTHING);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_SELECTION_CHANGE;
   IMEStateManager::NotifyIME(notification, mIMEContentObserver->mWidget);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING;
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendSelectionChange(), sent NOTIFY_IME_OF_SELECTION_CHANGE", this));
 }
 
 void
 IMEContentObserver::IMENotificationSender::SendTextChange()
 {
   if (!CanNotifyIME(eChangeEventType_Text)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendTextChange(), FAILED, due to impossible to notify IME of text "
        "change", this));
     return;
   }
 
   if (!IsSafeToNotifyIME(eChangeEventType_Text)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::IMENotificationSender::"
+      ("0x%p   IMEContentObserver::IMENotificationSender::"
        "SendTextChange(), retrying to send NOTIFY_IME_OF_TEXT_CHANGE...",
        this));
     mIMEContentObserver->PostTextChangeNotification();
     return;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendTextChange(), sending NOTIFY_IME_OF_TEXT_CHANGE... "
      "mIMEContentObserver={ mTextChangeData=%s }",
      this, TextChangeDataToString(mIMEContentObserver->mTextChangeData).get()));
 
   IMENotification notification(NOTIFY_IME_OF_TEXT_CHANGE);
   notification.SetData(mIMEContentObserver->mTextChangeData);
   mIMEContentObserver->mTextChangeData.Clear();
 
   MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification ==
                        NOTIFY_IME_OF_NOTHING);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_TEXT_CHANGE;
   IMEStateManager::NotifyIME(notification, mIMEContentObserver->mWidget);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING;
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendTextChange(), sent NOTIFY_IME_OF_TEXT_CHANGE", this));
 }
 
 void
 IMEContentObserver::IMENotificationSender::SendPositionChange()
 {
   if (!CanNotifyIME(eChangeEventType_Position)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendPositionChange(), FAILED, due to impossible to notify IME of "
        "position change", this));
     return;
   }
 
   if (!IsSafeToNotifyIME(eChangeEventType_Position)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::IMENotificationSender::"
+      ("0x%p   IMEContentObserver::IMENotificationSender::"
        "SendPositionChange(), retrying to send "
        "NOTIFY_IME_OF_POSITION_CHANGE...", this));
     mIMEContentObserver->PostPositionChangeNotification();
     return;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendPositionChange(), sending NOTIFY_IME_OF_POSITION_CHANGE...", this));
 
   MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification ==
                        NOTIFY_IME_OF_NOTHING);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_POSITION_CHANGE;
   IMEStateManager::NotifyIME(IMENotification(NOTIFY_IME_OF_POSITION_CHANGE),
                              mIMEContentObserver->mWidget);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING;
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendPositionChange(), sent NOTIFY_IME_OF_POSITION_CHANGE", this));
 }
 
 void
 IMEContentObserver::IMENotificationSender::SendCompositionEventHandled()
 {
   if (!CanNotifyIME(eChangeEventType_CompositionEventHandled)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+      ("0x%p IMEContentObserver::IMENotificationSender::"
        "SendCompositionEventHandled(), FAILED, due to impossible to notify "
        "IME of composition event handled", this));
     return;
   }
 
   if (!IsSafeToNotifyIME(eChangeEventType_CompositionEventHandled)) {
     MOZ_LOG(sIMECOLog, LogLevel::Debug,
-      ("IMECO: 0x%p   IMEContentObserver::IMENotificationSender::"
+      ("0x%p   IMEContentObserver::IMENotificationSender::"
        "SendCompositionEventHandled(), retrying to send "
        "NOTIFY_IME_OF_POSITION_CHANGE...", this));
     mIMEContentObserver->PostCompositionEventHandledNotification();
     return;
   }
 
   MOZ_LOG(sIMECOLog, LogLevel::Info,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendCompositionEventHandled(), sending "
      "NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED...", this));
 
   MOZ_RELEASE_ASSERT(mIMEContentObserver->mSendingNotification ==
                        NOTIFY_IME_OF_NOTHING);
   mIMEContentObserver->mSendingNotification =
                          NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED;
   IMEStateManager::NotifyIME(
                      IMENotification(NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED),
                      mIMEContentObserver->mWidget);
   mIMEContentObserver->mSendingNotification = NOTIFY_IME_OF_NOTHING;
 
   MOZ_LOG(sIMECOLog, LogLevel::Debug,
-    ("IMECO: 0x%p IMEContentObserver::IMENotificationSender::"
+    ("0x%p IMEContentObserver::IMENotificationSender::"
      "SendCompositionEventHandled(), sent "
      "NOTIFY_IME_OF_COMPOSITION_EVENT_HANDLED", this));
 }
 
 } // namespace mozilla
--- a/dom/events/IMEStateManager.cpp
+++ b/dom/events/IMEStateManager.cpp
@@ -42,25 +42,25 @@ namespace mozilla {
 
 using namespace dom;
 using namespace widget;
 
 /**
  * When a method is called, log its arguments and/or related static variables
  * with LogLevel::Info.  However, if it puts too many logs like
  * OnDestroyPresContext(), should long only when the method actually does
- * something. In this case, the log should start with "ISM: <method name>".
+ * something. In this case, the log should start with "<method name>".
  *
  * When a method quits due to unexpected situation, log the reason with
  * LogLevel::Error.  In this case, the log should start with
- * "ISM:   <method name>(), FAILED".  The indent makes the log look easier.
+ * "<method name>(), FAILED".  The indent makes the log look easier.
  *
  * When a method does something only in some situations and it may be important
  * for debug, log the information with LogLevel::Debug.  In this case, the log
- * should start with "ISM:   <method name>(),".
+ * should start with "  <method name>(),".
  */
 LazyLogModule sISMLog("IMEStateManager");
 
 static const char*
 GetBoolName(bool aBool)
 {
   return aBool ? "true" : "false";
 }
@@ -157,34 +157,33 @@ IMEStateManager::Init()
     false);
 }
 
 // static
 void
 IMEStateManager::Shutdown()
 {
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::Shutdown(), "
-     "sTextCompositions=0x%p, sTextCompositions->Length()=%u",
+    ("Shutdown(), sTextCompositions=0x%p, sTextCompositions->Length()=%u",
      sTextCompositions, sTextCompositions ? sTextCompositions->Length() : 0));
 
   MOZ_ASSERT(!sTextCompositions || !sTextCompositions->Length());
   delete sTextCompositions;
   sTextCompositions = nullptr;
 }
 
 // static
 void
 IMEStateManager::OnTabParentDestroying(TabParent* aTabParent)
 {
   if (sActiveTabParent != aTabParent) {
     return;
   }
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::OnTabParentDestroying(aTabParent=0x%p), "
+    ("OnTabParentDestroying(aTabParent=0x%p), "
      "The active TabParent is being destroyed", aTabParent));
 
   // The active remote process might have crashed.
   sActiveTabParent = nullptr;
 
   // TODO: Need to cancel composition without TextComposition and make
   //       disable IME.
 }
@@ -201,17 +200,17 @@ IMEStateManager::WidgetDestroyed(nsIWidg
   }
 }
 
 // static
 void
 IMEStateManager::StopIMEStateManagement()
 {
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::StopIMEStateManagement()"));
+    ("StopIMEStateManagement()"));
 
   // NOTE: Don't set input context from here since this has already lost
   //       the rights to change input context.
 
   if (sTextCompositions && sPresContext) {
     NotifyIME(REQUEST_TO_COMMIT_COMPOSITION, sPresContext);
   }
   sActiveInputContextWidget = nullptr;
@@ -223,75 +222,73 @@ IMEStateManager::StopIMEStateManagement(
 
 // static
 void
 IMEStateManager::MaybeStartOffsetUpdatedInChild(nsIWidget* aWidget,
                                                 uint32_t aStartOffset)
 {
   if (NS_WARN_IF(!sTextCompositions)) {
     MOZ_LOG(sISMLog, LogLevel::Warning,
-      ("ISM: IMEStateManager::MaybeStartOffsetUpdatedInChild("
-       "aWidget=0x%p, aStartOffset=%u), called when there is no "
-       "composition", aWidget, aStartOffset));
+      ("MaybeStartOffsetUpdatedInChild(aWidget=0x%p, aStartOffset=%u), "
+       "called when there is no composition", aWidget, aStartOffset));
     return;
   }
 
   RefPtr<TextComposition> composition = GetTextCompositionFor(aWidget);
   if (NS_WARN_IF(!composition)) {
     MOZ_LOG(sISMLog, LogLevel::Warning,
-      ("ISM: IMEStateManager::MaybeStartOffsetUpdatedInChild("
-       "aWidget=0x%p, aStartOffset=%u), called when there is no "
-       "composition", aWidget, aStartOffset));
+      ("MaybeStartOffsetUpdatedInChild(aWidget=0x%p, aStartOffset=%u), "
+       "called when there is no composition", aWidget, aStartOffset));
     return;
   }
 
   if (composition->NativeOffsetOfStartComposition() == aStartOffset) {
     return;
   }
 
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::MaybeStartOffsetUpdatedInChild("
-     "aWidget=0x%p, aStartOffset=%u), old offset=%u",
+    ("MaybeStartOffsetUpdatedInChild(aWidget=0x%p, aStartOffset=%u), "
+     "old offset=%u",
      aWidget, aStartOffset, composition->NativeOffsetOfStartComposition()));
   composition->OnStartOffsetUpdatedInChild(aStartOffset);
 }
 
 // static
 nsresult
 IMEStateManager::OnDestroyPresContext(nsPresContext* aPresContext)
 {
   NS_ENSURE_ARG_POINTER(aPresContext);
 
   // First, if there is a composition in the aPresContext, clean up it.
   if (sTextCompositions) {
     TextCompositionArray::index_type i =
       sTextCompositions->IndexOf(aPresContext);
     if (i != TextCompositionArray::NoIndex) {
       MOZ_LOG(sISMLog, LogLevel::Debug,
-        ("ISM:   IMEStateManager::OnDestroyPresContext(), "
+        ("  OnDestroyPresContext(), "
          "removing TextComposition instance from the array (index=%u)", i));
       // there should be only one composition per presContext object.
       sTextCompositions->ElementAt(i)->Destroy();
       sTextCompositions->RemoveElementAt(i);
       if (sTextCompositions->IndexOf(aPresContext) !=
             TextCompositionArray::NoIndex) {
         MOZ_LOG(sISMLog, LogLevel::Error,
-          ("ISM:   IMEStateManager::OnDestroyPresContext(), FAILED to remove "
+          ("  OnDestroyPresContext(), FAILED to remove "
            "TextComposition instance from the array"));
         MOZ_CRASH("Failed to remove TextComposition instance from the array");
       }
     }
   }
 
   if (aPresContext != sPresContext) {
     return NS_OK;
   }
 
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::OnDestroyPresContext(aPresContext=0x%p), "
+    ("OnDestroyPresContext(aPresContext=0x%p), "
      "sPresContext=0x%p, sContent=0x%p, sTextCompositions=0x%p",
      aPresContext, sPresContext, sContent.get(), sTextCompositions));
 
   DestroyIMEContentObserver();
 
   nsCOMPtr<nsIWidget> widget = sPresContext->GetRootWidget();
   if (widget) {
     IMEState newState = GetNewIMEState(sPresContext, nullptr);
@@ -314,17 +311,17 @@ IMEStateManager::OnRemoveContent(nsPresC
 
   // First, if there is a composition in the aContent, clean up it.
   if (sTextCompositions) {
     RefPtr<TextComposition> compositionInContent =
       sTextCompositions->GetCompositionInContent(aPresContext, aContent);
 
     if (compositionInContent) {
       MOZ_LOG(sISMLog, LogLevel::Debug,
-        ("ISM:   IMEStateManager::OnRemoveContent(), "
+        ("  OnRemoveContent(), "
          "composition is in the content"));
 
       // Try resetting the native IME state.  Be aware, typically, this method
       // is called during the content being removed.  Then, the native
       // composition events which are caused by following APIs are ignored due
       // to unsafe to run script (in PresShell::HandleEvent()).
       nsCOMPtr<nsIWidget> widget = aPresContext->GetRootWidget();
       MOZ_ASSERT(widget, "Why is there no widget?");
@@ -337,18 +334,18 @@ IMEStateManager::OnRemoveContent(nsPresC
   }
 
   if (!sPresContext || !sContent ||
       !nsContentUtils::ContentIsDescendantOf(sContent, aContent)) {
     return NS_OK;
   }
 
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::OnRemoveContent(aPresContext=0x%p, "
-     "aContent=0x%p), sPresContext=0x%p, sContent=0x%p, sTextCompositions=0x%p",
+    ("OnRemoveContent(aPresContext=0x%p, aContent=0x%p), "
+     "sPresContext=0x%p, sContent=0x%p, sTextCompositions=0x%p",
      aPresContext, aContent, sPresContext, sContent.get(), sTextCompositions));
 
   DestroyIMEContentObserver();
 
   // Current IME transaction should commit
   nsCOMPtr<nsIWidget> widget = sPresContext->GetRootWidget();
   if (widget) {
     IMEState newState = GetNewIMEState(sPresContext, nullptr);
@@ -366,34 +363,33 @@ IMEStateManager::OnRemoveContent(nsPresC
 
 // static
 nsresult
 IMEStateManager::OnChangeFocus(nsPresContext* aPresContext,
                                nsIContent* aContent,
                                InputContextAction::Cause aCause)
 {
   MOZ_LOG(sISMLog, LogLevel::Info,
-    ("ISM: IMEStateManager::OnChangeFocus(aPresContext=0x%p, "
-     "aContent=0x%p, aCause=%s)",
+    ("OnChangeFocus(aPresContext=0x%p, aContent=0x%p, aCause=%s)",
      aPresContext, aContent, GetActionCauseName(aCause)));
 
   InputContextAction action(aCause);
   return OnChangeFocusInternal(aPresContext, aContent, action);
 }
 
 // static
 nsresult
 IMEStateManager::OnChangeFocusInternal(nsPresContext* aPresContext,