From 23d1165cd42a0d7048e16ce736dd0efe11e7c192 Mon Sep 17 00:00:00 2001 From: Jennifer Fong Date: Mon, 27 Apr 2015 14:19:00 -0400 Subject: [PATCH] Bug 1135191 - Add runtime panel with toggle. r=jryans --- browser/devtools/webide/content/jar.mn | 3 + .../webide/content/project-listing.js | 20 +- .../webide/content/project-listing.xhtml | 2 +- .../devtools/webide/content/project-panel.js | 46 ++- .../webide/content/runtime-listing.js | 61 ++++ .../webide/content/runtime-listing.xhtml | 43 +++ .../devtools/webide/content/runtime-panel.js | 26 ++ browser/devtools/webide/content/webide.js | 324 +++++++----------- browser/devtools/webide/content/webide.xul | 17 +- .../devtools/webide/modules/app-manager.js | 6 +- .../devtools/webide/modules/project-list.js | 84 ++++- .../devtools/webide/modules/runtime-list.js | 232 +++++++++++++ browser/devtools/webide/moz.build | 1 + browser/devtools/webide/test/browser_tabs.js | 3 +- browser/devtools/webide/test/head.js | 25 +- .../devtools/webide/test/sidebars/browser.ini | 4 + .../webide/test/sidebars/browser_tabs.js | 75 ++++ .../devtools/webide/test/sidebars/chrome.ini | 15 +- .../webide/test/sidebars/test_addons.html | 178 ++++++++++ .../sidebars/test_autoconnect_runtime.html | 93 +++++ .../sidebars/test_autoselect_project.html | 93 +++++ .../sidebars/test_device_permissions.html | 83 +++++ .../sidebars/test_device_preferences.html | 90 +++++ .../test/sidebars/test_device_settings.html | 91 +++++ .../test/sidebars/test_duplicate_import.html | 4 +- .../test/sidebars/test_fullscreenToolbox.html | 72 ++++ .../webide/test/sidebars/test_import.html | 4 +- .../test/sidebars/test_manifestUpdate.html | 95 +++++ .../webide/test/sidebars/test_newapp.html | 46 +++ .../webide/test/sidebars/test_runtime.html | 76 +++- .../webide/test/sidebars/test_telemetry.html | 268 +++++++++++++++ .../webide/test/test_autoconnect_runtime.html | 7 +- .../webide/test/test_autoselect_project.html | 7 +- .../devtools/webide/test/test_runtime.html | 2 +- browser/devtools/webide/themes/jar.mn | 2 +- ...{project-listing.css => panel-listing.css} | 21 +- browser/devtools/webide/themes/webide.css | 17 +- toolkit/devtools/apps/app-actor-front.js | 6 +- 38 files changed, 1936 insertions(+), 306 deletions(-) create mode 100644 browser/devtools/webide/content/runtime-listing.js create mode 100644 browser/devtools/webide/content/runtime-listing.xhtml create mode 100644 browser/devtools/webide/content/runtime-panel.js create mode 100644 browser/devtools/webide/modules/runtime-list.js create mode 100644 browser/devtools/webide/test/sidebars/browser_tabs.js create mode 100644 browser/devtools/webide/test/sidebars/test_addons.html create mode 100644 browser/devtools/webide/test/sidebars/test_autoconnect_runtime.html create mode 100644 browser/devtools/webide/test/sidebars/test_autoselect_project.html create mode 100644 browser/devtools/webide/test/sidebars/test_device_permissions.html create mode 100644 browser/devtools/webide/test/sidebars/test_device_preferences.html create mode 100644 browser/devtools/webide/test/sidebars/test_device_settings.html create mode 100644 browser/devtools/webide/test/sidebars/test_fullscreenToolbox.html create mode 100644 browser/devtools/webide/test/sidebars/test_manifestUpdate.html create mode 100644 browser/devtools/webide/test/sidebars/test_newapp.html create mode 100644 browser/devtools/webide/test/sidebars/test_telemetry.html rename browser/devtools/webide/themes/{project-listing.css => panel-listing.css} (72%) diff --git a/browser/devtools/webide/content/jar.mn b/browser/devtools/webide/content/jar.mn index a178df8cf64..db79fdb5133 100644 --- a/browser/devtools/webide/content/jar.mn +++ b/browser/devtools/webide/content/jar.mn @@ -31,5 +31,8 @@ webide.jar: 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) diff --git a/browser/devtools/webide/content/project-listing.js b/browser/devtools/webide/content/project-listing.js index 5f5372abb64..a952e8f07dc 100644 --- a/browser/devtools/webide/content/project-listing.js +++ b/browser/devtools/webide/content/project-listing.js @@ -4,38 +4,24 @@ const Cu = Components.utils; const {require} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools; -const {AppManager} = require("devtools/webide/app-manager"); const ProjectList = require("devtools/webide/project-list"); let projectList = new ProjectList(window, window.parent); window.addEventListener("load", function onLoad() { - window.removeEventListener("load", onLoad); - AppManager.on("app-manager-update", onAppManagerUpdate); + window.removeEventListener("load", onLoad, true); document.getElementById("new-app").onclick = CreateNewApp; document.getElementById("hosted-app").onclick = ImportHostedApp; document.getElementById("packaged-app").onclick = ImportPackagedApp; projectList.update(); + projectList.updateCommands(); }, true); window.addEventListener("unload", function onUnload() { window.removeEventListener("unload", onUnload); - projectList = null; - AppManager.off("app-manager-update", onAppManagerUpdate); + projectList.destroy(); }); -function onAppManagerUpdate(event, what, details) { - switch (what) { - case "runtime-global-actors": - case "runtime-targets": - case "project-validated": - case "project-removed": - case "project": - projectList.update(details); - break; - } -} - function CreateNewApp() { projectList.newApp(); } diff --git a/browser/devtools/webide/content/project-listing.xhtml b/browser/devtools/webide/content/project-listing.xhtml index 2d11b891027..63ab66bf84f 100644 --- a/browser/devtools/webide/content/project-listing.xhtml +++ b/browser/devtools/webide/content/project-listing.xhtml @@ -12,7 +12,7 @@ - + diff --git a/browser/devtools/webide/content/project-panel.js b/browser/devtools/webide/content/project-panel.js index 544bd6f2f7d..1f6675ce88f 100644 --- a/browser/devtools/webide/content/project-panel.js +++ b/browser/devtools/webide/content/project-panel.js @@ -4,35 +4,31 @@ let ProjectPanel = { // TODO: Expand function to save toggle state. - toggle: function(sidebarsEnabled, triggerPopup) { + toggleSidebar: function() { + document.querySelector("#project-listing-panel").setAttribute("sidebar-displayed", true); + document.querySelector("#project-listing-splitter").setAttribute("sidebar-displayed", true); + }, + + showPopup: function() { let deferred = promise.defer(); - let doc = document; - if (sidebarsEnabled) { - doc.querySelector("#project-listing-panel").setAttribute("sidebar-displayed", true); - doc.querySelector("#project-listing-splitter").setAttribute("sidebar-displayed", true); - deferred.resolve(); - } else if (triggerPopup) { - let panelNode = doc.querySelector("#project-panel"); - let panelVboxNode = doc.querySelector("#project-panel > #project-panel-box"); - let anchorNode = doc.querySelector("#project-panel-button > .panel-button-anchor"); + let panelNode = document.querySelector("#project-panel"); + let panelVboxNode = document.querySelector("#project-panel > #project-panel-box"); + let anchorNode = document.querySelector("#project-panel-button > .panel-button-anchor"); - window.setTimeout(() => { - // Open the popup only when the projects are added. - // Not doing it in the next tick can cause mis-calculations - // of the size of the panel. - function onPopupShown() { - panelNode.removeEventListener("popupshown", onPopupShown); - deferred.resolve(); - } + window.setTimeout(() => { + // Open the popup only when the projects are added. + // Not doing it in the next tick can cause mis-calculations + // of the size of the panel. + function onPopupShown() { + panelNode.removeEventListener("popupshown", onPopupShown); + deferred.resolve(); + } - panelNode.addEventListener("popupshown", onPopupShown); - panelNode.openPopup(anchorNode); - panelVboxNode.scrollTop = 0; - }, 0); - } else { - deferred.resolve(); - } + panelNode.addEventListener("popupshown", onPopupShown); + panelNode.openPopup(anchorNode); + panelVboxNode.scrollTop = 0; + }, 0); return deferred.promise; } diff --git a/browser/devtools/webide/content/runtime-listing.js b/browser/devtools/webide/content/runtime-listing.js new file mode 100644 index 00000000000..7f882d15d2b --- /dev/null +++ b/browser/devtools/webide/content/runtime-listing.js @@ -0,0 +1,61 @@ +/* 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/. */ + +const Cu = Components.utils; +const {require} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}).devtools; +const RuntimeList = require("devtools/webide/runtime-list"); + +let runtimeList = new RuntimeList(window, window.parent); + +window.addEventListener("load", function onLoad() { + window.removeEventListener("load", onLoad, true); + document.getElementById("runtime-screenshot").onclick = TakeScreenshot; + document.getElementById("runtime-permissions").onclick = ShowPermissionsTable; + 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; + runtimeList.update(); + runtimeList.updateCommands(); +}, true); + +window.addEventListener("unload", function onUnload() { + window.removeEventListener("unload", onUnload); + runtimeList.destroy(); +}); + +function TakeScreenshot() { + runtimeList.takeScreenshot(); +} + +function ShowRuntimeDetails() { + runtimeList.showRuntimeDetails(); +} + +function ShowPermissionsTable() { + runtimeList.showPermissionsTable(); +} + +function ShowDevicePreferences() { + runtimeList.showDevicePreferences(); +} + +function ShowSettings() { + runtimeList.showSettings(); +} + +function DisconnectRuntime() { + window.parent.Cmds.disconnectRuntime(); +} + +function ShowAddons() { + runtimeList.showAddons(); +} + +function ShowTroubleShooting() { + runtimeList.showTroubleShooting(); +} diff --git a/browser/devtools/webide/content/runtime-listing.xhtml b/browser/devtools/webide/content/runtime-listing.xhtml new file mode 100644 index 00000000000..aaae153b801 --- /dev/null +++ b/browser/devtools/webide/content/runtime-listing.xhtml @@ -0,0 +1,43 @@ + + + + + + %webideDTD; +]> + + + + + + + + +
+
+ + + +
+ +
+ +
+ + +
+
+ + + + + + +
+
+
+ + diff --git a/browser/devtools/webide/content/runtime-panel.js b/browser/devtools/webide/content/runtime-panel.js new file mode 100644 index 00000000000..ed543b2390b --- /dev/null +++ b/browser/devtools/webide/content/runtime-panel.js @@ -0,0 +1,26 @@ +/* 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/. */ + +let RuntimePanel = { + // TODO: Expand function to save toggle state. + toggleSidebar: function() { + document.querySelector("#runtime-listing-panel").setAttribute("sidebar-displayed", true); + document.querySelector("#runtime-listing-splitter").setAttribute("sidebar-displayed", true); + }, + + showPopup: function() { + let deferred = promise.defer(); + let panel = document.querySelector("#runtime-panel"); + let anchor = document.querySelector("#runtime-panel-button > .panel-button-anchor"); + + function onPopupShown() { + panel.removeEventListener("popupshown", onPopupShown); + deferred.resolve(); + } + + panel.addEventListener("popupshown", onPopupShown); + panel.openPopup(anchor); + return deferred.promise; + } +}; diff --git a/browser/devtools/webide/content/webide.js b/browser/devtools/webide/content/webide.js index d18857afd43..739cbcfb2f4 100644 --- a/browser/devtools/webide/content/webide.js +++ b/browser/devtools/webide/content/webide.js @@ -15,17 +15,18 @@ const {Services} = Cu.import("resource://gre/modules/Services.jsm"); const {AppProjects} = require("devtools/app-manager/app-projects"); const {Connection} = require("devtools/client/connection-manager"); const {AppManager} = require("devtools/webide/app-manager"); +const EventEmitter = require("devtools/toolkit/event-emitter"); const {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {}); const ProjectEditor = require("projecteditor/projecteditor"); -const {Devices} = Cu.import("resource://gre/modules/devtools/Devices.jsm"); const {GetAvailableAddons} = require("devtools/webide/addons"); const {getJSON} = require("devtools/shared/getjson"); const utils = require("devtools/webide/utils"); const Telemetry = require("devtools/shared/telemetry"); -const {RuntimeScanners, WiFiScanner} = require("devtools/webide/runtimes"); +const {RuntimeScanners} = require("devtools/webide/runtimes"); const {showDoorhanger} = require("devtools/shared/doorhanger"); const ProjectList = require("devtools/webide/project-list"); const {Simulators} = require("devtools/webide/simulators"); +const RuntimeList = require("devtools/webide/runtime-list"); const Strings = Services.strings.createBundle("chrome://browser/locale/devtools/webide.properties"); @@ -56,6 +57,7 @@ window.addEventListener("unload", function onUnload() { }); let projectList; +let runtimeList; let UI = { init: function() { @@ -71,17 +73,26 @@ let UI = { AppManager.on("app-manager-update", this.appManagerUpdate); projectList = new ProjectList(window, window); - ProjectPanel.toggle(projectList.sidebarsEnabled); + if (projectList.sidebarsEnabled) { + ProjectPanel.toggleSidebar(); + } + runtimeList = new RuntimeList(window, window); + if (runtimeList.sidebarsEnabled) { + Cmds.showRuntimePanel(); + } else { + runtimeList.update(); + } this.updateCommands(); - this.updateRuntimeList(); this.onfocus = this.onfocus.bind(this); window.addEventListener("focus", this.onfocus, true); AppProjects.load().then(() => { this.autoSelectProject(); - projectList.update(); + if (!projectList.sidebarsEnabled) { + projectList.update(); + } }, e => { console.error(e); this.reportError("error_appProjectsLoadFailed"); @@ -129,7 +140,8 @@ let UI = { AppManager.off("app-manager-update", this.appManagerUpdate); AppManager.destroy(); Simulators.off("configure", this.configureSimulator); - projectList = null; + projectList.destroy(); + runtimeList.destroy(); window.removeEventListener("message", this.onMessage); this.updateConnectionTelemetry(); this._telemetry.toolClosed("webide"); @@ -165,7 +177,6 @@ let UI = { // See AppManager.update() for descriptions of what these events mean. switch (what) { case "runtime-list": - this.updateRuntimeList(); this.autoConnectRuntime(); break; case "connection": @@ -188,22 +199,19 @@ let UI = { yield UI.autoStartProject(); UI.autoOpenToolbox(); UI.saveLastSelectedProject(); - projectList.update(); + UI.updateRemoveProjectButton(); }); return; case "project-started": this.updateCommands(); - projectList.update(); UI.autoOpenToolbox(); break; case "project-stopped": UI.destroyToolbox(); this.updateCommands(); - projectList.update(); break; case "runtime-global-actors": this.updateCommands(); - projectList.update(); break; case "runtime-details": this.updateRuntimeButton(); @@ -217,17 +225,12 @@ let UI = { this.updateCommands(); this.updateProjectButton(); this.updateProjectEditorHeader(); - projectList.update(); - break; - case "project-removed": - projectList.update(); break; case "install-progress": this.updateProgress(Math.round(100 * details.bytesSent / details.totalBytes)); break; case "runtime-targets": this.autoSelectProject(); - projectList.update(details); break; case "pre-package": this.prePackageLog(details); @@ -286,17 +289,19 @@ let UI = { busy: function() { this.hidePanels(); let win = document.querySelector("window"); - win.classList.add("busy") + win.classList.add("busy"); win.classList.add("busy-undetermined"); this.updateCommands(); + this.update("busy"); }, unbusy: function() { let win = document.querySelector("window"); - win.classList.remove("busy") + win.classList.remove("busy"); win.classList.remove("busy-determined"); win.classList.remove("busy-undetermined"); this.updateCommands(); + this.update("unbusy"); this._busyPromise = null; }, @@ -384,75 +389,95 @@ let UI = { nbox.removeAllNotifications(true); }, - /********** RUNTIME **********/ + /********** COMMANDS **********/ - updateRuntimeList: function() { - let wifiHeaderNode = document.querySelector("#runtime-header-wifi"); - if (WiFiScanner.allowed) { - wifiHeaderNode.removeAttribute("hidden"); - } else { - wifiHeaderNode.setAttribute("hidden", "true"); + /** + * This module emits various events when state changes occur. + * + * The events this module may emit include: + * busy: + * The window is currently busy and certain UI functions may be disabled. + * unbusy: + * The window is not busy and certain UI functions may be re-enabled. + */ + update: function(what, details) { + this.emit("webide-update", what, details); + }, + + updateCommands: function() { + // Action commands + let playCmd = document.querySelector("#cmd_play"); + let stopCmd = document.querySelector("#cmd_stop"); + let debugCmd = document.querySelector("#cmd_toggleToolbox"); + let playButton = document.querySelector('#action-button-play'); + let projectPanelCmd = document.querySelector("#cmd_showProjectPanel"); + + if (document.querySelector("window").classList.contains("busy")) { + playCmd.setAttribute("disabled", "true"); + stopCmd.setAttribute("disabled", "true"); + debugCmd.setAttribute("disabled", "true"); + projectPanelCmd.setAttribute("disabled", "true"); + return; } - let usbListNode = document.querySelector("#runtime-panel-usb"); - let wifiListNode = document.querySelector("#runtime-panel-wifi"); - let simulatorListNode = document.querySelector("#runtime-panel-simulator"); - let otherListNode = document.querySelector("#runtime-panel-other"); - - let noHelperNode = document.querySelector("#runtime-panel-noadbhelper"); - let noUSBNode = document.querySelector("#runtime-panel-nousbdevice"); - - if (Devices.helperAddonInstalled) { - noHelperNode.setAttribute("hidden", "true"); + if (!AppManager.selectedProject || !AppManager.connected) { + playCmd.setAttribute("disabled", "true"); + stopCmd.setAttribute("disabled", "true"); + debugCmd.setAttribute("disabled", "true"); } else { - noHelperNode.removeAttribute("hidden"); - } - - let runtimeList = AppManager.runtimeList; - - if (runtimeList.usb.length === 0 && Devices.helperAddonInstalled) { - 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(); + let isProjectRunning = AppManager.isProjectRunning(); + if (isProjectRunning) { + playButton.classList.add("reload"); + stopCmd.removeAttribute("disabled"); + debugCmd.removeAttribute("disabled"); + } else { + playButton.classList.remove("reload"); + stopCmd.setAttribute("disabled", "true"); + debugCmd.setAttribute("disabled", "true"); } - for (let runtime of runtimeList[type]) { - let r = runtime; - let panelItemNode = document.createElement("hbox"); - panelItemNode.className = "panel-item-complex"; - let connectButton = document.createElement("toolbarbutton"); - connectButton.className = "panel-item runtime-panel-item-" + type; - connectButton.setAttribute("label", r.name); - connectButton.setAttribute("flex", "1"); - connectButton.addEventListener("click", () => { - this.hidePanels(); - this.dismissErrorNotification(); - this.connectToRuntime(r); - }, true); - panelItemNode.appendChild(connectButton); - - if (r.configure && UI.isRuntimeConfigurationEnabled()) { - let configButton = document.createElement("toolbarbutton"); - configButton.className = "configure-button"; - configButton.addEventListener("click", r.configure.bind(r), true); - panelItemNode.appendChild(configButton); + // If connected and a project is selected + if (AppManager.selectedProject.type == "runtimeApp") { + playCmd.removeAttribute("disabled"); + } else if (AppManager.selectedProject.type == "tab") { + playCmd.removeAttribute("disabled"); + stopCmd.setAttribute("disabled", "true"); + } else if (AppManager.selectedProject.type == "mainProcess") { + playCmd.setAttribute("disabled", "true"); + stopCmd.setAttribute("disabled", "true"); + } else { + if (AppManager.selectedProject.errorsCount == 0 && + AppManager.runtimeCanHandleApps()) { + playCmd.removeAttribute("disabled"); + } else { + playCmd.setAttribute("disabled", "true"); } - - parent.appendChild(panelItemNode); } } + + let runtimePanelButton = document.querySelector("#runtime-panel-button"); + + if (AppManager.connected) { + runtimePanelButton.setAttribute("active", "true"); + } else { + runtimePanelButton.removeAttribute("active"); + } + + projectPanelCmd.removeAttribute("disabled"); + }, + + updateRemoveProjectButton: function() { + // Remove command + let removeCmdNode = document.querySelector("#cmd_removeProject"); + if (AppManager.selectedProject) { + removeCmdNode.removeAttribute("disabled"); + } else { + removeCmdNode.setAttribute("disabled", "true"); + } }, + /********** RUNTIME **********/ + get lastConnectedRuntime() { return Services.prefs.getCharPref("devtools.webide.lastConnectedRuntime"); }, @@ -531,6 +556,8 @@ let UI = { } }, + /********** ACTIONS **********/ + _actionsToLog: new Set(), /** @@ -869,121 +896,6 @@ let UI = { this.updateProjectEditorMenusVisibility(); }, - /********** COMMANDS **********/ - - updateCommands: function() { - - if (document.querySelector("window").classList.contains("busy")) { - document.querySelector("#cmd_newApp").setAttribute("disabled", "true"); - document.querySelector("#cmd_importPackagedApp").setAttribute("disabled", "true"); - document.querySelector("#cmd_importHostedApp").setAttribute("disabled", "true"); - document.querySelector("#cmd_showProjectPanel").setAttribute("disabled", "true"); - document.querySelector("#cmd_showRuntimePanel").setAttribute("disabled", "true"); - document.querySelector("#cmd_removeProject").setAttribute("disabled", "true"); - document.querySelector("#cmd_disconnectRuntime").setAttribute("disabled", "true"); - document.querySelector("#cmd_showPermissionsTable").setAttribute("disabled", "true"); - document.querySelector("#cmd_takeScreenshot").setAttribute("disabled", "true"); - document.querySelector("#cmd_showRuntimeDetails").setAttribute("disabled", "true"); - document.querySelector("#cmd_play").setAttribute("disabled", "true"); - document.querySelector("#cmd_stop").setAttribute("disabled", "true"); - document.querySelector("#cmd_toggleToolbox").setAttribute("disabled", "true"); - document.querySelector("#cmd_showDevicePrefs").setAttribute("disabled", "true"); - document.querySelector("#cmd_showSettings").setAttribute("disabled", "true"); - return; - } - - document.querySelector("#cmd_newApp").removeAttribute("disabled"); - document.querySelector("#cmd_importPackagedApp").removeAttribute("disabled"); - document.querySelector("#cmd_importHostedApp").removeAttribute("disabled"); - document.querySelector("#cmd_showProjectPanel").removeAttribute("disabled"); - document.querySelector("#cmd_showRuntimePanel").removeAttribute("disabled"); - - // Action commands - let playCmd = document.querySelector("#cmd_play"); - let stopCmd = document.querySelector("#cmd_stop"); - let debugCmd = document.querySelector("#cmd_toggleToolbox"); - let playButton = document.querySelector('#action-button-play'); - - if (!AppManager.selectedProject || !AppManager.connected) { - playCmd.setAttribute("disabled", "true"); - stopCmd.setAttribute("disabled", "true"); - debugCmd.setAttribute("disabled", "true"); - } else { - let isProjectRunning = AppManager.isProjectRunning(); - if (isProjectRunning) { - playButton.classList.add("reload"); - stopCmd.removeAttribute("disabled"); - debugCmd.removeAttribute("disabled"); - } else { - playButton.classList.remove("reload"); - stopCmd.setAttribute("disabled", "true"); - debugCmd.setAttribute("disabled", "true"); - } - - // If connected and a project is selected - if (AppManager.selectedProject.type == "runtimeApp") { - playCmd.removeAttribute("disabled"); - } else if (AppManager.selectedProject.type == "tab") { - playCmd.removeAttribute("disabled"); - stopCmd.setAttribute("disabled", "true"); - } else if (AppManager.selectedProject.type == "mainProcess") { - playCmd.setAttribute("disabled", "true"); - stopCmd.setAttribute("disabled", "true"); - } else { - if (AppManager.selectedProject.errorsCount == 0 && - AppManager.runtimeCanHandleApps()) { - playCmd.removeAttribute("disabled"); - } else { - playCmd.setAttribute("disabled", "true"); - } - } - } - - // Remove command - let removeCmdNode = document.querySelector("#cmd_removeProject"); - if (AppManager.selectedProject) { - removeCmdNode.removeAttribute("disabled"); - } else { - removeCmdNode.setAttribute("disabled", "true"); - } - - // Runtime commands - let screenshotCmd = document.querySelector("#cmd_takeScreenshot"); - let permissionsCmd = document.querySelector("#cmd_showPermissionsTable"); - let detailsCmd = document.querySelector("#cmd_showRuntimeDetails"); - let disconnectCmd = document.querySelector("#cmd_disconnectRuntime"); - let devicePrefsCmd = document.querySelector("#cmd_showDevicePrefs"); - let settingsCmd = document.querySelector("#cmd_showSettings"); - - let box = document.querySelector("#runtime-actions"); - - let runtimePanelButton = document.querySelector("#runtime-panel-button"); - if (AppManager.connected) { - if (AppManager.deviceFront) { - detailsCmd.removeAttribute("disabled"); - permissionsCmd.removeAttribute("disabled"); - screenshotCmd.removeAttribute("disabled"); - } - if (AppManager.preferenceFront) { - devicePrefsCmd.removeAttribute("disabled"); - } - if (AppManager.settingsFront) { - settingsCmd.removeAttribute("disabled"); - } - disconnectCmd.removeAttribute("disabled"); - runtimePanelButton.setAttribute("active", "true"); - } else { - detailsCmd.setAttribute("disabled", "true"); - permissionsCmd.setAttribute("disabled", "true"); - screenshotCmd.setAttribute("disabled", "true"); - disconnectCmd.setAttribute("disabled", "true"); - devicePrefsCmd.setAttribute("disabled", "true"); - settingsCmd.setAttribute("disabled", "true"); - runtimePanelButton.removeAttribute("active"); - } - - }, - /********** TOOLBOX **********/ onMessage: function(event) { @@ -1099,6 +1011,8 @@ let UI = { } }; +EventEmitter.decorate(UI); + let Cmds = { quit: function() { if (UI.canCloseProject()) { @@ -1126,7 +1040,11 @@ let Cmds = { }, showProjectPanel: function() { - ProjectPanel.toggle(projectList.sidebarsEnabled, true); + if (projectList.sidebarsEnabled) { + ProjectPanel.toggleSidebar(); + } else { + ProjectPanel.showPopup(); + } // There are currently no available events to listen for when an unselected // tab navigates. Since we show every tab's location in the project menu, @@ -1144,18 +1062,11 @@ let Cmds = { showRuntimePanel: function() { RuntimeScanners.scan(); - let panel = document.querySelector("#runtime-panel"); - let anchor = document.querySelector("#runtime-panel-button > .panel-button-anchor"); - - let deferred = promise.defer(); - function onPopupShown() { - panel.removeEventListener("popupshown", onPopupShown); - deferred.resolve(); + if (runtimeList.sidebarsEnabled) { + RuntimePanel.toggleSidebar(); + } else { + RuntimePanel.showPopup(); } - panel.addEventListener("popupshown", onPopupShown); - - panel.openPopup(anchor); - return deferred.promise; }, disconnectRuntime: function() { @@ -1167,12 +1078,7 @@ let Cmds = { }, takeScreenshot: function() { - return UI.busyUntil(AppManager.deviceFront.screenshotToDataURL().then(longstr => { - return longstr.string().then(dataURL => { - longstr.release().then(null, console.error); - UI.openInBrowser(dataURL); - }); - }), "taking screenshot"); + runtimeList.takeScreenshot(); }, showPermissionsTable: function() { diff --git a/browser/devtools/webide/content/webide.xul b/browser/devtools/webide/content/webide.xul index a9899734cd4..569fa1241d8 100644 --- a/browser/devtools/webide/content/webide.xul +++ b/browser/devtools/webide/content/webide.xul @@ -28,6 +28,7 @@ + @@ -167,7 +168,7 @@ - + @@ -193,9 +194,9 @@ - - -
+
+ +