1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/app-manager/test/head.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,175 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 +"use strict"; 1.7 + 1.8 +const {utils: Cu, classes: Cc, interfaces: Ci} = Components; 1.9 + 1.10 +const {Promise: promise} = 1.11 + Cu.import("resource://gre/modules/devtools/deprecated-sync-thenables.js", {}); 1.12 +const {devtools} = 1.13 + Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); 1.14 +const {require} = devtools; 1.15 + 1.16 +const {AppProjects} = require("devtools/app-manager/app-projects"); 1.17 + 1.18 +const APP_MANAGER_URL = "about:app-manager"; 1.19 +const TEST_BASE = 1.20 + "chrome://mochitests/content/browser/browser/devtools/app-manager/test/"; 1.21 +const HOSTED_APP_MANIFEST = TEST_BASE + "hosted_app.manifest"; 1.22 + 1.23 +const PACKAGED_APP_DIR_PATH = getTestFilePath("."); 1.24 + 1.25 +gDevTools.testing = true; 1.26 +SimpleTest.registerCleanupFunction(() => { 1.27 + gDevTools.testing = false; 1.28 +}); 1.29 + 1.30 +function addTab(url, targetWindow = window) { 1.31 + info("Adding tab: " + url); 1.32 + 1.33 + let deferred = promise.defer(); 1.34 + let targetBrowser = targetWindow.gBrowser; 1.35 + 1.36 + targetWindow.focus(); 1.37 + let tab = targetBrowser.selectedTab = targetBrowser.addTab(url); 1.38 + let linkedBrowser = tab.linkedBrowser; 1.39 + 1.40 + linkedBrowser.addEventListener("load", function onLoad() { 1.41 + linkedBrowser.removeEventListener("load", onLoad, true); 1.42 + info("Tab added and finished loading: " + url); 1.43 + deferred.resolve(tab); 1.44 + }, true); 1.45 + 1.46 + return deferred.promise; 1.47 +} 1.48 + 1.49 +function removeTab(tab, targetWindow = window) { 1.50 + info("Removing tab."); 1.51 + 1.52 + let deferred = promise.defer(); 1.53 + let targetBrowser = targetWindow.gBrowser; 1.54 + let tabContainer = targetBrowser.tabContainer; 1.55 + 1.56 + tabContainer.addEventListener("TabClose", function onClose(aEvent) { 1.57 + tabContainer.removeEventListener("TabClose", onClose, false); 1.58 + info("Tab removed and finished closing."); 1.59 + deferred.resolve(); 1.60 + }, false); 1.61 + 1.62 + targetBrowser.removeTab(tab); 1.63 + 1.64 + return deferred.promise; 1.65 +} 1.66 + 1.67 +function openAppManager() { 1.68 + return addTab(APP_MANAGER_URL); 1.69 +} 1.70 + 1.71 +function addSampleHostedApp() { 1.72 + info("Adding sample hosted app"); 1.73 + let projectsWindow = getProjectsWindow(); 1.74 + let projectsDocument = projectsWindow.document; 1.75 + let url = projectsDocument.querySelector("#url-input"); 1.76 + url.value = HOSTED_APP_MANIFEST; 1.77 + return projectsWindow.UI.addHosted(); 1.78 +} 1.79 + 1.80 +function removeSampleHostedApp() { 1.81 + info("Removing sample hosted app"); 1.82 + return AppProjects.remove(HOSTED_APP_MANIFEST); 1.83 +} 1.84 + 1.85 +function addSamplePackagedApp() { 1.86 + info("Adding sample packaged app"); 1.87 + let appDir = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsIFile); 1.88 + appDir.initWithPath(PACKAGED_APP_DIR_PATH); 1.89 + return getProjectsWindow().UI.addPackaged(appDir); 1.90 +} 1.91 + 1.92 +function removeSamplePackagedApp() { 1.93 + info("Removing sample packaged app"); 1.94 + return AppProjects.remove(PACKAGED_APP_DIR_PATH); 1.95 +} 1.96 + 1.97 +function getProjectsWindow() { 1.98 + return content.document.querySelector(".projects-panel").contentWindow; 1.99 +} 1.100 + 1.101 +function getManifestWindow() { 1.102 + return getProjectsWindow().document.querySelector(".variables-view") 1.103 + .contentWindow; 1.104 +} 1.105 + 1.106 +function waitForProjectsPanel(deferred = promise.defer()) { 1.107 + info("Wait for projects panel"); 1.108 + 1.109 + let projectsWindow = getProjectsWindow(); 1.110 + let projectsUI = projectsWindow.UI; 1.111 + if (!projectsUI) { 1.112 + info("projectsUI false"); 1.113 + projectsWindow.addEventListener("load", function onLoad() { 1.114 + info("got load event"); 1.115 + projectsWindow.removeEventListener("load", onLoad); 1.116 + waitForProjectsPanel(deferred); 1.117 + }); 1.118 + return deferred.promise; 1.119 + } 1.120 + 1.121 + if (projectsUI.isReady) { 1.122 + info("projectsUI ready"); 1.123 + deferred.resolve(); 1.124 + return deferred.promise; 1.125 + } 1.126 + 1.127 + info("projectsUI not ready"); 1.128 + projectsUI.once("ready", deferred.resolve); 1.129 + return deferred.promise; 1.130 +} 1.131 + 1.132 +function selectProjectsPanel() { 1.133 + return Task.spawn(function() { 1.134 + let projectsButton = content.document.querySelector(".projects-button"); 1.135 + EventUtils.sendMouseEvent({ type: "click" }, projectsButton, content); 1.136 + 1.137 + yield waitForProjectsPanel(); 1.138 + }); 1.139 +} 1.140 + 1.141 +function waitForProjectSelection() { 1.142 + info("Wait for project selection"); 1.143 + 1.144 + let deferred = promise.defer(); 1.145 + getProjectsWindow().UI.once("project-selected", deferred.resolve); 1.146 + return deferred.promise; 1.147 +} 1.148 + 1.149 +function selectFirstProject() { 1.150 + return Task.spawn(function() { 1.151 + let projectsFrame = content.document.querySelector(".projects-panel"); 1.152 + let projectsWindow = projectsFrame.contentWindow; 1.153 + let projectsDoc = projectsWindow.document; 1.154 + let projectItem = projectsDoc.querySelector(".project-item"); 1.155 + EventUtils.sendMouseEvent({ type: "click" }, projectItem, projectsWindow); 1.156 + 1.157 + yield waitForProjectSelection(); 1.158 + }); 1.159 +} 1.160 + 1.161 +function showSampleProjectDetails() { 1.162 + return Task.spawn(function() { 1.163 + yield selectProjectsPanel(); 1.164 + yield selectFirstProject(); 1.165 + }); 1.166 +} 1.167 + 1.168 +function waitForTick() { 1.169 + let deferred = promise.defer(); 1.170 + executeSoon(deferred.resolve); 1.171 + return deferred.promise; 1.172 +} 1.173 + 1.174 +function waitForTime(aDelay) { 1.175 + let deferred = promise.defer(); 1.176 + setTimeout(deferred.resolve, aDelay); 1.177 + return deferred.promise; 1.178 +}