michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: "use strict"; michael@0: michael@0: const {utils: Cu, classes: Cc, interfaces: Ci} = Components; michael@0: michael@0: const {Promise: promise} = michael@0: Cu.import("resource://gre/modules/devtools/deprecated-sync-thenables.js", {}); michael@0: const {devtools} = michael@0: Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); michael@0: const {require} = devtools; michael@0: michael@0: const {AppProjects} = require("devtools/app-manager/app-projects"); michael@0: michael@0: const APP_MANAGER_URL = "about:app-manager"; michael@0: const TEST_BASE = michael@0: "chrome://mochitests/content/browser/browser/devtools/app-manager/test/"; michael@0: const HOSTED_APP_MANIFEST = TEST_BASE + "hosted_app.manifest"; michael@0: michael@0: const PACKAGED_APP_DIR_PATH = getTestFilePath("."); michael@0: michael@0: gDevTools.testing = true; michael@0: SimpleTest.registerCleanupFunction(() => { michael@0: gDevTools.testing = false; michael@0: }); michael@0: michael@0: function addTab(url, targetWindow = window) { michael@0: info("Adding tab: " + url); michael@0: michael@0: let deferred = promise.defer(); michael@0: let targetBrowser = targetWindow.gBrowser; michael@0: michael@0: targetWindow.focus(); michael@0: let tab = targetBrowser.selectedTab = targetBrowser.addTab(url); michael@0: let linkedBrowser = tab.linkedBrowser; michael@0: michael@0: linkedBrowser.addEventListener("load", function onLoad() { michael@0: linkedBrowser.removeEventListener("load", onLoad, true); michael@0: info("Tab added and finished loading: " + url); michael@0: deferred.resolve(tab); michael@0: }, true); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function removeTab(tab, targetWindow = window) { michael@0: info("Removing tab."); michael@0: michael@0: let deferred = promise.defer(); michael@0: let targetBrowser = targetWindow.gBrowser; michael@0: let tabContainer = targetBrowser.tabContainer; michael@0: michael@0: tabContainer.addEventListener("TabClose", function onClose(aEvent) { michael@0: tabContainer.removeEventListener("TabClose", onClose, false); michael@0: info("Tab removed and finished closing."); michael@0: deferred.resolve(); michael@0: }, false); michael@0: michael@0: targetBrowser.removeTab(tab); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function openAppManager() { michael@0: return addTab(APP_MANAGER_URL); michael@0: } michael@0: michael@0: function addSampleHostedApp() { michael@0: info("Adding sample hosted app"); michael@0: let projectsWindow = getProjectsWindow(); michael@0: let projectsDocument = projectsWindow.document; michael@0: let url = projectsDocument.querySelector("#url-input"); michael@0: url.value = HOSTED_APP_MANIFEST; michael@0: return projectsWindow.UI.addHosted(); michael@0: } michael@0: michael@0: function removeSampleHostedApp() { michael@0: info("Removing sample hosted app"); michael@0: return AppProjects.remove(HOSTED_APP_MANIFEST); michael@0: } michael@0: michael@0: function addSamplePackagedApp() { michael@0: info("Adding sample packaged app"); michael@0: let appDir = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); michael@0: appDir.initWithPath(PACKAGED_APP_DIR_PATH); michael@0: return getProjectsWindow().UI.addPackaged(appDir); michael@0: } michael@0: michael@0: function removeSamplePackagedApp() { michael@0: info("Removing sample packaged app"); michael@0: return AppProjects.remove(PACKAGED_APP_DIR_PATH); michael@0: } michael@0: michael@0: function getProjectsWindow() { michael@0: return content.document.querySelector(".projects-panel").contentWindow; michael@0: } michael@0: michael@0: function getManifestWindow() { michael@0: return getProjectsWindow().document.querySelector(".variables-view") michael@0: .contentWindow; michael@0: } michael@0: michael@0: function waitForProjectsPanel(deferred = promise.defer()) { michael@0: info("Wait for projects panel"); michael@0: michael@0: let projectsWindow = getProjectsWindow(); michael@0: let projectsUI = projectsWindow.UI; michael@0: if (!projectsUI) { michael@0: info("projectsUI false"); michael@0: projectsWindow.addEventListener("load", function onLoad() { michael@0: info("got load event"); michael@0: projectsWindow.removeEventListener("load", onLoad); michael@0: waitForProjectsPanel(deferred); michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: if (projectsUI.isReady) { michael@0: info("projectsUI ready"); michael@0: deferred.resolve(); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: info("projectsUI not ready"); michael@0: projectsUI.once("ready", deferred.resolve); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function selectProjectsPanel() { michael@0: return Task.spawn(function() { michael@0: let projectsButton = content.document.querySelector(".projects-button"); michael@0: EventUtils.sendMouseEvent({ type: "click" }, projectsButton, content); michael@0: michael@0: yield waitForProjectsPanel(); michael@0: }); michael@0: } michael@0: michael@0: function waitForProjectSelection() { michael@0: info("Wait for project selection"); michael@0: michael@0: let deferred = promise.defer(); michael@0: getProjectsWindow().UI.once("project-selected", deferred.resolve); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function selectFirstProject() { michael@0: return Task.spawn(function() { michael@0: let projectsFrame = content.document.querySelector(".projects-panel"); michael@0: let projectsWindow = projectsFrame.contentWindow; michael@0: let projectsDoc = projectsWindow.document; michael@0: let projectItem = projectsDoc.querySelector(".project-item"); michael@0: EventUtils.sendMouseEvent({ type: "click" }, projectItem, projectsWindow); michael@0: michael@0: yield waitForProjectSelection(); michael@0: }); michael@0: } michael@0: michael@0: function showSampleProjectDetails() { michael@0: return Task.spawn(function() { michael@0: yield selectProjectsPanel(); michael@0: yield selectFirstProject(); michael@0: }); michael@0: } michael@0: michael@0: function waitForTick() { michael@0: let deferred = promise.defer(); michael@0: executeSoon(deferred.resolve); michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function waitForTime(aDelay) { michael@0: let deferred = promise.defer(); michael@0: setTimeout(deferred.resolve, aDelay); michael@0: return deferred.promise; michael@0: }