Bug 1398061 - Remove simulators from WebIDE. r=jdescottes, a=sledru, l10n=flod
authorAlexandre Poirot <poirot.alex@gmail.com>
Mon, 25 Sep 2017 11:37:18 +0200
changeset 434563 3cdddb3af232d73c8c5c40f3dc083f65a54185c3
parent 434562 a894d887c0bae12ff51e1de29cc784cb405a5e27
child 434564 086ea45f4dc2550e7225f22f76f21aa006398572
push id1567
push userjlorenzo@mozilla.com
push dateThu, 02 Nov 2017 12:36:05 +0000
treeherdermozilla-release@e512c14a0406 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjdescottes, sledru
bugs1398061
milestone57.0
Bug 1398061 - Remove simulators from WebIDE. r=jdescottes, a=sledru, l10n=flod MozReview-Commit-ID: 9si1X8k4JGt
browser/installer/allowed-dupes.mn
devtools/client/locales/en-US/webide.dtd
devtools/client/locales/en-US/webide.properties
devtools/client/webide/content/addons.js
devtools/client/webide/content/jar.mn
devtools/client/webide/content/monitor.js
devtools/client/webide/content/runtime-listing.js
devtools/client/webide/content/runtime-listing.xhtml
devtools/client/webide/content/simulator.js
devtools/client/webide/content/simulator.xhtml
devtools/client/webide/content/webide.js
devtools/client/webide/content/webide.xul
devtools/client/webide/modules/addons.js
devtools/client/webide/modules/app-manager.js
devtools/client/webide/modules/moz.build
devtools/client/webide/modules/runtime-list.js
devtools/client/webide/modules/runtimes.js
devtools/client/webide/modules/simulator-process.js
devtools/client/webide/modules/simulators.js
devtools/client/webide/test/addons/fxos_1_0_simulator-linux.xpi
devtools/client/webide/test/addons/fxos_1_0_simulator-linux64.xpi
devtools/client/webide/test/addons/fxos_1_0_simulator-mac64.xpi
devtools/client/webide/test/addons/fxos_1_0_simulator-win32.xpi
devtools/client/webide/test/addons/fxos_2_0_simulator-linux.xpi
devtools/client/webide/test/addons/fxos_2_0_simulator-linux64.xpi
devtools/client/webide/test/addons/fxos_2_0_simulator-mac64.xpi
devtools/client/webide/test/addons/fxos_2_0_simulator-win32.xpi
devtools/client/webide/test/addons/fxos_3_0_simulator-linux.xpi
devtools/client/webide/test/addons/fxos_3_0_simulator-linux64.xpi
devtools/client/webide/test/addons/fxos_3_0_simulator-mac64.xpi
devtools/client/webide/test/addons/fxos_3_0_simulator-win32.xpi
devtools/client/webide/test/addons/fxos_3_0_tv_simulator-linux.xpi
devtools/client/webide/test/addons/fxos_3_0_tv_simulator-linux64.xpi
devtools/client/webide/test/addons/fxos_3_0_tv_simulator-mac64.xpi
devtools/client/webide/test/addons/fxos_3_0_tv_simulator-win32.xpi
devtools/client/webide/test/addons/simulators.json
devtools/client/webide/test/browser.ini
devtools/client/webide/test/chrome.ini
devtools/client/webide/test/head.js
devtools/client/webide/test/test_addons.html
devtools/client/webide/test/test_simulators.html
devtools/client/webide/themes/jar.mn
devtools/client/webide/themes/panel-listing.css
devtools/client/webide/themes/simulator.css
devtools/client/webide/webide-prefs.js
devtools/shared/apps/Simulator.jsm
--- a/browser/installer/allowed-dupes.mn
+++ b/browser/installer/allowed-dupes.mn
@@ -64,20 +64,18 @@ browser/chrome/devtools/skin/images/secu
 browser/chrome/devtools/skin/images/tabs-icon.svg
 browser/chrome/devtools/skin/images/tool-scratchpad.svg
 browser/chrome/devtools/skin/images/tool-storage.svg
 browser/chrome/devtools/skin/images/tool-styleeditor.svg
 browser/chrome/devtools/skin/promisedebugger.css
 browser/chrome/devtools/skin/variables.css
 modules/devtools/Console.jsm
 modules/devtools/Loader.jsm
-modules/devtools/Simulator.jsm
 modules/devtools/shared/Console.jsm
 modules/devtools/shared/Loader.jsm
-modules/devtools/shared/apps/Simulator.jsm
 browser/modules/devtools/client/framework/gDevTools.jsm
 browser/modules/devtools/gDevTools.jsm
 browser/chrome/icons/default/default16.png
 browser/chrome/icons/default/default32.png
 browser/chrome/icons/default/default48.png
 browser/chrome/pdfjs/content/web/images/findbarButton-next-rtl.png
 browser/chrome/pdfjs/content/web/images/findbarButton-next-rtl@2x.png
 browser/chrome/pdfjs/content/web/images/findbarButton-next.png
--- a/devtools/client/locales/en-US/webide.dtd
+++ b/devtools/client/locales/en-US/webide.dtd
@@ -70,19 +70,17 @@
 <!ENTITY key_zoomout "-">
 <!ENTITY key_resetzoom "0">
 
 <!ENTITY projectPanel_myProjects "My Projects">
 <!ENTITY projectPanel_runtimeApps "Runtime Apps">
 <!ENTITY projectPanel_tabs "Tabs">
 <!ENTITY runtimePanel_usb "USB Devices">
 <!ENTITY runtimePanel_wifi "Wi-Fi Devices">
-<!ENTITY runtimePanel_simulator "Simulators">
 <!ENTITY runtimePanel_other "Other">
-<!ENTITY runtimePanel_installsimulator "Install Simulator">
 <!ENTITY runtimePanel_noadbhelper "Install ADB Helper">
 <!ENTITY runtimePanel_nousbdevice "Can’t see your device?">
 <!ENTITY runtimePanel_refreshDevices_label "Refresh Devices">
 
 <!-- Lense -->
 <!ENTITY details_valid_header "valid">
 <!ENTITY details_warning_header "warnings">
 <!ENTITY details_error_header "errors">
@@ -169,24 +167,8 @@
 <!ENTITY wifi_auth_yes_scanner "Have a QR scanner prompt?">
 <!-- LOCALIZATION NOTE (wifi_auth_token_request): Instructions requesting the
      user to transfer authentication info by transferring a token. -->
 <!ENTITY wifi_auth_token_request "If your other device asks for a token instead of scanning a QR code, please copy the value below to the other device:">
 <!ENTITY wifi_auth_qr_size_note "If the QR code appears too small for the connection to be successfully established, try zooming or enlarging the window.">
 
 <!-- Logs panel -->
 <!ENTITY logs_title "Pre-packaging Command Logs">
-
-<!-- Simulator Options -->
-<!ENTITY simulator_title "Simulator Options">
-<!ENTITY simulator_remove "Delete Simulator">
-<!ENTITY simulator_reset "Restore Defaults">
-<!ENTITY simulator_name "Name">
-<!ENTITY simulator_software "Software">
-<!ENTITY simulator_version "Version">
-<!ENTITY simulator_profile "Profile">
-<!ENTITY simulator_hardware "Hardware">
-<!ENTITY simulator_device "Device">
-<!ENTITY simulator_screenSize "Screen">
-<!ENTITY simulator_pixelRatio "Pixel Ratio">
-<!ENTITY simulator_tv_data "TV Simulation">
-<!ENTITY simulator_tv_data_open "Config Data">
-<!ENTITY simulator_tv_data_open_button "Open Config Directory…">
--- a/devtools/client/locales/en-US/webide.properties
+++ b/devtools/client/locales/en-US/webide.properties
@@ -37,32 +37,24 @@ error_listRunningApps=Can’t get app list from device
 
 # Variable: name of the operation (in english)
 error_operationTimeout=Operation timed out: %1$S
 error_operationFail=Operation failed: %1$S
 
 # Variable: app name
 error_cantConnectToApp=Can’t connect to app: %1$S
 
-# Variable: error message (in english)
-error_cantFetchAddonsJSON=Can’t fetch the add-on list: %S
-
 error_appProjectsLoadFailed=Unable to load project list. This can occur if you’ve used this profile with a newer version of Firefox.
 error_folderCreationFailed=Unable to create project folder in the selected directory.
 
 # Variable: runtime app build ID (looks like this %Y%M%D format) and firefox build ID (same format)
 error_runtimeVersionTooRecent=The connected runtime has a more recent build date (%1$S) than your desktop Firefox (%2$S) does. This is an unsupported setup and may cause DevTools to fail. Please update Firefox.
 
 addons_stable=stable
 addons_unstable=unstable
-# LOCALIZATION NOTE (addons_simulator_label): This label is shown as the name of
-# a given simulator version in the "Manage Simulators" pane.  %1$S: Firefox OS
-# version in the simulator, ex. 1.3.  %2$S: Simulator stability label, ex.
-# "stable" or "unstable".
-addons_simulator_label=Firefox OS %1$S Simulator (%2$S)
 addons_install_button=install
 addons_uninstall_button=uninstall
 addons_adb_label=ADB Helper Add-on
 addons_adb_warning=USB devices won’t be detected without this add-on
 addons_status_unknown=?
 addons_status_installed=Installed
 addons_status_uninstalled=Not Installed
 addons_status_preparing=preparing
@@ -78,14 +70,8 @@ runtimedetails_notUSBDevice=Not a USB de
 status_tooltip=Validation status: %1$S
 status_valid=VALID
 status_warning=WARNINGS
 status_error=ERRORS
 status_unknown=UNKNOWN
 
 # Device preferences and settings
 device_reset_default=Reset to default
-
-# Simulator options
-simulator_custom_device=Custom
-simulator_custom_binary=Custom B2G binary…
-simulator_custom_profile=Custom Gaia profile…
-simulator_default_profile=Use default
--- a/devtools/client/webide/content/addons.js
+++ b/devtools/client/webide/content/addons.js
@@ -12,35 +12,29 @@ const Strings = Services.strings.createB
 window.addEventListener("load", function () {
   document.querySelector("#aboutaddons").onclick = function () {
     let browserWin = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
     if (browserWin && browserWin.BrowserOpenAddonsMgr) {
       browserWin.BrowserOpenAddonsMgr("addons://list/extension");
     }
   };
   document.querySelector("#close").onclick = CloseUI;
-  GetAvailableAddons().then(BuildUI, (e) => {
-    console.error(e);
-    window.alert(Strings.formatStringFromName("error_cantFetchAddonsJSON", [e], 1));
-  });
+  BuildUI(GetAvailableAddons());
 }, {capture: true, once: true});
 
 window.addEventListener("unload", function () {
   ForgetAddonsList();
 }, {capture: true, once: true});
 
 function CloseUI() {
   window.parent.UI.openProject();
 }
 
 function BuildUI(addons) {
   BuildItem(addons.adb, "adb");
-  for (let addon of addons.simulators) {
-    BuildItem(addon, "simulator");
-  }
 }
 
 function BuildItem(addon, type) {
 
   function onAddonUpdate(event, arg) {
     switch (event) {
       case "update":
         progress.removeAttribute("value");
@@ -76,21 +70,16 @@ function BuildItem(addon, type) {
   let name = document.createElement("span");
   name.className = "name";
 
   switch (type) {
     case "adb":
       li.setAttribute("addon", type);
       name.textContent = Strings.GetStringFromName("addons_adb_label");
       break;
-    case "simulator":
-      li.setAttribute("addon", "simulator-" + addon.version);
-      let stability = Strings.GetStringFromName("addons_" + addon.stability);
-      name.textContent = Strings.formatStringFromName("addons_simulator_label", [addon.version, stability], 2);
-      break;
   }
 
   li.appendChild(name);
 
   let status = document.createElement("span");
   status.className = "status";
   status.textContent = Strings.GetStringFromName("addons_status_" + addon.status);
   li.appendChild(status);
--- a/devtools/client/webide/content/jar.mn
+++ b/devtools/client/webide/content/jar.mn
@@ -23,10 +23,8 @@ webide.jar:
     content/wifi-auth.js              (wifi-auth.js)
     content/wifi-auth.xhtml           (wifi-auth.xhtml)
     content/project-listing.xhtml     (project-listing.xhtml)
     content/project-listing.js        (project-listing.js)
     content/project-panel.js          (project-panel.js)
     content/runtime-panel.js          (runtime-panel.js)
     content/runtime-listing.xhtml     (runtime-listing.xhtml)
     content/runtime-listing.js        (runtime-listing.js)
-    content/simulator.js              (simulator.js)
-    content/simulator.xhtml           (simulator.xhtml)
--- a/devtools/client/webide/content/monitor.js
+++ b/devtools/client/webide/content/monitor.js
@@ -21,17 +21,17 @@ window.addEventListener("load", function
   Monitor.load();
 }, {once: true});
 
 
 /**
  * The Monitor is a WebIDE tool used to display any kind of time-based data in
  * the form of graphs.
  *
- * The data can come from a Firefox OS device, simulator, or from a WebSockets
+ * The data can come from a Firefox OS device, or from a WebSockets
  * server running locally.
  *
  * The format of a data update is typically an object like:
  *
  *     { graph: 'mygraph', curve: 'mycurve', value: 42, time: 1234 }
  *
  * or an array of such objects. For more details on the data format, see the
  * `Graph.update(data)` method.
--- a/devtools/client/webide/content/runtime-listing.js
+++ b/devtools/client/webide/content/runtime-listing.js
@@ -9,17 +9,16 @@ const RuntimeList = require("devtools/cl
 var runtimeList = new RuntimeList(window, window.parent);
 
 window.addEventListener("load", function () {
   document.getElementById("runtime-screenshot").onclick = TakeScreenshot;
   document.getElementById("runtime-details").onclick = ShowRuntimeDetails;
   document.getElementById("runtime-disconnect").onclick = DisconnectRuntime;
   document.getElementById("runtime-preferences").onclick = ShowDevicePreferences;
   document.getElementById("runtime-settings").onclick = ShowSettings;
-  document.getElementById("runtime-panel-installsimulator").onclick = ShowAddons;
   document.getElementById("runtime-panel-noadbhelper").onclick = ShowAddons;
   document.getElementById("runtime-panel-nousbdevice").onclick = ShowTroubleShooting;
   document.getElementById("refresh-devices").onclick = RefreshScanners;
   runtimeList.update();
   runtimeList.updateCommands();
 }, {capture: true, once: true});
 
 window.addEventListener("unload", function () {
--- a/devtools/client/webide/content/runtime-listing.xhtml
+++ b/devtools/client/webide/content/runtime-listing.xhtml
@@ -21,19 +21,16 @@
         <label class="panel-header">&runtimePanel_usb;
           <button class="runtime-panel-item-refreshdevices refresh-icon" id="refresh-devices" title="&runtimePanel_refreshDevices_label;"></button>
         </label>
         <button class="panel-item" id="runtime-panel-nousbdevice">&runtimePanel_nousbdevice;</button>
         <button class="panel-item" id="runtime-panel-noadbhelper">&runtimePanel_noadbhelper;</button>
         <div id="runtime-panel-usb"></div>
         <label class="panel-header" id="runtime-header-wifi">&runtimePanel_wifi;</label>
         <div id="runtime-panel-wifi"></div>
-        <label class="panel-header">&runtimePanel_simulator;</label>
-        <div id="runtime-panel-simulator"></div>
-        <button class="panel-item" id="runtime-panel-installsimulator">&runtimePanel_installsimulator;</button>
         <label class="panel-header">&runtimePanel_other;</label>
         <div id="runtime-panel-other"></div>
         <div id="runtime-actions">
           <button class="panel-item" id="runtime-details">&runtimeMenu_showDetails_label;</button>
           <button class="panel-item" id="runtime-preferences">&runtimeMenu_showDevicePrefs_label;</button>
           <button class="panel-item" id="runtime-settings">&runtimeMenu_showSettings_label;</button>
           <button class="panel-item" id="runtime-screenshot">&runtimeMenu_takeScreenshot_label;</button>
           <button class="panel-item" id="runtime-disconnect">&runtimeMenu_disconnect_label;</button>
deleted file mode 100644
--- a/devtools/client/webide/content/simulator.js
+++ /dev/null
@@ -1,354 +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/. */
-
-var Cu = Components.utils;
-var Ci = Components.interfaces;
-
-const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {});
-const { getDevices, getDeviceString } = require("devtools/client/shared/devices");
-const { Simulators, Simulator } = require("devtools/client/webide/modules/simulators");
-const Services = require("Services");
-const EventEmitter = require("devtools/shared/old-event-emitter");
-const promise = require("promise");
-const utils = require("devtools/client/webide/modules/utils");
-
-const Strings = Services.strings.createBundle("chrome://devtools/locale/webide.properties");
-
-var SimulatorEditor = {
-
-  // Available Firefox OS Simulator addons (key: `addon.id`).
-  _addons: {},
-
-  // Available device simulation profiles (key: `device.name`).
-  _devices: {},
-
-  // The names of supported simulation options.
-  _deviceOptions: [],
-
-  // The <form> element used to edit Simulator options.
-  _form: null,
-
-  // The Simulator object being edited.
-  _simulator: null,
-
-  // Generate the dynamic form elements.
-  init() {
-    let promises = [];
-
-    // Grab the <form> element.
-    let form = this._form;
-    if (!form) {
-      // This is the first time we run `init()`, bootstrap some things.
-      form = this._form = document.querySelector("#simulator-editor");
-      form.addEventListener("change", this.update.bind(this));
-      Simulators.on("configure", (e, simulator) => { this.edit(simulator); });
-      // Extract the list of device simulation options we'll support.
-      let deviceFields = form.querySelectorAll("*[data-device]");
-      this._deviceOptions = Array.map(deviceFields, field => field.name);
-    }
-
-    // Append a new <option> to a <select> (or <optgroup>) element.
-    function opt(select, value, text) {
-      let option = document.createElement("option");
-      option.value = value;
-      option.textContent = text;
-      select.appendChild(option);
-    }
-
-    // Generate B2G version selector.
-    promises.push(Simulators.findSimulatorAddons().then(addons => {
-      this._addons = {};
-      form.version.innerHTML = "";
-      form.version.classList.remove("custom");
-      addons.forEach(addon => {
-        this._addons[addon.id] = addon;
-        opt(form.version, addon.id, addon.name);
-      });
-      opt(form.version, "custom", "");
-      opt(form.version, "pick", Strings.GetStringFromName("simulator_custom_binary"));
-    }));
-
-    // Generate profile selector.
-    form.profile.innerHTML = "";
-    form.profile.classList.remove("custom");
-    opt(form.profile, "default", Strings.GetStringFromName("simulator_default_profile"));
-    opt(form.profile, "custom", "");
-    opt(form.profile, "pick", Strings.GetStringFromName("simulator_custom_profile"));
-
-    // Generate example devices list.
-    form.device.innerHTML = "";
-    form.device.classList.remove("custom");
-    opt(form.device, "custom", Strings.GetStringFromName("simulator_custom_device"));
-    promises.push(getDevices().then(devices => {
-      devices.TYPES.forEach(type => {
-        let b2gDevices = devices[type].filter(d => d.firefoxOS);
-        if (b2gDevices.length < 1) {
-          return;
-        }
-        let optgroup = document.createElement("optgroup");
-        optgroup.label = getDeviceString(type);
-        b2gDevices.forEach(device => {
-          this._devices[device.name] = device;
-          opt(optgroup, device.name, device.name);
-        });
-        form.device.appendChild(optgroup);
-      });
-    }));
-
-    return promise.all(promises);
-  },
-
-  // Edit the configuration of an existing Simulator, or create a new one.
-  edit(simulator) {
-    // If no Simulator was given to edit, we're creating a new one.
-    if (!simulator) {
-      simulator = new Simulator(); // Default options.
-      Simulators.add(simulator);
-    }
-
-    this._simulator = null;
-
-    return this.init().then(() => {
-      this._simulator = simulator;
-
-      // Update the form fields.
-      this._form.name.value = simulator.name;
-
-      this.updateVersionSelector();
-      this.updateProfileSelector();
-      this.updateDeviceSelector();
-      this.updateDeviceFields();
-
-      // Change visibility of 'TV Simulator Menu'.
-      let tvSimMenu = document.querySelector("#tv_simulator_menu");
-      tvSimMenu.style.visibility = (this._simulator.type === "television") ?
-                                   "visible" : "hidden";
-
-      // Trigger any listener waiting for this update
-      let change = document.createEvent("HTMLEvents");
-      change.initEvent("change", true, true);
-      this._form.dispatchEvent(change);
-    });
-  },
-
-  // Open the directory of TV Simulator config.
-  showTVConfigDirectory() {
-    let profD = Services.dirsvc.get("ProfD", Ci.nsIFile);
-    profD.append("extensions");
-    profD.append(this._simulator.addon.id);
-    profD.append("profile");
-    profD.append("dummy");
-    let profileDir = profD.path;
-
-    // Show the profile directory.
-    let nsLocalFile = Components.Constructor("@mozilla.org/file/local;1",
-                                           "nsIFile", "initWithPath");
-    new nsLocalFile(profileDir).reveal();
-  },
-
-  // Close the configuration panel.
-  close() {
-    this._simulator = null;
-    window.parent.UI.openProject();
-  },
-
-  // Restore the simulator to its default configuration.
-  restoreDefaults() {
-    let simulator = this._simulator;
-    this.version = simulator.addon.id;
-    this.profile = "default";
-    simulator.restoreDefaults();
-    Simulators.emitUpdated();
-    return this.edit(simulator);
-  },
-
-  // Delete this simulator.
-  deleteSimulator() {
-    Simulators.remove(this._simulator);
-    this.close();
-  },
-
-  // Select an available option, or set the "custom" option.
-  updateSelector(selector, value) {
-    selector.value = value;
-    if (selector.selectedIndex == -1) {
-      selector.value = "custom";
-      selector.classList.add("custom");
-      selector[selector.selectedIndex].textContent = value;
-    }
-  },
-
-  // VERSION: Can be an installed `addon.id` or a custom binary path.
-
-  get version() {
-    return this._simulator.options.b2gBinary || this._simulator.addon.id;
-  },
-
-  set version(value) {
-    let form = this._form;
-    let simulator = this._simulator;
-    let oldVer = simulator.version;
-    if (this._addons[value]) {
-      // `value` is a simulator addon ID.
-      simulator.addon = this._addons[value];
-      simulator.options.b2gBinary = null;
-    } else {
-      // `value` is a custom binary path.
-      simulator.options.b2gBinary = value;
-      // TODO (Bug 1146531) Indicate that a custom profile is now required.
-    }
-    // If `form.name` contains the old version, update its last occurrence.
-    if (form.name.value.includes(oldVer) && simulator.version !== oldVer) {
-      let regex = new RegExp("(.*)" + oldVer);
-      let name = form.name.value.replace(regex, "$1" + simulator.version);
-      simulator.options.name = form.name.value = Simulators.uniqueName(name);
-    }
-  },
-
-  updateVersionSelector() {
-    this.updateSelector(this._form.version, this.version);
-  },
-
-  // PROFILE. Can be "default" or a custom profile directory path.
-
-  get profile() {
-    return this._simulator.options.gaiaProfile || "default";
-  },
-
-  set profile(value) {
-    this._simulator.options.gaiaProfile = (value == "default" ? null : value);
-  },
-
-  updateProfileSelector() {
-    this.updateSelector(this._form.profile, this.profile);
-  },
-
-  // DEVICE. Can be an existing `device.name` or "custom".
-
-  get device() {
-    let devices = this._devices;
-    let simulator = this._simulator;
-
-    // Search for the name of a device matching current simulator options.
-    for (let name in devices) {
-      let match = true;
-      for (let option of this._deviceOptions) {
-        if (simulator.options[option] === devices[name][option]) {
-          continue;
-        }
-        match = false;
-        break;
-      }
-      if (match) {
-        return name;
-      }
-    }
-    return "custom";
-  },
-
-  set device(name) {
-    let device = this._devices[name];
-    if (!device) {
-      return;
-    }
-    let form = this._form;
-    let simulator = this._simulator;
-    this._deviceOptions.forEach(option => {
-      simulator.options[option] = form[option].value = device[option] || null;
-    });
-    // TODO (Bug 1146531) Indicate when a custom profile is required (e.g. for
-    // tablet, TV…).
-  },
-
-  updateDeviceSelector() {
-    this.updateSelector(this._form.device, this.device);
-  },
-
-  // Erase any current values, trust only the `simulator.options`.
-  updateDeviceFields() {
-    let form = this._form;
-    let simulator = this._simulator;
-    this._deviceOptions.forEach(option => {
-      form[option].value = simulator.options[option];
-    });
-  },
-
-  // Handle a change in our form's fields.
-  update(event) {
-    let simulator = this._simulator;
-    if (!simulator) {
-      return;
-    }
-    let form = this._form;
-    let input = event.target;
-    switch (input.name) {
-      case "name":
-        simulator.options.name = input.value;
-        break;
-      case "version":
-        switch (input.value) {
-          case "pick":
-            utils.getCustomBinary(window).then(file => {
-              if (file) {
-                this.version = file.path;
-              }
-              // Whatever happens, don't stay on the "pick" option.
-              this.updateVersionSelector();
-            });
-            break;
-          case "custom":
-            this.version = input[input.selectedIndex].textContent;
-            break;
-          default:
-            this.version = input.value;
-        }
-        break;
-      case "profile":
-        switch (input.value) {
-          case "pick":
-            utils.getCustomProfile(window).then(directory => {
-              if (directory) {
-                this.profile = directory.path;
-              }
-              // Whatever happens, don't stay on the "pick" option.
-              this.updateProfileSelector();
-            });
-            break;
-          case "custom":
-            this.profile = input[input.selectedIndex].textContent;
-            break;
-          default:
-            this.profile = input.value;
-        }
-        break;
-      case "device":
-        this.device = input.value;
-        break;
-      default:
-        simulator.options[input.name] = input.value || null;
-        this.updateDeviceSelector();
-    }
-    Simulators.emitUpdated();
-  },
-};
-
-window.addEventListener("load", function onLoad() {
-  document.querySelector("#close").onclick = e => {
-    SimulatorEditor.close();
-  };
-  document.querySelector("#reset").onclick = e => {
-    SimulatorEditor.restoreDefaults();
-  };
-  document.querySelector("#remove").onclick = e => {
-    SimulatorEditor.deleteSimulator();
-  };
-
-  // We just loaded, so we probably missed the first configure request.
-  SimulatorEditor.edit(Simulators._lastConfiguredSimulator);
-
-  document.querySelector("#open-tv-dummy-directory").onclick = e => {
-    SimulatorEditor.showTVConfigDirectory();
-    e.preventDefault();
-  };
-});
deleted file mode 100644
--- a/devtools/client/webide/content/simulator.xhtml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- 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/. -->
-
-<!DOCTYPE html [
-  <!ENTITY % webideDTD SYSTEM "chrome://devtools/locale/webide.dtd" >
-  %webideDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
-  <head>
-    <meta charset="utf8"/>
-    <link rel="stylesheet" href="chrome://webide/skin/deck.css" type="text/css"/>
-    <link rel="stylesheet" href="chrome://webide/skin/simulator.css" type="text/css"/>
-    <script type="application/javascript" src="chrome://webide/content/simulator.js"></script>
-  </head>
-  <body>
-
-    <div id="controls">
-      <a id="remove" class="hidden">&simulator_remove;</a>
-      <a id="reset">&simulator_reset;</a>
-      <a id="close">&deck_close;</a>
-    </div>
-
-    <form id="simulator-editor">
-
-      <h1>&simulator_title;</h1>
-
-      <h2>&simulator_software;</h2>
-
-      <ul>
-        <li>
-          <label>
-            <span class="label">&simulator_name;</span>
-            <input type="text" name="name"/>
-          </label>
-        </li>
-        <li>
-          <label>
-            <span class="label">&simulator_version;</span>
-            <select name="version"/>
-          </label>
-        </li>
-        <li>
-          <label>
-            <span class="label">&simulator_profile;</span>
-            <select name="profile"/>
-          </label>
-        </li>
-      </ul>
-
-      <h2>&simulator_hardware;</h2>
-
-      <ul>
-        <li>
-          <label>
-            <span class="label">&simulator_device;</span>
-            <select name="device"/>
-          </label>
-        </li>
-        <li>
-          <label>
-            <span class="label">&simulator_screenSize;</span>
-            <input name="width" data-device="" type="number"/>
-            <span>×</span>
-            <input name="height" data-device="" type="number"/>
-          </label>
-        </li>
-        <li class="hidden">
-          <label>
-            <span class="label">&simulator_pixelRatio;</span>
-            <input name="pixelRatio" data-device="" type="number" step="0.05"/>
-          </label>
-        </li>
-      </ul>
-
-      <!-- This menu is shown when simulator type is television-->
-      <p id="tv_simulator_menu" style="visibility:hidden;">
-        <h2>&simulator_tv_data;</h2>
-
-        <ul>
-          <li>
-            <label>
-              <span class="label">&simulator_tv_data_open;</span>
-              <button id="open-tv-dummy-directory">
-                &simulator_tv_data_open_button;
-              </button>
-            </label>
-          </li>
-        </ul>
-
-      </p>
-
-    </form>
-
-  </body>
-</html>
--- a/devtools/client/webide/content/webide.js
+++ b/devtools/client/webide/content/webide.js
@@ -16,17 +16,16 @@ const {AppManager} = require("devtools/c
 const EventEmitter = require("devtools/shared/old-event-emitter");
 const promise = require("promise");
 const {GetAvailableAddons} = require("devtools/client/webide/modules/addons");
 const {getJSON} = require("devtools/client/shared/getjson");
 const utils = require("devtools/client/webide/modules/utils");
 const Telemetry = require("devtools/client/shared/telemetry");
 const {RuntimeScanners} = require("devtools/client/webide/modules/runtimes");
 const {showDoorhanger} = require("devtools/client/shared/doorhanger");
-const {Simulators} = require("devtools/client/webide/modules/simulators");
 const {Task} = require("devtools/shared/task");
 
 const Strings = Services.strings.createBundle("chrome://devtools/locale/webide.properties");
 
 const HTML = "http://www.w3.org/1999/xhtml";
 const HELP_URL = "https://developer.mozilla.org/docs/Tools/WebIDE/Troubleshooting";
 
 const MAX_ZOOM = 1.4;
@@ -40,17 +39,16 @@ const MS_PER_DAY = 86400000;
    Object.defineProperty(this, key, {
      value: value,
      enumerable: true,
      writable: false
    });
  });
 
 // Download remote resources early
-getJSON("devtools.webide.addonsURL");
 getJSON("devtools.webide.templatesURL");
 getJSON("devtools.devices.url");
 
 // See bug 989619
 console.log = console.log.bind(console);
 console.warn = console.warn.bind(console);
 console.error = console.error.bind(console);
 
@@ -86,42 +84,37 @@ var UI = {
       console.error(e);
       this.reportError("error_appProjectsLoadFailed");
     });
 
     // Auto install the ADB Addon Helper. Only once.
     // If the user decides to uninstall any of this addon, we won't install it again.
     let autoinstallADBHelper = Services.prefs.getBoolPref("devtools.webide.autoinstallADBHelper");
     if (autoinstallADBHelper) {
-      GetAvailableAddons().then(addons => {
-        addons.adb.install();
-      }, console.error);
+      let addons = GetAvailableAddons();
+      addons.adb.install();
     }
 
     Services.prefs.setBoolPref("devtools.webide.autoinstallADBHelper", false);
 
     this.setupDeck();
 
     this.contentViewer = window.QueryInterface(Ci.nsIInterfaceRequestor)
                                .getInterface(Ci.nsIWebNavigation)
                                .QueryInterface(Ci.nsIDocShell)
                                .contentViewer;
     this.contentViewer.fullZoom = Services.prefs.getCharPref("devtools.webide.zoom");
 
     gDevToolsBrowser.isWebIDEInitialized.resolve();
-
-    this.configureSimulator = this.configureSimulator.bind(this);
-    Simulators.on("configure", this.configureSimulator);
   },
 
   destroy: function () {
     window.removeEventListener("focus", this.onfocus, true);
     AppManager.off("app-manager-update", this.appManagerUpdate);
     AppManager.destroy();
-    Simulators.off("configure", this.configureSimulator);
     this.updateConnectionTelemetry();
     this._telemetry.toolClosed("webide");
     this._telemetry.destroy();
   },
 
   onfocus: function () {
     // Because we can't track the activity in the folder project,
     // we need to validate the project regularly. Let's assume that
@@ -194,20 +187,16 @@ var UI = {
         break;
       case "runtime-targets":
         this.autoSelectProject();
         break;
     }
     this._updatePromise = promise.resolve();
   },
 
-  configureSimulator: function (event, simulator) {
-    UI.selectDeckPanel("simulator");
-  },
-
   openInBrowser: function (url) {
     // Open a URL in a Firefox window
     let mainWindow = Services.wm.getMostRecentWindow(gDevTools.chromeWindowType);
     if (mainWindow) {
       mainWindow.openUILinkIn(url, "tab");
       mainWindow.focus()
     } else {
       window.open(url);
--- a/devtools/client/webide/content/webide.xul
+++ b/devtools/client/webide/content/webide.xul
@@ -10,17 +10,17 @@
 ]>
 
 <?xul-overlay href="chrome://global/content/editMenuOverlay.xul"?>
 
 <?xml-stylesheet href="chrome://global/skin/global.css"?>
 <?xml-stylesheet href="resource://devtools/client/themes/common.css"?>
 <?xml-stylesheet href="chrome://webide/skin/webide.css"?>
 
-<window id="webide" onclose="return UI.canCloseProject();"
+<window id="webide" 
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
         xmlns:html="http://www.w3.org/1999/xhtml"
         title="&windowTitle;"
         windowtype="devtools:webide"
         macanimationtype="document"
         fullscreenbutton="true"
         screenX="4" screenY="4"
         width="800" height="600"
@@ -148,17 +148,16 @@
       <splitter class="devtools-side-splitter" id="project-listing-splitter"/>
       <deck flex="1" id="deck" selectedIndex="-1">
         <iframe id="deck-panel-details" flex="1" src="details.xhtml"/>
         <iframe id="deck-panel-addons" flex="1" src="addons.xhtml"/>
         <iframe id="deck-panel-prefs" flex="1" src="prefs.xhtml"/>
         <iframe id="deck-panel-runtimedetails" flex="1" lazysrc="runtimedetails.xhtml"/>
         <iframe id="deck-panel-monitor" flex="1" lazysrc="monitor.xhtml"/>
         <iframe id="deck-panel-devicepreferences" flex="1" lazysrc="devicepreferences.xhtml"/>
-        <iframe id="deck-panel-simulator" flex="1" lazysrc="simulator.xhtml"/>
       </deck>
       <splitter class="devtools-side-splitter" id="runtime-listing-splitter"/>
       <vbox id="runtime-listing-panel" class="runtime-listing panel-list" flex="1">
         <div id="runtime-listing-wrapper" class="panel-list-wrapper">
           <iframe id="runtime-listing-panel-details" flex="1" src="runtime-listing.xhtml" tooltip="aHTMLTooltip"/>
         </div>
       </vbox>
     </div>
--- a/devtools/client/webide/modules/addons.js
+++ b/devtools/client/webide/modules/addons.js
@@ -4,21 +4,17 @@
 
 "use strict";
 
 const {AddonManager} = require("resource://gre/modules/AddonManager.jsm");
 const Services = require("Services");
 const {getJSON} = require("devtools/client/shared/getjson");
 const EventEmitter = require("devtools/shared/old-event-emitter");
 
-const ADDONS_URL = "devtools.webide.addonsURL";
-
-var SIMULATOR_LINK = Services.prefs.getCharPref("devtools.webide.simulatorAddonsURL");
 var ADB_LINK = Services.prefs.getCharPref("devtools.webide.adbAddonURL");
-var SIMULATOR_ADDON_ID = Services.prefs.getCharPref("devtools.webide.simulatorAddonID");
 var ADB_ADDON_ID = Services.prefs.getCharPref("devtools.webide.adbAddonID");
 
 var platform = Services.appShell.hiddenDOMWindow.navigator.platform;
 var OS = "";
 if (platform.indexOf("Win") != -1) {
   OS = "win32";
 } else if (platform.indexOf("Mac") != -1) {
   OS = "mac64";
@@ -30,53 +26,33 @@ if (platform.indexOf("Win") != -1) {
   }
 }
 
 var addonsListener = {};
 addonsListener.onEnabled =
 addonsListener.onDisabled =
 addonsListener.onInstalled =
 addonsListener.onUninstalled = (updatedAddon) => {
-  GetAvailableAddons().then(addons => {
-    for (let a of [...addons.simulators, addons.adb]) {
-      if (a.addonID == updatedAddon.id) {
-        a.updateInstallStatus();
-      }
-    }
-  });
+  let addons = GetAvailableAddons();
+  addons.adb.updateInstallStatus();
 };
 AddonManager.addAddonListener(addonsListener);
 
-var GetAvailableAddons_promise = null;
+var AvailableAddons = null;
 var GetAvailableAddons = exports.GetAvailableAddons = function () {
-  if (!GetAvailableAddons_promise) {
-    GetAvailableAddons_promise = new Promise((resolve, reject) => {
-      let addons = {
-        simulators: [],
-        adb: null
-      };
-      getJSON(ADDONS_URL).then(json => {
-        for (let stability in json) {
-          for (let version of json[stability]) {
-            addons.simulators.push(new SimulatorAddon(stability, version));
-          }
-        }
-        addons.adb = new ADBAddon();
-        resolve(addons);
-      }, e => {
-        GetAvailableAddons_promise = null;
-        reject(e);
-      });
-    });
+  if (!AvailableAddons) {
+    AvailableAddons = {
+      adb: new ADBAddon()
+    };
   }
-  return GetAvailableAddons_promise;
+  return AvailableAddons;
 };
 
 exports.ForgetAddonsList = function () {
-  GetAvailableAddons_promise = null;
+  AvailableAddons = null;
 };
 
 function Addon() {}
 Addon.prototype = {
   _status: "unknown",
   set status(value) {
     if (this._status != value) {
       this._status = value;
@@ -155,30 +131,16 @@ Addon.prototype = {
   onInstallCancelled: function (install) {
     this.installFailureHandler(install, "Install cancelled");
   },
   onInstallFailed: function (install) {
     this.installFailureHandler(install, "Install failed");
   },
 };
 
-function SimulatorAddon(stability, version) {
-  EventEmitter.decorate(this);
-  this.stability = stability;
-  this.version = version;
-  // This addon uses the string "linux" for "linux32"
-  let fixedOS = OS == "linux32" ? "linux" : OS;
-  this.xpiLink = SIMULATOR_LINK.replace(/#OS#/g, fixedOS)
-                               .replace(/#VERSION#/g, version)
-                               .replace(/#SLASHED_VERSION#/g, version.replace(/\./g, "_"));
-  this.addonID = SIMULATOR_ADDON_ID.replace(/#SLASHED_VERSION#/g, version.replace(/\./g, "_"));
-  this.updateInstallStatus();
-}
-SimulatorAddon.prototype = Object.create(Addon.prototype);
-
 function ADBAddon() {
   EventEmitter.decorate(this);
   // This addon uses the string "linux" for "linux32"
   let fixedOS = OS == "linux32" ? "linux" : OS;
   this.xpiLink = ADB_LINK.replace(/#OS#/g, fixedOS);
   this.addonID = ADB_ADDON_ID;
   this.updateInstallStatus();
 }
--- a/devtools/client/webide/modules/app-manager.js
+++ b/devtools/client/webide/modules/app-manager.js
@@ -770,17 +770,16 @@ var AppManager = exports.AppManager = {
   },
 
   /* RUNTIME LIST */
 
   _clearRuntimeList: function () {
     this.runtimeList = {
       usb: [],
       wifi: [],
-      simulator: [],
       other: []
     };
   },
 
   _rebuildRuntimeList: function () {
     let runtimes = RuntimeScanners.listRuntimes();
     this._clearRuntimeList();
 
@@ -788,19 +787,16 @@ var AppManager = exports.AppManager = {
     for (let runtime of runtimes) {
       switch (runtime.type) {
         case RuntimeTypes.USB:
           this.runtimeList.usb.push(runtime);
           break;
         case RuntimeTypes.WIFI:
           this.runtimeList.wifi.push(runtime);
           break;
-        case RuntimeTypes.SIMULATOR:
-          this.runtimeList.simulator.push(runtime);
-          break;
         default:
           this.runtimeList.other.push(runtime);
       }
     }
 
     this.update("runtime-details");
     this.update("runtime-list");
   },
--- a/devtools/client/webide/modules/moz.build
+++ b/devtools/client/webide/modules/moz.build
@@ -8,13 +8,11 @@ DevToolsModules(
     'addons.js',
     'app-manager.js',
     'app-projects.js',
     'app-validator.js',
     'config-view.js',
     'project-list.js',
     'runtime-list.js',
     'runtimes.js',
-    'simulator-process.js',
-    'simulators.js',
     'tab-store.js',
     'utils.js'
 )
--- a/devtools/client/webide/modules/runtime-list.js
+++ b/devtools/client/webide/modules/runtime-list.js
@@ -121,17 +121,16 @@ RuntimeList.prototype = {
     if (WiFiScanner.allowed) {
       wifiHeaderNode.removeAttribute("hidden");
     } else {
       wifiHeaderNode.setAttribute("hidden", "true");
     }
 
     let usbListNode = doc.querySelector("#runtime-panel-usb");
     let wifiListNode = doc.querySelector("#runtime-panel-wifi");
-    let simulatorListNode = doc.querySelector("#runtime-panel-simulator");
     let otherListNode = doc.querySelector("#runtime-panel-other");
     let noHelperNode = doc.querySelector("#runtime-panel-noadbhelper");
     let noUSBNode = doc.querySelector("#runtime-panel-nousbdevice");
 
     if (Devices.helperAddonInstalled) {
       noHelperNode.setAttribute("hidden", "true");
     } else {
       noHelperNode.removeAttribute("hidden");
@@ -147,17 +146,16 @@ RuntimeList.prototype = {
       noUSBNode.removeAttribute("hidden");
     } else {
       noUSBNode.setAttribute("hidden", "true");
     }
 
     for (let [type, parent] of [
       ["usb", usbListNode],
       ["wifi", wifiListNode],
-      ["simulator", simulatorListNode],
       ["other", otherListNode],
     ]) {
       while (parent.hasChildNodes()) {
         parent.firstChild.remove();
       }
       for (let runtime of runtimeList[type]) {
         let r = runtime;
         let panelItemNode = doc.createElement(this._panelBoxEl);
--- a/devtools/client/webide/modules/runtimes.js
+++ b/devtools/client/webide/modules/runtimes.js
@@ -4,17 +4,16 @@
 
 "use strict";
 
 const {Ci} = require("chrome");
 const Services = require("Services");
 const {Devices} = require("resource://devtools/shared/apps/Devices.jsm");
 const {Connection} = require("devtools/shared/client/connection-manager");
 const {DebuggerServer} = require("devtools/server/main");
-const {Simulators} = require("devtools/client/webide/modules/simulators");
 const discovery = require("devtools/shared/discovery/discovery");
 const EventEmitter = require("devtools/shared/old-event-emitter");
 const promise = require("promise");
 loader.lazyRequireGetter(this, "AuthenticationResult",
   "devtools/shared/security/auth", true);
 loader.lazyRequireGetter(this, "DevToolsUtils",
   "devtools/shared/DevToolsUtils");
 
@@ -190,57 +189,16 @@ var RuntimeScanners = {
 };
 
 EventEmitter.decorate(RuntimeScanners);
 
 exports.RuntimeScanners = RuntimeScanners;
 
 /* SCANNERS */
 
-var SimulatorScanner = {
-
-  _runtimes: [],
-
-  enable() {
-    this._updateRuntimes = this._updateRuntimes.bind(this);
-    Simulators.on("updated", this._updateRuntimes);
-    this._updateRuntimes();
-  },
-
-  disable() {
-    Simulators.off("updated", this._updateRuntimes);
-  },
-
-  _emitUpdated() {
-    this.emit("runtime-list-updated");
-  },
-
-  _updateRuntimes() {
-    Simulators.findSimulators().then(simulators => {
-      this._runtimes = [];
-      for (let simulator of simulators) {
-        this._runtimes.push(new SimulatorRuntime(simulator));
-      }
-      this._emitUpdated();
-    });
-  },
-
-  scan() {
-    return promise.resolve();
-  },
-
-  listRuntimes: function () {
-    return this._runtimes;
-  }
-
-};
-
-EventEmitter.decorate(SimulatorScanner);
-RuntimeScanners.add(SimulatorScanner);
-
 /**
  * This is a lazy ADB scanner shim which only tells the ADB Helper to start and
  * stop as needed.  The real scanner that lists devices lives in ADB Helper.
  * ADB Helper 0.8.0 and later wait until these signals are received before
  * starting ADB polling.  For earlier versions, they have no effect.
  */
 var LazyAdbScanner = {
 
@@ -356,17 +314,16 @@ RuntimeScanners.add(StaticScanner);
 
 /* RUNTIMES */
 
 // These type strings are used for logging events to Telemetry.
 // You must update Histograms.json if new types are added.
 var RuntimeTypes = exports.RuntimeTypes = {
   USB: "USB",
   WIFI: "WIFI",
-  SIMULATOR: "SIMULATOR",
   REMOTE: "REMOTE",
   LOCAL: "LOCAL",
   OTHER: "OTHER"
 };
 
 function WiFiRuntime(deviceName) {
   this.deviceName = deviceName;
 }
@@ -472,45 +429,16 @@ WiFiRuntime.prototype = {
       }
     };
   }
 };
 
 // For testing use only
 exports._WiFiRuntime = WiFiRuntime;
 
-function SimulatorRuntime(simulator) {
-  this.simulator = simulator;
-}
-
-SimulatorRuntime.prototype = {
-  type: RuntimeTypes.SIMULATOR,
-  connect: function (connection) {
-    return this.simulator.launch().then(port => {
-      connection.host = "localhost";
-      connection.port = port;
-      connection.keepConnecting = true;
-      connection.once(Connection.Events.DISCONNECTED, e => this.simulator.kill());
-      connection.connect();
-    });
-  },
-  configure() {
-    Simulators.emit("configure", this.simulator);
-  },
-  get id() {
-    return this.simulator.id;
-  },
-  get name() {
-    return this.simulator.name;
-  },
-};
-
-// For testing use only
-exports._SimulatorRuntime = SimulatorRuntime;
-
 var gLocalRuntime = {
   type: RuntimeTypes.LOCAL,
   connect: function (connection) {
     if (!DebuggerServer.initialized) {
       DebuggerServer.init();
       DebuggerServer.addBrowserActors();
     }
     DebuggerServer.allowChromeProcess = true;
deleted file mode 100644
--- a/devtools/client/webide/modules/simulator-process.js
+++ /dev/null
@@ -1,336 +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, Ci, Cu } = require("chrome");
-
-const Environment = Cc["@mozilla.org/process/environment;1"]
-                      .getService(Ci.nsIEnvironment);
-const EventEmitter = require("devtools/shared/old-event-emitter");
-const Services = require("Services");
-
-const {Subprocess} = Cu.import("resource://gre/modules/Subprocess.jsm", {});
-
-loader.lazyGetter(this, "OS", () => {
-  switch (Services.appinfo.OS) {
-    case "Darwin":
-      return "mac64";
-    case "Linux":
-      if (Services.appinfo.XPCOMABI.indexOf("x86_64") === 0) {
-        return "linux64";
-      } else {
-        return "linux32";
-      }
-    case "WINNT":
-      return "win32";
-    default:
-      return "";
-  }
-});
-
-function SimulatorProcess() {}
-SimulatorProcess.prototype = {
-
-  // Check if B2G is running.
-  get isRunning() {
-    return !!this.process;
-  },
-
-  // Start the process and connect the debugger client.
-  run() {
-
-    // Resolve B2G binary.
-    let b2g = this.b2gBinary;
-    if (!b2g || !b2g.exists()) {
-      throw Error("B2G executable not found.");
-    }
-
-    // Ensure Gaia profile exists.
-    let gaia = this.gaiaProfile;
-    if (!gaia || !gaia.exists()) {
-      throw Error("Gaia profile directory not found.");
-    }
-
-    this.once("stdout", function () {
-      if (OS == "mac64") {
-        console.debug("WORKAROUND run osascript to show b2g-desktop window on OS=='mac64'");
-        // Escape double quotes and escape characters for use in AppleScript.
-        let path = b2g.path.replace(/\\/g, "\\\\").replace(/\"/g, '\\"');
-
-        Subprocess.call({
-          command: "/usr/bin/osascript",
-          arguments: ["-e", 'tell application "' + path + '" to activate'],
-        });
-      }
-    });
-
-    let logHandler = (e, data) => this.log(e, data.trim());
-    this.on("stdout", logHandler);
-    this.on("stderr", logHandler);
-    this.once("exit", () => {
-      this.off("stdout", logHandler);
-      this.off("stderr", logHandler);
-    });
-
-    let environment;
-    if (OS.indexOf("linux") > -1) {
-      environment = ["TMPDIR=" + Services.dirsvc.get("TmpD", Ci.nsIFile).path];
-      ["DISPLAY", "XAUTHORITY"]
-        .filter(key => Environment.exists(key))
-        .forEach(key => {
-          environment.push(key + "=" + Environment.get(key));
-        });
-    }
-
-    // Spawn a B2G instance.
-    Subprocess.call({
-      command: b2g.path,
-      arguments: this.args,
-      environmentAppend: true,
-      environment: environment,
-      stderr: "pipe",
-    }).then(process => {
-      this.process = process;
-      let dumpPipe = async (pipe, type) => {
-        let data = await pipe.readString();
-        while (data) {
-          this.emit(type, data);
-          data = await pipe.readString();
-        }
-      };
-      dumpPipe(process.stdout, "stdout");
-      dumpPipe(process.stderr, "stderr");
-
-      // On B2G instance exit, reset tracked process, remote debugger port and
-      // shuttingDown flag, then finally emit an exit event.
-      process.wait().then(result => {
-        this.process = null;
-        this.emit("exit", result.exitCode);
-      });
-    });
-  },
-
-  // Request a B2G instance kill.
-  kill() {
-    return new Promise(resolve => {
-      if (this.process) {
-        this.once("exit", (e, exitCode) => {
-          this.shuttingDown = false;
-          resolve(exitCode);
-        });
-        if (!this.shuttingDown) {
-          this.shuttingDown = true;
-          this.emit("kill", null);
-          this.process.kill();
-        }
-      } else {
-        return resolve(undefined);
-      }
-    });
-  },
-
-  // Maybe log output messages.
-  log(level, message) {
-    if (!Services.prefs.getBoolPref("devtools.webide.logSimulatorOutput")) {
-      return;
-    }
-    if (level === "stderr" || level === "error") {
-      console.error(message);
-      return;
-    }
-    console.log(message);
-  },
-
-  // Compute B2G CLI arguments.
-  get args() {
-    let args = [];
-
-    // Gaia profile.
-    args.push("-profile", this.gaiaProfile.path);
-
-    // Debugger server port.
-    let port = parseInt(this.options.port);
-    args.push("-start-debugger-server", "" + port);
-
-    // Screen size.
-    let width = parseInt(this.options.width);
-    let height = parseInt(this.options.height);
-    if (width && height) {
-      args.push("-screen", width + "x" + height);
-    }
-
-    // Ignore eventual zombie instances of b2g that are left over.
-    args.push("-no-remote");
-
-    // If we are running a simulator based on Mulet,
-    // we have to override the default chrome URL
-    // in order to prevent the Browser UI to appear.
-    if (this.b2gBinary.leafName.includes("firefox")) {
-      args.push("-chrome", "chrome://b2g/content/shell.html");
-    }
-
-    return args;
-  },
-};
-
-EventEmitter.decorate(SimulatorProcess.prototype);
-
-
-function CustomSimulatorProcess(options) {
-  this.options = options;
-}
-
-var CSPp = CustomSimulatorProcess.prototype = Object.create(SimulatorProcess.prototype);
-
-// Compute B2G binary file handle.
-Object.defineProperty(CSPp, "b2gBinary", {
-  get: function () {
-    let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
-    file.initWithPath(this.options.b2gBinary);
-    return file;
-  }
-});
-
-// Compute Gaia profile file handle.
-Object.defineProperty(CSPp, "gaiaProfile", {
-  get: function () {
-    let file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
-    file.initWithPath(this.options.gaiaProfile);
-    return file;
-  }
-});
-
-exports.CustomSimulatorProcess = CustomSimulatorProcess;
-
-
-function AddonSimulatorProcess(addon, options) {
-  this.addon = addon;
-  this.options = options;
-}
-
-var ASPp = AddonSimulatorProcess.prototype = Object.create(SimulatorProcess.prototype);
-
-// Compute B2G binary file handle.
-Object.defineProperty(ASPp, "b2gBinary", {
-  get: function () {
-    let file;
-    try {
-      let pref = "extensions." + this.addon.id + ".customRuntime";
-      file = Services.prefs.getComplexValue(pref, Ci.nsIFile);
-    } catch (e) {}
-
-    if (!file) {
-      file = this.addon.getResourceURI().QueryInterface(Ci.nsIFileURL).file;
-      file.append("b2g");
-      let binaries = {
-        win32: "b2g-bin.exe",
-        mac64: "B2G.app/Contents/MacOS/b2g-bin",
-        linux32: "b2g-bin",
-        linux64: "b2g-bin",
-      };
-      binaries[OS].split("/").forEach(node => file.append(node));
-    }
-    // If the binary doesn't exists, it may be because of a simulator
-    // based on mulet, which has a different binary name.
-    if (!file.exists()) {
-      file = this.addon.getResourceURI().QueryInterface(Ci.nsIFileURL).file;
-      file.append("firefox");
-      let binaries = {
-        win32: "firefox.exe",
-        mac64: "FirefoxNightly.app/Contents/MacOS/firefox-bin",
-        linux32: "firefox-bin",
-        linux64: "firefox-bin",
-      };
-      binaries[OS].split("/").forEach(node => file.append(node));
-    }
-    return file;
-  }
-});
-
-// Compute Gaia profile file handle.
-Object.defineProperty(ASPp, "gaiaProfile", {
-  get: function () {
-    let file;
-
-    // Custom profile from simulator configuration.
-    if (this.options.gaiaProfile) {
-      file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile);
-      file.initWithPath(this.options.gaiaProfile);
-      return file;
-    }
-
-    // Custom profile from addon prefs.
-    try {
-      let pref = "extensions." + this.addon.id + ".gaiaProfile";
-      file = Services.prefs.getComplexValue(pref, Ci.nsIFile);
-      return file;
-    } catch (e) {}
-
-    // Default profile from addon.
-    file = this.addon.getResourceURI().QueryInterface(Ci.nsIFileURL).file;
-    file.append("profile");
-    return file;
-  }
-});
-
-exports.AddonSimulatorProcess = AddonSimulatorProcess;
-
-
-function OldAddonSimulatorProcess(addon, options) {
-  this.addon = addon;
-  this.options = options;
-}
-
-var OASPp = OldAddonSimulatorProcess.prototype = Object.create(AddonSimulatorProcess.prototype);
-
-// Compute B2G binary file handle.
-Object.defineProperty(OASPp, "b2gBinary", {
-  get: function () {
-    let file;
-    try {
-      let pref = "extensions." + this.addon.id + ".customRuntime";
-      file = Services.prefs.getComplexValue(pref, Ci.nsIFile);
-    } catch (e) {}
-
-    if (!file) {
-      file = this.addon.getResourceURI().QueryInterface(Ci.nsIFileURL).file;
-      let version = this.addon.name.match(/\d+\.\d+/)[0].replace(/\./, "_");
-      file.append("resources");
-      file.append("fxos_" + version + "_simulator");
-      file.append("data");
-      file.append(OS == "linux32" ? "linux" : OS);
-      let binaries = {
-        win32: "b2g/b2g-bin.exe",
-        mac64: "B2G.app/Contents/MacOS/b2g-bin",
-        linux32: "b2g/b2g-bin",
-        linux64: "b2g/b2g-bin",
-      };
-      binaries[OS].split("/").forEach(node => file.append(node));
-    }
-    return file;
-  }
-});
-
-// Compute B2G CLI arguments.
-Object.defineProperty(OASPp, "args", {
-  get: function () {
-    let args = [];
-
-    // Gaia profile.
-    args.push("-profile", this.gaiaProfile.path);
-
-    // Debugger server port.
-    let port = parseInt(this.options.port);
-    args.push("-dbgport", "" + port);
-
-    // Ignore eventual zombie instances of b2g that are left over.
-    args.push("-no-remote");
-
-    return args;
-  }
-});
-
-exports.OldAddonSimulatorProcess = OldAddonSimulatorProcess;
deleted file mode 100644
--- a/devtools/client/webide/modules/simulators.js
+++ /dev/null
@@ -1,368 +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 { AddonManager } = require("resource://gre/modules/AddonManager.jsm");
-const { Task } = require("devtools/shared/task");
-loader.lazyRequireGetter(this, "ConnectionManager", "devtools/shared/client/connection-manager", true);
-loader.lazyRequireGetter(this, "AddonSimulatorProcess", "devtools/client/webide/modules/simulator-process", true);
-loader.lazyRequireGetter(this, "OldAddonSimulatorProcess", "devtools/client/webide/modules/simulator-process", true);
-loader.lazyRequireGetter(this, "CustomSimulatorProcess", "devtools/client/webide/modules/simulator-process", true);
-const asyncStorage = require("devtools/shared/async-storage");
-const EventEmitter = require("devtools/shared/old-event-emitter");
-const Services = require("Services");
-
-const SimulatorRegExp = new RegExp(Services.prefs.getCharPref("devtools.webide.simulatorAddonRegExp"));
-const LocaleCompare = (a, b) => {
-  return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
-};
-
-var Simulators = {
-
-  // The list of simulator configurations.
-  _simulators: [],
-
-  /**
-   * Load a previously saved list of configurations (only once).
-   *
-   * @return Promise.
-   */
-  _load() {
-    if (this._loadingPromise) {
-      return this._loadingPromise;
-    }
-
-    this._loadingPromise = Task.spawn(function* () {
-      let jobs = [];
-
-      let value = yield asyncStorage.getItem("simulators");
-      if (Array.isArray(value)) {
-        value.forEach(options => {
-          let simulator = new Simulator(options);
-          Simulators.add(simulator, true);
-
-          // If the simulator had a reference to an addon, fix it.
-          if (options.addonID) {
-            let deferred = new Promise(resolve => {
-              AddonManager.getAddonByID(options.addonID, addon => {
-                simulator.addon = addon;
-                delete simulator.options.addonID;
-                resolve();
-              });
-            });
-            jobs.push(deferred);
-          }
-        });
-      }
-
-      yield Promise.all(jobs);
-      yield Simulators._addUnusedAddons();
-      Simulators.emitUpdated();
-      return Simulators._simulators;
-    });
-
-    return this._loadingPromise;
-  },
-
-  /**
-   * Add default simulators to the list for each new (unused) addon.
-   *
-   * @return Promise.
-   */
-  _addUnusedAddons: Task.async(function* () {
-    let jobs = [];
-
-    let addons = yield Simulators.findSimulatorAddons();
-    addons.forEach(addon => {
-      jobs.push(Simulators.addIfUnusedAddon(addon, true));
-    });
-
-    yield Promise.all(jobs);
-  }),
-
-  /**
-   * Save the current list of configurations.
-   *
-   * @return Promise.
-   */
-  _save: Task.async(function* () {
-    yield this._load();
-
-    let value = Simulators._simulators.map(simulator => {
-      let options = JSON.parse(JSON.stringify(simulator.options));
-      if (simulator.addon != null) {
-        options.addonID = simulator.addon.id;
-      }
-      return options;
-    });
-
-    yield asyncStorage.setItem("simulators", value);
-  }),
-
-  /**
-   * List all available simulators.
-   *
-   * @return Promised simulator list.
-   */
-  findSimulators: Task.async(function* () {
-    yield this._load();
-    return Simulators._simulators;
-  }),
-
-  /**
-   * List all installed simulator addons.
-   *
-   * @return Promised addon list.
-   */
-  findSimulatorAddons() {
-    return new Promise(resolve => {
-      AddonManager.getAllAddons(all => {
-        let addons = [];
-        for (let addon of all) {
-          if (Simulators.isSimulatorAddon(addon)) {
-            addons.push(addon);
-          }
-        }
-        // Sort simulator addons by name.
-        addons.sort(LocaleCompare);
-        resolve(addons);
-      });
-    });
-  },
-
-  /**
-   * Add a new simulator for `addon` if no other simulator uses it.
-   */
-  addIfUnusedAddon(addon, silently = false) {
-    let simulators = this._simulators;
-    let matching = simulators.filter(s => s.addon && s.addon.id == addon.id);
-    if (matching.length > 0) {
-      return Promise.resolve();
-    }
-    let options = {};
-    options.name = addon.name.replace(" Simulator", "");
-    // Some addons specify a simulator type at the end of their version string,
-    // e.g. "2_5_tv".
-    let type = this.simulatorAddonVersion(addon).split("_")[2];
-    if (type) {
-      // "tv" is shorthand for type "television".
-      options.type = (type === "tv" ? "television" : type);
-    }
-    return this.add(new Simulator(options, addon), silently);
-  },
-
-  // TODO (Bug 1146521) Maybe find a better way to deal with removed addons?
-  removeIfUsingAddon(addon) {
-    let simulators = this._simulators;
-    let remaining = simulators.filter(s => !s.addon || s.addon.id != addon.id);
-    this._simulators = remaining;
-    if (remaining.length !== simulators.length) {
-      this.emitUpdated();
-    }
-  },
-
-  /**
-   * Add a new simulator to the list. Caution: `simulator.name` may be modified.
-   *
-   * @return Promise to added simulator.
-   */
-  add(simulator, silently = false) {
-    let simulators = this._simulators;
-    let uniqueName = this.uniqueName(simulator.options.name);
-    simulator.options.name = uniqueName;
-    simulators.push(simulator);
-    if (!silently) {
-      this.emitUpdated();
-    }
-    return Promise.resolve(simulator);
-  },
-
-  /**
-   * Remove a simulator from the list.
-   */
-  remove(simulator) {
-    let simulators = this._simulators;
-    let remaining = simulators.filter(s => s !== simulator);
-    this._simulators = remaining;
-    if (remaining.length !== simulators.length) {
-      this.emitUpdated();
-    }
-  },
-
-  /**
-   * Get a unique name for a simulator (may add a suffix, e.g. "MyName (1)").
-   */
-  uniqueName(name) {
-    let simulators = this._simulators;
-
-    let names = {};
-    simulators.forEach(simulator => names[simulator.name] = true);
-
-    // Strip any previous suffix, add a new suffix if necessary.
-    let stripped = name.replace(/ \(\d+\)$/, "");
-    let unique = stripped;
-    for (let i = 1; names[unique]; i++) {
-      unique = stripped + " (" + i + ")";
-    }
-    return unique;
-  },
-
-  /**
-   * Compare an addon's ID against the expected form of a simulator addon ID,
-   * and try to extract its version if there is a match.
-   *
-   * Note: If a simulator addon is recognized, but no version can be extracted
-   * (e.g. custom RegExp pref value), we return "Unknown" to keep the returned
-   * value 'truthy'.
-   */
-  simulatorAddonVersion(addon) {
-    let match = SimulatorRegExp.exec(addon.id);
-    if (!match) {
-      return null;
-    }
-    let version = match[1];
-    return version || "Unknown";
-  },
-
-  /**
-   * Detect simulator addons, including "unofficial" ones.
-   */
-  isSimulatorAddon(addon) {
-    return !!this.simulatorAddonVersion(addon);
-  },
-
-  emitUpdated() {
-    this.emit("updated", { length: this._simulators.length });
-    this._simulators.sort(LocaleCompare);
-    this._save();
-  },
-
-  onConfigure(e, simulator) {
-    this._lastConfiguredSimulator = simulator;
-  },
-
-  onInstalled(addon) {
-    if (this.isSimulatorAddon(addon)) {
-      this.addIfUnusedAddon(addon);
-    }
-  },
-
-  onEnabled(addon) {
-    if (this.isSimulatorAddon(addon)) {
-      this.addIfUnusedAddon(addon);
-    }
-  },
-
-  onDisabled(addon) {
-    if (this.isSimulatorAddon(addon)) {
-      this.removeIfUsingAddon(addon);
-    }
-  },
-
-  onUninstalled(addon) {
-    if (this.isSimulatorAddon(addon)) {
-      this.removeIfUsingAddon(addon);
-    }
-  },
-};
-exports.Simulators = Simulators;
-AddonManager.addAddonListener(Simulators);
-EventEmitter.decorate(Simulators);
-Simulators.on("configure", Simulators.onConfigure.bind(Simulators));
-
-function Simulator(options = {}, addon = null) {
-  this.addon = addon;
-  this.options = options;
-
-  // Fill `this.options` with default values where needed.
-  let defaults = this.defaults;
-  for (let option in defaults) {
-    if (this.options[option] == null) {
-      this.options[option] = defaults[option];
-    }
-  }
-}
-Simulator.prototype = {
-
-  // Default simulation options.
-  _defaults: {
-    // Based on the Firefox OS Flame.
-    phone: {
-      width: 320,
-      height: 570,
-      pixelRatio: 1.5
-    },
-    // Based on a 720p HD TV.
-    television: {
-      width: 1280,
-      height: 720,
-      pixelRatio: 1,
-    }
-  },
-  _defaultType: "phone",
-
-  restoreDefaults() {
-    let defaults = this.defaults;
-    let options = this.options;
-    for (let option in defaults) {
-      options[option] = defaults[option];
-    }
-  },
-
-  launch() {
-    // Close already opened simulation.
-    if (this.process) {
-      return this.kill().then(this.launch.bind(this));
-    }
-
-    this.options.port = ConnectionManager.getFreeTCPPort();
-
-    // Choose simulator process type.
-    if (this.options.b2gBinary) {
-      // Custom binary.
-      this.process = new CustomSimulatorProcess(this.options);
-    } else if (this.version > "1.3") {
-      // Recent simulator addon.
-      this.process = new AddonSimulatorProcess(this.addon, this.options);
-    } else {
-      // Old simulator addon.
-      this.process = new OldAddonSimulatorProcess(this.addon, this.options);
-    }
-    this.process.run();
-
-    return Promise.resolve(this.options.port);
-  },
-
-  kill() {
-    let process = this.process;
-    if (!process) {
-      return Promise.resolve();
-    }
-    this.process = null;
-    return process.kill();
-  },
-
-  get defaults() {
-    let defaults = this._defaults;
-    return defaults[this.type] || defaults[this._defaultType];
-  },
-
-  get id() {
-    return this.name;
-  },
-
-  get name() {
-    return this.options.name;
-  },
-
-  get type() {
-    return this.options.type || this._defaultType;
-  },
-
-  get version() {
-    return this.options.b2gBinary ? "Custom" : this.addon.name.match(/\d+\.\d+/)[0];
-  },
-};
-exports.Simulator = Simulator;
deleted file mode 100644
index 238c9756257ea0d9d8dc5f7e639d7ab6716b6d95..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 2f86c4d4d5f68a212acf5e59cdb9d5f7a5cb60a5..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 6da2fcbad77aeb90b39898a5cb005d6f2f8d6f93..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 546deacaf81c59cf28a7bbfdfbffd6b7838cd024..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index e2335e3a0462f1344d412552263b43345bda9d4b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 75fe209eac3f6c16523e57976464e1db50d9b521..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 58749f72421d1fc04c91a08672c8d907eb314d48..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 60cffd46eb560f796e2c83165a62e44057105c15..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index c54cae3aa703eaff030fdedced22c6cd0f30a16b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 9a650a888211adf65c511e1fee30d072e857b882..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index d13dd78de9cc8087db058c850f5c814b988515c4..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 92d5cc39427c419b6b2e824e73d49a761b881e0b..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 7a2a432ff4459e665d0b1cdf7887c81f56bd9fbe..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index d389321956e2b75e0a20e2fcb24ff0ebf71491d3..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 48e271d54a2e8c5d0b32b4dcdec9b6f0ca880953..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
index 4c8bb2f10010dfe9ce2b994af313e46a7a6ebce2..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/devtools/client/webide/test/addons/simulators.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
-  "stable": ["1.0", "2.0"],
-  "unstable": ["3.0", "3.0_tv"]
-}
--- a/devtools/client/webide/test/browser.ini
+++ b/devtools/client/webide/test/browser.ini
@@ -1,12 +1,11 @@
 [DEFAULT]
 tags = devtools
 skip-if = asan || debug # bug 1078284 too many intermittents for these tests
 subsuite = devtools
 support-files =
-  addons/simulators.json
   doc_tabs.html
   head.js
   templates.json
 
 [browser_tabs.js]
 skip-if = e10s # Bug 1072167 - browser_tabs.js test fails under e10s
--- a/devtools/client/webide/test/chrome.ini
+++ b/devtools/client/webide/test/chrome.ini
@@ -1,32 +1,15 @@
 [DEFAULT]
 tags = devtools
 skip-if = asan || debug # bug 1078284 too many intermittents for these tests
 support-files =
   app/index.html
   app/manifest.webapp
   app.zip
-  addons/simulators.json
-  addons/fxos_1_0_simulator-linux.xpi
-  addons/fxos_1_0_simulator-linux64.xpi
-  addons/fxos_1_0_simulator-win32.xpi
-  addons/fxos_1_0_simulator-mac64.xpi
-  addons/fxos_2_0_simulator-linux.xpi
-  addons/fxos_2_0_simulator-linux64.xpi
-  addons/fxos_2_0_simulator-win32.xpi
-  addons/fxos_2_0_simulator-mac64.xpi
-  addons/fxos_3_0_simulator-linux.xpi
-  addons/fxos_3_0_simulator-linux64.xpi
-  addons/fxos_3_0_simulator-win32.xpi
-  addons/fxos_3_0_simulator-mac64.xpi
-  addons/fxos_3_0_tv_simulator-linux.xpi
-  addons/fxos_3_0_tv_simulator-linux64.xpi
-  addons/fxos_3_0_tv_simulator-win32.xpi
-  addons/fxos_3_0_tv_simulator-mac64.xpi
   addons/adbhelper-linux.xpi
   addons/adbhelper-linux64.xpi
   addons/adbhelper-win32.xpi
   addons/adbhelper-mac64.xpi
   build_app1/package.json
   build_app2/manifest.webapp
   build_app2/package.json
   build_app2/stage/empty-directory
@@ -52,12 +35,10 @@ skip-if = (os == "linux") # Bug 1024734
 [test_addons.html]
 skip-if = true # Bug 1201392 - Update add-ons after migration
 [test_device_runtime.html]
 [test_autoconnect_runtime.html]
 [test_autoselect_project.html]
 [test_device_preferences.html]
 [test_fullscreenToolbox.html]
 [test_zoom.html]
-[test_simulators.html]
-skip-if = true # Bug 1281138 - intermittent failures
 [test_toolbox.html]
 [test_app_validator.html]
--- a/devtools/client/webide/test/head.js
+++ b/devtools/client/webide/test/head.js
@@ -21,18 +21,16 @@ if (window.location === "chrome://browse
   TEST_BASE = "chrome://mochitests/content/browser/devtools/client/webide/test/";
 } else {
   TEST_BASE = "chrome://mochitests/content/chrome/devtools/client/webide/test/";
 }
 
 Services.prefs.setBoolPref("devtools.webide.enabled", true);
 Services.prefs.setBoolPref("devtools.webide.enableLocalRuntime", true);
 
-Services.prefs.setCharPref("devtools.webide.addonsURL", TEST_BASE + "addons/simulators.json");
-Services.prefs.setCharPref("devtools.webide.simulatorAddonsURL", TEST_BASE + "addons/fxos_#SLASHED_VERSION#_simulator-#OS#.xpi");
 Services.prefs.setCharPref("devtools.webide.adbAddonURL", TEST_BASE + "addons/adbhelper-#OS#.xpi");
 Services.prefs.setCharPref("devtools.webide.templatesURL", TEST_BASE + "templates.json");
 Services.prefs.setCharPref("devtools.devices.url", TEST_BASE + "browser_devices.json");
 
 var registerCleanupFunction = registerCleanupFunction ||
                               SimpleTest.registerCleanupFunction;
 registerCleanupFunction(() => {
   flags.testing = false;
--- a/devtools/client/webide/test/test_addons.html
+++ b/devtools/client/webide/test/test_addons.html
@@ -13,66 +13,20 @@
   </head>
 
   <body>
 
     <script type="application/javascript">
       window.onload = function() {
         SimpleTest.waitForExplicitFinish();
 
-        const {GetAvailableAddons} = require("devtools/client/webide/modules/addons");
         const {Devices} = Cu.import("resource://devtools/shared/apps/Devices.jsm");
-        const {Simulators} = require("devtools/client/webide/modules/simulators");
 
         let adbAddonsInstalled;
 
-        function getVersion(name) {
-          return name.match(/(\d+\.\d+)/)[0];
-        }
-
-        function onSimulatorInstalled(name) {
-          return new Promise(resolve => {
-            Simulators.on("updated", function onUpdate() {
-              Simulators.findSimulatorAddons().then(addons => {
-                for (let addon of addons) {
-                  if (name == addon.name.replace(" Simulator", "")) {
-                    Simulators.off("updated", onUpdate);
-                    nextTick().then(resolve);
-                    return;
-                  }
-                }
-              });
-            });
-          });
-        }
-
-        function installSimulatorFromUI(doc, name) {
-          let li = doc.querySelector('[addon="simulator-' + getVersion(name) + '"]');
-          li.querySelector(".install-button").click();
-          return onSimulatorInstalled(name);
-        }
-
-        function uninstallSimulatorFromUI(doc, name) {
-          return new Promise((resolve, reject) => {
-            Simulators.on("updated", function onUpdate() {
-              nextTick().then(() => {
-                let li = doc.querySelector('[status="uninstalled"][addon="simulator-' + getVersion(name) + '"]');
-                if (li) {
-                  Simulators.off("updated", onUpdate);
-                  resolve();
-                } else {
-                  reject("Can't find item");
-                }
-              });
-            });
-            let li = doc.querySelector('[status="installed"][addon="simulator-' + getVersion(name) + '"]');
-            li.querySelector(".uninstall-button").click();
-          });
-        }
-
         function uninstallADBFromUI(doc) {
           return new Promise((resolve, reject) => {
             Devices.on("addon-status-updated", function onUpdate() {
               nextTick().then(() => {
                 let li = doc.querySelector('[status="uninstalled"][addon="adb"]');
                 if (li) {
                   Devices.off("addon-status-updated", onUpdate);
                   resolve();
@@ -88,77 +42,20 @@
 
         Task.spawn(function*() {
 
           ok(!Devices.helperAddonInstalled, "Helper not installed");
 
           let win = yield openWebIDE(true);
           let docRuntime = getRuntimeDocument(win);
 
-          adbAddonsInstalled = new Promise(resolve => {
-            Devices.on("addon-status-updated", function onUpdate1() {
-              Devices.off("addon-status-updated", onUpdate1);
-              resolve();
-            });
-          });
-
           ok(Devices.helperAddonInstalled, "Helper has been auto-installed");
 
           yield nextTick();
 
-          let addons = yield GetAvailableAddons();
-
-          is(addons.simulators.length, 3, "3 simulator addons to install");
-
-          let sim10 = addons.simulators.filter(a => a.version == "1.0")[0];
-          sim10.install();
-
-          yield onSimulatorInstalled("Firefox OS 1.0");
-
-          win.Cmds.showAddons();
-
-          let frame = win.document.querySelector("#deck-panel-addons");
-          let addonDoc = frame.contentWindow.document;
-          let lis;
-
-          lis = addonDoc.querySelectorAll("li");
-          is(lis.length, 5, "5 addons listed");
-
-          lis = addonDoc.querySelectorAll('li[status="installed"]');
-          is(lis.length, 3, "3 addons installed");
-
-          lis = addonDoc.querySelectorAll('li[status="uninstalled"]');
-          is(lis.length, 2, "2 addons uninstalled");
-
-          info("Uninstalling Simulator 2.0");
-
-          yield installSimulatorFromUI(addonDoc, "Firefox OS 2.0");
-
-          info("Uninstalling Simulator 3.0");
-
-          yield installSimulatorFromUI(addonDoc, "Firefox OS 3.0");
-
-          yield nextTick();
-
-          let panelNode = docRuntime.querySelector("#runtime-panel");
-          let items;
-
-          items = panelNode.querySelectorAll(".runtime-panel-item-usb");
-          is(items.length, 1, "Found one runtime button");
-
-          items = panelNode.querySelectorAll(".runtime-panel-item-simulator");
-          is(items.length, 3, "Found 3 simulators button");
-
-          yield uninstallSimulatorFromUI(addonDoc, "Firefox OS 1.0");
-          yield uninstallSimulatorFromUI(addonDoc, "Firefox OS 2.0");
-          yield uninstallSimulatorFromUI(addonDoc, "Firefox OS 3.0");
-
-          items = panelNode.querySelectorAll(".runtime-panel-item-simulator");
-          is(items.length, 0, "No simulator listed");
-
           let w = addonDoc.querySelector(".warning");
           let display = addonDoc.defaultView.getComputedStyle(w).display
           is(display, "none", "Warning about missing ADB hidden");
 
           yield uninstallADBFromUI(addonDoc, "adb");
 
           items = panelNode.querySelectorAll(".runtime-panel-item-usb");
           is(items.length, 0, "No usb runtime listed");
deleted file mode 100644
--- a/devtools/client/webide/test/test_simulators.html
+++ /dev/null
@@ -1,427 +0,0 @@
-<!DOCTYPE html>
-
-<html>
-
-  <head>
-    <meta charset="utf8">
-    <title></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="head.js"></script>
-    <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css">
-  </head>
-
-  <body>
-
-    <script type="application/javascript">
-      window.onload = function() {
-        SimpleTest.waitForExplicitFinish();
-
-        const asyncStorage = require("devtools/shared/async-storage");
-        const EventEmitter = require("devtools/shared/old-event-emitter");
-        const { GetAvailableAddons } = require("devtools/client/webide/modules/addons");
-        const { getDevices } = require("devtools/client/shared/devices");
-        const { Simulator, Simulators } = require("devtools/client/webide/modules/simulators");
-        const { AddonSimulatorProcess,
-                OldAddonSimulatorProcess,
-                CustomSimulatorProcess } = require("devtools/client/webide/modules/simulator-process");
-
-        function addonStatus(addon, status) {
-          if (addon.status == status) {
-            return Promise.resolve();
-          }
-          return new Promise(resolve => {
-            addon.on("update", function onUpdate() {
-              if (addon.status == status) {
-                addon.off("update", onUpdate);
-                nextTick().then(() => resolve());
-              }
-            });
-          });
-        }
-
-        function waitForUpdate(length) {
-          info(`Wait for update with length ${length}`);
-          return new Promise(resolve => {
-            let handler = (_, data) => {
-              if (data.length != length) {
-                return;
-              }
-              info(`Got update with length ${length}`);
-              Simulators.off("updated", handler);
-              resolve();
-            };
-            Simulators.on("updated", handler);
-          });
-        }
-
-        Task.spawn(function* () {
-          let win = yield openWebIDE(false);
-
-          yield Simulators._load();
-
-          let docRuntime = getRuntimeDocument(win);
-          let find = win.document.querySelector.bind(docRuntime);
-          let findAll = win.document.querySelectorAll.bind(docRuntime);
-
-          let simulatorList = find("#runtime-panel-simulator");
-          let simulatorPanel = win.document.querySelector("#deck-panel-simulator");
-
-          // Hack SimulatorProcesses to spy on simulation parameters.
-
-          let resolver;
-	  function fakeRun() {
-            resolver({
-              path: this.b2gBinary.path,
-              args: this.args
-            });
-            // Don't actually try to connect to the fake simulator.
-            throw new Error("Aborting on purpose before connection.");
-          }
-
-          AddonSimulatorProcess.prototype.run = fakeRun;
-          OldAddonSimulatorProcess.prototype.run = fakeRun;
-          CustomSimulatorProcess.prototype.run = fakeRun;
-
-          function runSimulator(i) {
-            return new Promise(resolve => {
-              resolver = resolve;
-              findAll(".runtime-panel-item-simulator")[i].click();
-            });
-          }
-
-          // Install fake "Firefox OS 1.0" simulator addon.
-
-          let addons = yield GetAvailableAddons();
-
-          let sim10 = addons.simulators.filter(a => a.version == "1.0")[0];
-
-          sim10.install();
-
-          let updated = waitForUpdate(1);
-          yield addonStatus(sim10, "installed");
-          yield updated;
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          is(findAll(".runtime-panel-item-simulator").length, 1, "One simulator in runtime panel");
-
-          // Install fake "Firefox OS 2.0" simulator addon.
-
-          let sim20 = addons.simulators.filter(a => a.version == "2.0")[0];
-
-          sim20.install();
-
-          updated = waitForUpdate(2);
-          yield addonStatus(sim20, "installed");
-          yield updated;
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          is(findAll(".runtime-panel-item-simulator").length, 2, "Two simulators in runtime panel");
-
-          // Dry run a simulator to verify that its parameters look right.
-
-          let params = yield runSimulator(0);
-
-          ok(params.path.includes(sim10.addonID) && params.path.includes("b2g-bin"), "Simulator binary path looks right");
-
-          let pid = params.args.indexOf("-profile");
-          ok(pid > -1, "Simulator process arguments have --profile");
-
-          let profilePath = params.args[pid + 1];
-          ok(profilePath.includes(sim10.addonID) && profilePath.includes("profile"), "Simulator profile path looks right");
-
-          ok(params.args.indexOf("-dbgport") > -1 || params.args.indexOf("-start-debugger-server") > -1, "Simulator process arguments have a debugger port");
-
-          ok(params.args.indexOf("-no-remote") > -1, "Simulator process arguments have --no-remote");
-
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          // Configure the fake 1.0 simulator.
-
-          simulatorList.querySelectorAll(".configure-button")[0].click();
-          is(win.document.querySelector("#deck").selectedPanel, simulatorPanel, "Simulator deck panel is selected");
-
-          yield lazyIframeIsLoaded(simulatorPanel);
-
-          let doc = simulatorPanel.contentWindow.document;
-          let form = doc.querySelector("#simulator-editor");
-
-          let formReady = new Promise((resolve, reject) => {
-            form.addEventListener("change", () => {
-              resolve();
-            });
-          });
-
-          let change = doc.createEvent("HTMLEvents");
-          change.initEvent("change", true, true);
-
-          function set(input, value) {
-            input.value = value;
-            input.dispatchEvent(change);
-            return nextTick();
-          }
-
-          let MockFilePicker = SpecialPowers.MockFilePicker;
-          MockFilePicker.init(simulatorPanel.contentWindow);
-
-          yield formReady;
-
-          // Test `name`.
-
-          is(form.name.value, find(".runtime-panel-item-simulator").textContent, "Original simulator name");
-
-          let customName = "CustomFox ";
-          yield set(form.name, customName + "1.0");
-
-          is(find(".runtime-panel-item-simulator").textContent, form.name.value, "Updated simulator name");
-
-          // Test `version`.
-
-          is(form.version.value, sim10.addonID, "Original simulator version");
-          ok(!form.version.classList.contains("custom"), "Version selector is not customized");
-
-          yield set(form.version, sim20.addonID);
-
-          ok(!form.version.classList.contains("custom"), "Version selector is not customized after addon change");
-          is(form.name.value, customName + "2.0", "Simulator name was updated to new version");
-
-          // Pick custom binary, but act like the user aborted the file picker.
-
-          MockFilePicker.setFiles([]);
-          yield set(form.version, "pick");
-
-          is(form.version.value, sim20.addonID, "Version selector reverted to last valid choice after customization abort");
-          ok(!form.version.classList.contains("custom"), "Version selector is not customized after customization abort");
-
-          // Pick custom binary, and actually follow through. (success, verify value = "custom" and textContent = custom path)
-
-          yield MockFilePicker.useAnyFile();
-          yield set(form.version, "pick");
-
-          let fakeBinary = MockFilePicker.file;
-
-          ok(form.version.value == "custom", "Version selector was set to a new custom binary");
-          ok(form.version.classList.contains("custom"), "Version selector is now customized");
-          is(form.version.selectedOptions[0].textContent, fakeBinary.path, "Custom option textContent is correct");
-
-          yield set(form.version, sim10.addonID);
-
-          ok(form.version.classList.contains("custom"), "Version selector remains customized after change back to addon");
-          is(form.name.value, customName + "1.0", "Simulator name was updated to new version");
-
-          yield set(form.version, "custom");
-
-          ok(form.version.value == "custom", "Version selector is back to custom");
-
-          // Test `profile`.
-
-          is(form.profile.value, "default", "Default simulator profile");
-          ok(!form.profile.classList.contains("custom"), "Profile selector is not customized");
-
-          MockFilePicker.setFiles([]);
-          yield set(form.profile, "pick");
-
-          is(form.profile.value, "default", "Profile selector reverted to last valid choice after customization abort");
-          ok(!form.profile.classList.contains("custom"), "Profile selector is not customized after customization abort");
-
-          let fakeProfile = FileUtils.getDir("TmpD", []);
-
-          MockFilePicker.setFiles([ fakeProfile ]);
-          yield set(form.profile, "pick");
-
-          ok(form.profile.value == "custom", "Profile selector was set to a new custom directory");
-          ok(form.profile.classList.contains("custom"), "Profile selector is now customized");
-          is(form.profile.selectedOptions[0].textContent, fakeProfile.path, "Custom option textContent is correct");
-
-          yield set(form.profile, "default");
-
-          is(form.profile.value, "default", "Profile selector back to default");
-          ok(form.profile.classList.contains("custom"), "Profile selector remains customized after change back to default");
-
-          yield set(form.profile, "custom");
-
-          is(form.profile.value, "custom", "Profile selector back to custom");
-
-          params = yield runSimulator(0);
-
-          is(params.path, fakeBinary.path, "Simulator process uses custom binary path");
-
-          pid = params.args.indexOf("-profile");
-          is(params.args[pid + 1], fakeProfile.path, "Simulator process uses custom profile directory");
-
-          yield set(form.version, sim10.addonID);
-
-          is(form.name.value, customName + "1.0", "Simulator restored to 1.0");
-
-          params = yield runSimulator(0);
-
-          pid = params.args.indexOf("-profile");
-          is(params.args[pid + 1], fakeProfile.path, "Simulator process still uses custom profile directory");
-
-          yield set(form.version, "custom");
-
-          // Test `device`.
-
-          let defaults = Simulator.prototype._defaults;
-
-          for (let param in defaults.phone) {
-            is(form[param].value, String(defaults.phone[param]), "Default phone value for device " + param);
-          }
-
-          let width = 5000, height = 4000;
-          yield set(form.width, width);
-          yield set(form.height, height);
-
-          is(form.device.value, "custom", "Device selector is custom");
-
-          params = yield runSimulator(0);
-
-          let sid = params.args.indexOf("-screen");
-          ok(sid > -1, "Simulator process arguments have --screen");
-          ok(params.args[sid + 1].includes(width + "x" + height), "Simulator screen resolution looks right");
-
-          yield set(form.version, sim10.addonID);
-
-          // Configure the fake 2.0 simulator.
-
-          simulatorList.querySelectorAll(".configure-button")[1].click();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          // Test `name`.
-
-          is(form.name.value, findAll(".runtime-panel-item-simulator")[1].textContent, "Original simulator name");
-
-          yield set(form.name, customName + "2.0");
-
-          is(findAll(".runtime-panel-item-simulator")[1].textContent, form.name.value, "Updated simulator name");
-
-          yield set(form.version, sim10.addonID);
-
-          ok(form.name.value !== customName + "1.0", "Conflicting simulator name was deduplicated");
-
-          is(form.name.value, findAll(".runtime-panel-item-simulator")[1].textContent, "Deduplicated simulator name stayed consistent");
-
-          yield set(form.version, sim20.addonID);
-
-          is(form.name.value, customName + "2.0", "Name deduplication was undone when possible");
-
-          // Test `device`.
-
-          for (let param in defaults.phone) {
-            is(form[param].value, String(defaults.phone[param]), "Default phone value for device " + param);
-          }
-
-          let devices = yield getDevices();
-          devices = devices[devices.TYPES[0]];
-          let device = devices[devices.length - 1];
-
-          yield set(form.device, device.name);
-
-          is(form.device.value, device.name, "Device selector was changed");
-          is(form.width.value, String(device.width), "New device width is correct");
-          is(form.height.value, String(device.height), "New device height is correct");
-
-          params = yield runSimulator(1);
-
-          sid = params.args.indexOf("-screen");
-          ok(params.args[sid + 1].includes(device.width + "x" + device.height), "Simulator screen resolution looks right");
-
-          // Test Simulator Menu.
-          is(doc.querySelector("#tv_simulator_menu").style.visibility, "hidden", "OpenTVDummyDirectory Button is not hidden");
-
-          // Restore default simulator options.
-
-          doc.querySelector("#reset").click();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          for (let param in defaults.phone) {
-            is(form[param].value, String(defaults.phone[param]), "Default phone value for device " + param);
-          }
-
-          // Install and configure the fake "Firefox OS 3.0 TV" simulator addon.
-
-          let sim30tv = addons.simulators.filter(a => a.version == "3.0_tv")[0];
-
-          sim30tv.install();
-
-          updated = waitForUpdate(3);
-          yield addonStatus(sim30tv, "installed");
-          yield updated;
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          is(findAll(".runtime-panel-item-simulator").length, 3, "Three simulators in runtime panel");
-
-          simulatorList.querySelectorAll(".configure-button")[2].click();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          for (let param in defaults.television) {
-            is(form[param].value, String(defaults.television[param]), "Default TV value for device " + param);
-          }
-
-          // Test Simulator Menu
-          is(doc.querySelector("#tv_simulator_menu").style.visibility, "visible", "OpenTVDummyDirectory Button is not visible");
-
-          // Force reload the list of simulators.
-
-          Simulators._loadingPromise = null;
-          Simulators._simulators = [];
-          yield Simulators._load();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          is(findAll(".runtime-panel-item-simulator").length, 3, "Three simulators saved and reloaded " + Simulators._simulators.map(s => s.name).join(','));
-
-          // Uninstall the 3.0 TV and 2.0 addons, and watch their Simulator objects disappear.
-
-          sim30tv.uninstall();
-
-          yield addonStatus(sim30tv, "uninstalled");
-
-          is(findAll(".runtime-panel-item-simulator").length, 2, "Two simulators left in runtime panel");
-
-          sim20.uninstall();
-
-          yield addonStatus(sim20, "uninstalled");
-
-          is(findAll(".runtime-panel-item-simulator").length, 1, "One simulator left in runtime panel");
-
-          // Remove 1.0 simulator.
-
-          simulatorList.querySelectorAll(".configure-button")[0].click();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          doc.querySelector("#remove").click();
-          // Wait for next tick to ensure UI elements are updated
-          yield nextTick();
-
-          is(findAll(".runtime-panel-item-simulator").length, 0, "Last simulator was removed");
-
-          yield asyncStorage.removeItem("simulators");
-
-          sim10.uninstall();
-
-          MockFilePicker.cleanup();
-
-          doc.querySelector("#close").click();
-
-          ok(!win.document.querySelector("#deck").selectedPanel, "No panel selected");
-
-          yield closeWebIDE(win);
-
-          SimpleTest.finish();
-
-        });
-      }
-
-    </script>
-  </body>
-</html>
--- a/devtools/client/webide/themes/jar.mn
+++ b/devtools/client/webide/themes/jar.mn
@@ -11,12 +11,11 @@ webide.jar:
   skin/throbber.svg            (throbber.svg)
   skin/deck.css                (deck.css)
   skin/addons.css              (addons.css)
   skin/runtimedetails.css      (runtimedetails.css)
   skin/monitor.css             (monitor.css)
   skin/config-view.css         (config-view.css)
   skin/wifi-auth.css           (wifi-auth.css)
   skin/panel-listing.css       (panel-listing.css)
-  skin/simulator.css           (simulator.css)
   skin/rocket.svg              (rocket.svg)
   skin/noise.png               (noise.png)
   skin/default-app-icon.png    (default-app-icon.png)
--- a/devtools/client/webide/themes/panel-listing.css
+++ b/devtools/client/webide/themes/panel-listing.css
@@ -42,17 +42,16 @@ label,
 .panel-header:first-child {
   margin-top: 0;
 }
 
 .panel-header[hidden], .panel-item[hidden] {
   display: none;
 }
 
-#runtime-panel-simulator,
 .panel-item-complex {
   clear: both;
   position: relative;
 }
 
 .panel-item span {
   display: block;
   float: left;
@@ -123,27 +122,25 @@ button.panel-item:not(:disabled):hover {
   border: 0;
 }
 
 .configure-button:hover {
   cursor: pointer;
 }
 
 .project-panel-item-openpackaged  { background-image: -moz-image-rect(url("icons.png"), 260, 438, 286, 412); }
-.runtime-panel-item-simulator     { background-image: -moz-image-rect(url("icons.png"), 0, 438, 26, 412); }
 .runtime-panel-item-other         { background-image: -moz-image-rect(url("icons.png"), 26, 438, 52, 412); }
 #runtime-screenshot               { background-image: -moz-image-rect(url("icons.png"), 131, 438, 156, 412); }
 
 #runtime-preferences,
 #runtime-settings                 { background-image: -moz-image-rect(url("icons.png"), 105, 464, 131, 438); }
 
 #runtime-panel-nousbdevice,
 #runtime-details                  { background-image: -moz-image-rect(url("icons.png"), 156, 438, 182, 412);  }
 
 .runtime-panel-item-usb,
 #runtime-disconnect               { background-image: -moz-image-rect(url("icons.png"), 52, 438, 78, 412); }
 
 .runtime-panel-item-wifi,
 .project-panel-item-openhosted    { background-image: -moz-image-rect(url("icons.png"), 208, 438, 234, 412); }
 
 .project-panel-item-newapp,
-#runtime-panel-noadbhelper,
-#runtime-panel-installsimulator   { background-image: -moz-image-rect(url("icons.png"), 234, 438, 260, 412); }
+#runtime-panel-noadbhelper        { background-image: -moz-image-rect(url("icons.png"), 234, 438, 260, 412); }
deleted file mode 100644
--- a/devtools/client/webide/themes/simulator.css
+++ /dev/null
@@ -1,41 +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/. */
-
-select:not(.custom) > option[value="custom"] {
-  display: none;
-}
-
-select, input[type="text"] {
-  width: 13rem;
-}
-
-input[name="name"] {
-  height: 1.8rem;
-}
-
-input[type="number"] {
-  width: 6rem;
-}
-
-input[type="text"], input[type="number"] {
-  padding-left: 0.2rem;
-}
-
-li > label:hover {
-  background-color: transparent;
-}
-
-ul {
-  padding-left: 0;
-}
-
-.label {
-  width: 6rem;
-  padding: 0.2rem;
-  text-align: right;
-}
-
-.hidden {
-  display: none;
-}
--- a/devtools/client/webide/webide-prefs.js
+++ b/devtools/client/webide/webide-prefs.js
@@ -2,20 +2,15 @@
    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/. */
 
 pref("devtools.webide.templatesURL", "https://code.cdn.mozilla.net/templates/list.json");
 pref("devtools.webide.autoinstallADBHelper", true);
 pref("devtools.webide.autoConnectRuntime", true);
 pref("devtools.webide.restoreLastProject", true);
 pref("devtools.webide.enableLocalRuntime", false);
-pref("devtools.webide.addonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/index.json");
-pref("devtools.webide.simulatorAddonsURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/#VERSION#/#OS#/fxos_#SLASHED_VERSION#_simulator-#OS#-latest.xpi");
-pref("devtools.webide.simulatorAddonID", "fxos_#SLASHED_VERSION#_simulator@mozilla.org");
-pref("devtools.webide.simulatorAddonRegExp", "fxos_(.*)_simulator@mozilla\\.org$");
 pref("devtools.webide.adbAddonURL", "https://ftp.mozilla.org/pub/mozilla.org/labs/fxos-simulator/adb-helper/#OS#/adbhelper-#OS#-latest.xpi");
 pref("devtools.webide.adbAddonID", "adbhelper@mozilla.org");
 pref("devtools.webide.monitorWebSocketURL", "ws://localhost:9000");
 pref("devtools.webide.lastConnectedRuntime", "");
 pref("devtools.webide.lastSelectedProject", "");
-pref("devtools.webide.logSimulatorOutput", false);
 pref("devtools.webide.zoom", "1");
 pref("devtools.webide.busyTimeout", 10000);
deleted file mode 100644
--- a/devtools/shared/apps/Simulator.jsm
+++ /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/. */
-
-"use strict";
-
-const { require } = Components.utils.import("resource://devtools/shared/Loader.jsm", {});
-const EventEmitter = require("devtools/shared/old-event-emitter");
-
-/**
- * TODO (Bug 1132453) The `Simulator` module is deprecated, and should be
- * removed once all simulator addons stop using it (see bug 1132452).
- *
- * If you want to register, unregister, or otherwise deal with installed
- * simulators, please use the `Simulators` module defined in:
- *
- *   devtools/client/webide/modules/simulators.js
- */
-
-this.EXPORTED_SYMBOLS = ["Simulator"];
-
-let Simulator = this.Simulator = {
-  _simulators: {},
-
-  register: function (name, simulator) {
-    // simulators register themselves as "Firefox OS X.Y"
-    this._simulators[name] = simulator;
-    this.emit("register", name);
-  },
-
-  unregister: function (name) {
-    delete this._simulators[name];
-    this.emit("unregister", name);
-  },
-
-  availableNames: function () {
-    return Object.keys(this._simulators).sort();
-  },
-
-  getByName: function (name) {
-    return this._simulators[name];
-  },
-};
-
-EventEmitter.decorate(Simulator);