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