diff options
Diffstat (limited to 'devtools/client/webide/test/head.js')
-rw-r--r-- | devtools/client/webide/test/head.js | 248 |
1 files changed, 248 insertions, 0 deletions
diff --git a/devtools/client/webide/test/head.js b/devtools/client/webide/test/head.js new file mode 100644 index 000000000..c0171c730 --- /dev/null +++ b/devtools/client/webide/test/head.js @@ -0,0 +1,248 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +var {utils: Cu, classes: Cc, interfaces: Ci} = Components; + +const { require } = Cu.import("resource://devtools/shared/Loader.jsm", {}); +const { FileUtils } = require("resource://gre/modules/FileUtils.jsm"); +const { gDevTools } = require("devtools/client/framework/devtools"); +const promise = require("promise"); +const Services = require("Services"); +const { Task } = require("devtools/shared/task"); +const { AppProjects } = require("devtools/client/webide/modules/app-projects"); +const DevToolsUtils = require("devtools/shared/DevToolsUtils"); +const { DebuggerServer } = require("devtools/server/main"); +const flags = require("devtools/shared/flags"); +flags.testing = true; + +var TEST_BASE; +if (window.location === "chrome://browser/content/browser.xul") { + 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.adaptersAddonURL", TEST_BASE + "addons/fxdt-adapters-#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; + Services.prefs.clearUserPref("devtools.webide.enabled"); + Services.prefs.clearUserPref("devtools.webide.enableLocalRuntime"); + Services.prefs.clearUserPref("devtools.webide.autoinstallADBHelper"); + Services.prefs.clearUserPref("devtools.webide.autoinstallFxdtAdapters"); + Services.prefs.clearUserPref("devtools.webide.busyTimeout"); + Services.prefs.clearUserPref("devtools.webide.lastSelectedProject"); + Services.prefs.clearUserPref("devtools.webide.lastConnectedRuntime"); +}); + +var openWebIDE = Task.async(function* (autoInstallAddons) { + info("opening WebIDE"); + + Services.prefs.setBoolPref("devtools.webide.autoinstallADBHelper", !!autoInstallAddons); + Services.prefs.setBoolPref("devtools.webide.autoinstallFxdtAdapters", !!autoInstallAddons); + + let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].getService(Ci.nsIWindowWatcher); + let win = ww.openWindow(null, "chrome://webide/content/", "webide", "chrome,centerscreen,resizable", null); + + yield new Promise(resolve => { + win.addEventListener("load", function onLoad() { + win.removeEventListener("load", onLoad); + SimpleTest.requestCompleteLog(); + SimpleTest.executeSoon(resolve); + }); + }); + + info("WebIDE open"); + + return win; +}); + +function closeWebIDE(win) { + info("Closing WebIDE"); + + let deferred = promise.defer(); + + Services.prefs.clearUserPref("devtools.webide.widget.enabled"); + + win.addEventListener("unload", function onUnload() { + win.removeEventListener("unload", onUnload); + info("WebIDE closed"); + SimpleTest.executeSoon(() => { + deferred.resolve(); + }); + }); + + win.close(); + + return deferred.promise; +} + +function removeAllProjects() { + return Task.spawn(function* () { + yield AppProjects.load(); + // use a new array so we're not iterating over the same + // underlying array that's being modified by AppProjects + let projects = AppProjects.projects.map(p => p.location); + for (let i = 0; i < projects.length; i++) { + yield AppProjects.remove(projects[i]); + } + }); +} + +function nextTick() { + let deferred = promise.defer(); + SimpleTest.executeSoon(() => { + deferred.resolve(); + }); + + return deferred.promise; +} + +function waitForUpdate(win, update) { + info("Wait: " + update); + let deferred = promise.defer(); + win.AppManager.on("app-manager-update", function onUpdate(e, what) { + info("Got: " + what); + if (what !== update) { + return; + } + win.AppManager.off("app-manager-update", onUpdate); + deferred.resolve(win.UI._updatePromise); + }); + return deferred.promise; +} + +function waitForTime(time) { + let deferred = promise.defer(); + setTimeout(() => { + deferred.resolve(); + }, time); + return deferred.promise; +} + +function documentIsLoaded(doc) { + let deferred = promise.defer(); + if (doc.readyState == "complete") { + deferred.resolve(); + } else { + doc.addEventListener("readystatechange", function onChange() { + if (doc.readyState == "complete") { + doc.removeEventListener("readystatechange", onChange); + deferred.resolve(); + } + }); + } + return deferred.promise; +} + +function lazyIframeIsLoaded(iframe) { + let deferred = promise.defer(); + iframe.addEventListener("load", function onLoad() { + iframe.removeEventListener("load", onLoad, true); + deferred.resolve(nextTick()); + }, true); + return deferred.promise; +} + +function addTab(aUrl, aWindow) { + info("Adding tab: " + aUrl); + + let deferred = promise.defer(); + let targetWindow = aWindow || window; + let targetBrowser = targetWindow.gBrowser; + + targetWindow.focus(); + let tab = targetBrowser.selectedTab = targetBrowser.addTab(aUrl); + let linkedBrowser = tab.linkedBrowser; + + BrowserTestUtils.browserLoaded(linkedBrowser).then(function () { + info("Tab added and finished loading: " + aUrl); + deferred.resolve(tab); + }); + + return deferred.promise; +} + +function removeTab(aTab, aWindow) { + info("Removing tab."); + + let deferred = promise.defer(); + let targetWindow = aWindow || window; + 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(aTab); + return deferred.promise; +} + +function getRuntimeDocument(win) { + return win.document.querySelector("#runtime-listing-panel-details").contentDocument; +} + +function getProjectDocument(win) { + return win.document.querySelector("#project-listing-panel-details").contentDocument; +} + +function getRuntimeWindow(win) { + return win.document.querySelector("#runtime-listing-panel-details").contentWindow; +} + +function getProjectWindow(win) { + return win.document.querySelector("#project-listing-panel-details").contentWindow; +} + +function connectToLocalRuntime(win) { + info("Loading local runtime."); + + let panelNode; + let runtimePanel; + + runtimePanel = getRuntimeDocument(win); + + panelNode = runtimePanel.querySelector("#runtime-panel"); + let items = panelNode.querySelectorAll(".runtime-panel-item-other"); + is(items.length, 2, "Found 2 custom runtime buttons"); + + let updated = waitForUpdate(win, "runtime-global-actors"); + items[1].click(); + return updated; +} + +function handleError(aError) { + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); + finish(); +} + +function waitForConnectionChange(expectedState, count = 1) { + return new Promise(resolve => { + let onConnectionChange = (_, state) => { + if (state != expectedState) { + return; + } + if (--count != 0) { + return; + } + DebuggerServer.off("connectionchange", onConnectionChange); + resolve(); + }; + DebuggerServer.on("connectionchange", onConnectionChange); + }); +} |