/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ const FRAME_SCRIPT_UTILS_URL = "chrome://browser/content/devtools/frame-script-utils.js" const TEST_BASE = "chrome://mochitests/content/browser/browser/devtools/styleeditor/test/"; const TEST_BASE_HTTP = "http://example.com/browser/browser/devtools/styleeditor/test/"; const TEST_BASE_HTTPS = "https://example.com/browser/browser/devtools/styleeditor/test/"; const TEST_HOST = 'mochi.test:8888'; let {devtools} = Cu.import("resource://gre/modules/devtools/Loader.jsm", {}); let TargetFactory = devtools.TargetFactory; let {console} = Cu.import("resource://gre/modules/devtools/Console.jsm", {}); let {Promise: promise} = Cu.import("resource://gre/modules/Promise.jsm", {}); let DevToolsUtils = devtools.require("devtools/toolkit/DevToolsUtils"); // Import the GCLI test helper let testDir = gTestPath.substr(0, gTestPath.lastIndexOf("/")); Services.scriptloader.loadSubScript(testDir + "../../../commandline/test/helpers.js", this); DevToolsUtils.testing = true; SimpleTest.registerCleanupFunction(() => { DevToolsUtils.testing = false; }); /** * Add a new test tab in the browser and load the given url. * @param {String} url The url to be loaded in the new tab * @param {Window} win The window to add the tab to (default: current window). * @return a promise that resolves to the tab object when the url is loaded */ function addTab(url, win) { info("Adding a new tab with URL: '" + url + "'"); let def = promise.defer(); let targetWindow = win || window; let targetBrowser = targetWindow.gBrowser; let tab = targetBrowser.selectedTab = targetBrowser.addTab(url); targetBrowser.selectedBrowser.addEventListener("load", function onload() { targetBrowser.selectedBrowser.removeEventListener("load", onload, true); info("URL '" + url + "' loading complete"); def.resolve(tab); }, true); return def.promise; } /** * Navigate the currently selected tab to a new URL and wait for it to load. * @param {String} url The url to be loaded in the current tab. * @return a promise that resolves when the page has fully loaded. */ function navigateTo(url) { let navigating = promise.defer(); gBrowser.selectedBrowser.addEventListener("load", function onload() { gBrowser.selectedBrowser.removeEventListener("load", onload, true); navigating.resolve(); }, true); content.location = url; return navigating.promise; } function* cleanup() { while (gBrowser.tabs.length > 1) { let target = TargetFactory.forTab(gBrowser.selectedTab); yield gDevTools.closeToolbox(target); gBrowser.removeCurrentTab(); } } /** * Creates a new tab in specified window navigates it to the given URL and * opens style editor in it. */ let openStyleEditorForURL = Task.async(function* (url, win) { let tab = yield addTab(url, win); let target = TargetFactory.forTab(tab); let toolbox = yield gDevTools.showToolbox(target, "styleeditor"); let panel = toolbox.getPanel("styleeditor"); let ui = panel.UI; return { tab, toolbox, panel, ui }; }); /** * Loads shared/frame-script-utils.js in the specified tab. * * @param tab * Optional tab to load the frame script in. Defaults to the current tab. */ function loadCommonFrameScript(tab) { let browser = tab ? tab.linkedBrowser : gBrowser.selectedBrowser; browser.messageManager.loadFrameScript(FRAME_SCRIPT_UTILS_URL, false); } /** * Send an async message to the frame script (chrome -> content) and wait for a * response message with the same name (content -> chrome). * * @param String name * The message name. Should be one of the messages defined * shared/frame-script-utils.js * @param Object data * Optional data to send along * @param Object objects * Optional CPOW objects to send along * @param Boolean expectResponse * If set to false, don't wait for a response with the same name from the * content script. Defaults to true. * * @return Promise * Resolves to the response data if a response is expected, immediately * resolves otherwise */ function executeInContent(name, data={}, objects={}, expectResponse=true) { let mm = gBrowser.selectedBrowser.messageManager; mm.sendAsyncMessage(name, data, objects); if (expectResponse) { return waitForContentMessage(name); } else { return promise.resolve(); } } /** * Wait for a content -> chrome message on the message manager (the window * messagemanager is used). * @param {String} name The message name * @return {Promise} A promise that resolves to the response data when the * message has been received */ function waitForContentMessage(name) { let mm = gBrowser.selectedBrowser.messageManager; let def = promise.defer(); mm.addMessageListener(name, function onMessage(msg) { mm.removeMessageListener(name, onMessage); def.resolve(msg); }); return def.promise; } registerCleanupFunction(cleanup);