Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save juliandescottes/0958bf210cbe3d599cc812c3b3b68f2e to your computer and use it in GitHub Desktop.
Save juliandescottes/0958bf210cbe3d599cc812c3b3b68f2e to your computer and use it in GitHub Desktop.
# HG changeset patch
# User David Walsh <[email protected]>
# Date 1539048226 18000
# Mon Oct 08 20:23:46 2018 -0500
# Node ID 7931d57e3eae80a92ee485f9277762c713f37e6c
# Parent b37cb2cbe0872efd25c46050302a28a51efd5dc5
Bug 1314057 - Move worker actor and console tests to shared
diff --git a/devtools/client/debugger/test/mochitest/browser2.ini b/devtools/client/debugger/test/mochitest/browser2.ini
--- a/devtools/client/debugger/test/mochitest/browser2.ini
+++ b/devtools/client/debugger/test/mochitest/browser2.ini
@@ -159,23 +159,11 @@ skip-if = true # Bug 1288348 - previousl
[browser_dbg_terminate-on-tab-close.js]
uses-unsafe-cpows = true
skip-if = e10s && debug
-[browser_dbg_worker-console-01.js]
-skip-if = true # bug 1368569
-[browser_dbg_worker-console-02.js]
-skip-if = e10s && debug
-[browser_dbg_worker-console-03.js]
-skip-if = debug # bug 1334683
-[browser_dbg_worker-console-04.js]
-skip-if = e10s && debug
[browser_dbg_worker-source-map.js]
uses-unsafe-cpows = true
skip-if = e10s && debug
[browser_dbg_worker-window.js]
skip-if = (e10s && debug) || true # Bug 1486974
-[browser_dbg_WorkerTargetActor.attach.js]
-skip-if = e10s && debug
-[browser_dbg_WorkerTargetActor.attachThread.js]
-skip-if = e10s && debug
[browser_dbg_split-console-keypress.js]
uses-unsafe-cpows = true
skip-if = (debug || os == "linux") # Bug 1214439
diff --git a/devtools/client/shared/test/browser.ini b/devtools/client/shared/test/browser.ini
--- a/devtools/client/shared/test/browser.ini
+++ b/devtools/client/shared/test/browser.ini
@@ -5,6 +5,9 @@ support-files =
addon1.xpi
addon2.xpi
browser_devices.json
+ code_WorkerTargetActor.attach-worker1.js
+ code_WorkerTargetActor.attach-worker2.js
+ code_WorkerTargetActor.attachThread-worker.js
doc_cubic-bezier-01.html
doc_cubic-bezier-02.html
doc_empty-tab-01.html
@@ -32,12 +35,16 @@ support-files =
doc_tableWidget_keyboard_interaction.xul
doc_tableWidget_mouse_interaction.xul
doc_templater_basic.html
+ doc_WorkerTargetActor.attach-tab1.html
+ doc_WorkerTargetActor.attach-tab2.html
+ doc_WorkerTargetActor.attachThread-tab.html
dummy.html
frame-script-utils.js
head.js
helper_color_data.js
helper_html_tooltip.js
helper_inplace_editor.js
+ helper_workers.js
leakhunt.js
shared-head.js
shared-redux-head.js
@@ -225,4 +232,16 @@ skip-if = e10s && debug
[browser_dbg_navigation.js]
skip-if = e10s && debug
[browser_dbg_target-scoped-actor-01.js]
-[browser_dbg_target-scoped-actor-02.js]
\ No newline at end of file
+[browser_dbg_target-scoped-actor-02.js]
+[browser_dbg_worker-console-01.js]
+skip-if = true # bug 1368569
+[browser_dbg_worker-console-02.js]
+skip-if = e10s && debug
+[browser_dbg_worker-console-03.js]
+skip-if = debug # bug 1334683
+[browser_dbg_worker-console-04.js]
+skip-if = e10s && debug
+[browser_dbg_WorkerTargetActor.attach.js]
+skip-if = e10s && debug
+[browser_dbg_WorkerTargetActor.attachThread.js]
+skip-if = e10s && debug
\ No newline at end of file
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attach.js b/devtools/client/shared/test/browser_dbg_WorkerTargetActor.attach.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attach.js
rename to devtools/client/shared/test/browser_dbg_WorkerTargetActor.attach.js
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attachThread.js b/devtools/client/shared/test/browser_dbg_WorkerTargetActor.attachThread.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_WorkerTargetActor.attachThread.js
rename to devtools/client/shared/test/browser_dbg_WorkerTargetActor.attachThread.js
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js b/devtools/client/shared/test/browser_dbg_worker-console-01.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js
rename to devtools/client/shared/test/browser_dbg_worker-console-01.js
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-01.js
+++ b/devtools/client/shared/test/browser_dbg_worker-console-01.js
@@ -1,6 +1,18 @@
+"use strict";
+
+requestLongerTimeout(10);
+
// Check to make sure that a worker can be attached to a toolbox
// and that the console works.
+var { DebuggerServer } = require("devtools/server/main");
+var { DebuggerClient } = require("devtools/shared/client/debugger-client");
+
+// Import helpers for the workers
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
+ this);
+
var TAB_URL = EXAMPLE_URL + "doc_WorkerTargetActor.attachThread-tab.html";
var WORKER_URL = "code_WorkerTargetActor.attachThread-worker.js";
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js b/devtools/client/shared/test/browser_dbg_worker-console-02.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js
rename to devtools/client/shared/test/browser_dbg_worker-console-02.js
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-02.js
+++ b/devtools/client/shared/test/browser_dbg_worker-console-02.js
@@ -1,3 +1,18 @@
+"use strict";
+
+requestLongerTimeout(10);
+
+// Check to make sure that a worker can be attached to a toolbox
+// and that the console works.
+
+var { DebuggerServer } = require("devtools/server/main");
+var { DebuggerClient } = require("devtools/shared/client/debugger-client");
+
+// Import helpers for the workers
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
+ this);
+
// Check to make sure that a worker can be attached to a toolbox
// and that the console works.
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js b/devtools/client/shared/test/browser_dbg_worker-console-03.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js
rename to devtools/client/shared/test/browser_dbg_worker-console-03.js
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-03.js
+++ b/devtools/client/shared/test/browser_dbg_worker-console-03.js
@@ -1,3 +1,18 @@
+"use strict";
+
+requestLongerTimeout(10);
+
+// Check to make sure that a worker can be attached to a toolbox
+// and that the console works.
+
+var { DebuggerServer } = require("devtools/server/main");
+var { DebuggerClient } = require("devtools/shared/client/debugger-client");
+
+// Import helpers for the workers
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
+ this);
+
// Check to make sure that a worker can be attached to a toolbox
// and that the console works.
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js b/devtools/client/shared/test/browser_dbg_worker-console-04.js
rename from devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js
rename to devtools/client/shared/test/browser_dbg_worker-console-04.js
--- a/devtools/client/debugger/test/mochitest/browser_dbg_worker-console-04.js
+++ b/devtools/client/shared/test/browser_dbg_worker-console-04.js
@@ -1,3 +1,18 @@
+"use strict";
+
+requestLongerTimeout(10);
+
+// Check to make sure that a worker can be attached to a toolbox
+// and that the console works.
+
+var { DebuggerServer } = require("devtools/server/main");
+var { DebuggerClient } = require("devtools/shared/client/debugger-client");
+
+// Import helpers for the workers
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
+ this);
+
// Check that the date and regexp previewers work in the console of a worker debugger.
"use strict";
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker1.js b/devtools/client/shared/test/code_WorkerTargetActor.attach-worker1.js
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker1.js
copy to devtools/client/shared/test/code_WorkerTargetActor.attach-worker1.js
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker2.js b/devtools/client/shared/test/code_WorkerTargetActor.attach-worker2.js
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attach-worker2.js
copy to devtools/client/shared/test/code_WorkerTargetActor.attach-worker2.js
diff --git a/devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attachThread-worker.js b/devtools/client/shared/test/code_WorkerTargetActor.attachThread-worker.js
copy from devtools/client/debugger/test/mochitest/code_WorkerTargetActor.attachThread-worker.js
copy to devtools/client/shared/test/code_WorkerTargetActor.attachThread-worker.js
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab1.html b/devtools/client/shared/test/doc_WorkerTargetActor.attach-tab1.html
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab1.html
copy to devtools/client/shared/test/doc_WorkerTargetActor.attach-tab1.html
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab2.html b/devtools/client/shared/test/doc_WorkerTargetActor.attach-tab2.html
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attach-tab2.html
copy to devtools/client/shared/test/doc_WorkerTargetActor.attach-tab2.html
diff --git a/devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attachThread-tab.html b/devtools/client/shared/test/doc_WorkerTargetActor.attachThread-tab.html
copy from devtools/client/debugger/test/mochitest/doc_WorkerTargetActor.attachThread-tab.html
copy to devtools/client/shared/test/doc_WorkerTargetActor.attachThread-tab.html
diff --git a/devtools/client/shared/test/helper_workers.js b/devtools/client/shared/test/helper_workers.js
new file mode 100644
--- /dev/null
+++ b/devtools/client/shared/test/helper_workers.js
@@ -0,0 +1,362 @@
+const FRAME_SCRIPT_URL = getRootDirectory(gTestPath) + "code_frame-script.js";
+const CHROME_URL = "chrome://mochitests/content/browser/devtools/client/shared/test/";
+const CHROME_URI = Services.io.newURI(CHROME_URL);
+
+// Override promise with deprecated-sync-thenables
+promise = require("devtools/shared/deprecated-sync-thenables");
+
+var nextId = 0;
+
+function jsonrpc(tab, method, params) {
+ return new Promise(function (resolve, reject) {
+ let currentId = nextId++;
+ let messageManager = tab.linkedBrowser.messageManager;
+ messageManager.sendAsyncMessage("jsonrpc", {
+ method: method,
+ params: params,
+ id: currentId
+ });
+ messageManager.addMessageListener("jsonrpc", function listener(res) {
+ const { data: { result, error, id } } = res;
+ if (id !== currentId) {
+ return;
+ }
+
+ messageManager.removeMessageListener("jsonrpc", listener);
+ if (error != null) {
+ reject(error);
+ }
+
+ resolve(result);
+ });
+ });
+}
+
+function callInTab(tab, name) {
+ info("Calling function with name '" + name + "' in tab.");
+
+ return jsonrpc(tab, "call", [name, Array.prototype.slice.call(arguments, 2)]);
+}
+
+function evalInTab(tab, string) {
+ info("Evalling string in tab.");
+
+ return jsonrpc(tab, "_eval", [string]);
+}
+
+function createWorkerInTab(tab, url) {
+ info("Creating worker with url '" + url + "' in tab.");
+
+ return jsonrpc(tab, "createWorker", [url]);
+}
+
+function terminateWorkerInTab(tab, url) {
+ info("Terminating worker with url '" + url + "' in tab.");
+
+ return jsonrpc(tab, "terminateWorker", [url]);
+}
+
+function postMessageToWorkerInTab(tab, url, message) {
+ info("Posting message to worker with url '" + url + "' in tab.");
+
+ return jsonrpc(tab, "postMessageToWorker", [url, message]);
+}
+
+function generateMouseClickInTab(tab, path) {
+ info("Generating mouse click in tab.");
+
+ return jsonrpc(tab, "generateMouseClick", [path]);
+}
+
+function connect(client) {
+ info("Connecting client.");
+ return client.connect();
+}
+
+function close(client) {
+ info("Waiting for client to close.\n");
+ return client.close();
+}
+
+function listTabs(client) {
+ info("Listing tabs.");
+ return client.listTabs();
+}
+
+function findTab(tabs, url) {
+ info("Finding tab with url '" + url + "'.");
+ for (let tab of tabs) {
+ if (tab.url === url) {
+ return tab;
+ }
+ }
+ return null;
+}
+
+function attachTarget(client, tab) {
+ info("Attaching to tab with url '" + tab.url + "'.");
+ return client.attachTarget(tab.actor);
+}
+
+function listWorkers(tabClient) {
+ info("Listing workers.");
+ return tabClient.listWorkers();
+}
+
+function findWorker(workers, url) {
+ info("Finding worker with url '" + url + "'.");
+ for (let worker of workers) {
+ if (worker.url === url) {
+ return worker;
+ }
+ }
+ return null;
+}
+
+function attachWorker(tabClient, worker) {
+ info("Attaching to worker with url '" + worker.url + "'.");
+ return tabClient.attachWorker(worker.actor);
+}
+
+function waitForWorkerListChanged(tabClient) {
+ info("Waiting for worker list to change.");
+ return new Promise(function (resolve) {
+ tabClient.addListener("workerListChanged", function listener() {
+ tabClient.removeListener("workerListChanged", listener);
+ resolve();
+ });
+ });
+}
+
+function attachThread(workerClient, options) {
+ info("Attaching to thread.");
+ return workerClient.attachThread(options);
+}
+
+function waitForWorkerClose(workerClient) {
+ info("Waiting for worker to close.");
+ return new Promise(function (resolve) {
+ workerClient.addOneTimeListener("close", function () {
+ info("Worker did close.");
+ resolve();
+ });
+ });
+}
+
+function resume(threadClient) {
+ info("Resuming thread.");
+ return threadClient.resume();
+}
+
+function findSource(sources, url) {
+ info("Finding source with url '" + url + "'.\n");
+ for (let source of sources) {
+ if (source.url === url) {
+ return source;
+ }
+ }
+ return null;
+}
+
+function waitForEvent(client, type, predicate) {
+ return new Promise(function (resolve) {
+ function listener(type, packet) {
+ if (!predicate(packet)) {
+ return;
+ }
+ client.removeListener(listener);
+ resolve(packet);
+ }
+
+ if (predicate) {
+ client.addListener(type, listener);
+ } else {
+ client.addOneTimeListener(type, function (type, packet) {
+ resolve(packet);
+ });
+ }
+ });
+}
+
+function waitForPause(threadClient) {
+ info("Waiting for pause.\n");
+ return waitForEvent(threadClient, "paused");
+}
+
+function setBreakpoint(sourceClient, location) {
+ info("Setting breakpoint.\n");
+ return sourceClient.setBreakpoint(location);
+}
+
+function source(sourceClient) {
+ info("Getting source.\n");
+ return sourceClient.source();
+}
+
+// Return a promise with a reference to jsterm, opening the split
+// console if necessary. This cleans up the split console pref so
+// it won't pollute other tests.
+function getSplitConsole(toolbox, win) {
+ if (!win) {
+ win = toolbox.win;
+ }
+
+ if (!toolbox.splitConsole) {
+ EventUtils.synthesizeKey("VK_ESCAPE", {}, win);
+ }
+
+ return new Promise(resolve => {
+ toolbox.getPanelWhenReady("webconsole").then(() => {
+ ok(toolbox.splitConsole, "Split console is shown.");
+ let jsterm = toolbox.getPanel("webconsole").hud.jsterm;
+ resolve(jsterm);
+ });
+ });
+}
+
+// navigation
+
+function waitForNavigation(gPanel) {
+ const target = gPanel.panelWin.gTarget;
+ const deferred = promise.defer();
+ target.once("navigate", () => {
+ deferred.resolve();
+ });
+ info("Waiting for navigation...");
+ return deferred.promise;
+}
+
+// actions
+
+function bindActionCreators(panel) {
+ const win = panel.panelWin;
+ const dispatch = win.DebuggerController.dispatch;
+ const { bindActionCreators } = win.require("devtools/client/shared/vendor/redux");
+ return bindActionCreators(win.actions, dispatch);
+}
+
+// Wait until an action of `type` is dispatched. This is different
+// then `_afterDispatchDone` because it doesn't wait for async actions
+// to be done/errored. Use this if you want to listen for the "start"
+// action of an async operation (somewhat rare).
+function waitForNextDispatch(store, type) {
+ return new Promise(resolve => {
+ store.dispatch({
+ // Normally we would use `services.WAIT_UNTIL`, but use the
+ // internal name here so tests aren't forced to always pass it
+ // in
+ type: "@@service/waitUntil",
+ predicate: action => action.type === type,
+ run: (dispatch, getState, action) => {
+ resolve(action);
+ }
+ });
+ });
+}
+
+// Wait until an action of `type` is dispatched. If it's part of an
+// async operation, wait until the `status` field is "done" or "error"
+function _afterDispatchDone(store, type) {
+ return new Promise(resolve => {
+ store.dispatch({
+ // Normally we would use `services.WAIT_UNTIL`, but use the
+ // internal name here so tests aren't forced to always pass it
+ // in
+ type: "@@service/waitUntil",
+ predicate: action => {
+ if (action.type === type) {
+ return action.status ?
+ (action.status === "done" || action.status === "error") :
+ true;
+ }
+ },
+ run: (dispatch, getState, action) => {
+ resolve(action);
+ }
+ });
+ });
+}
+
+function waitForDispatch(panel, type, eventRepeat = 1) {
+ const controller = panel.panelWin.DebuggerController;
+ const actionType = panel.panelWin.constants[type];
+ let count = 0;
+
+ return Task.spawn(function* () {
+ info("Waiting for " + type + " to dispatch " + eventRepeat + " time(s)");
+ while (count < eventRepeat) {
+ yield _afterDispatchDone(controller, actionType);
+ count++;
+ info(type + " dispatched " + count + " time(s)");
+ }
+ });
+}
+
+async function initWorkerDebugger(TAB_URL, WORKER_URL) {
+ DebuggerServer.init();
+ DebuggerServer.registerAllActors();
+
+ let client = new DebuggerClient(DebuggerServer.connectPipe());
+ await connect(client);
+
+ let tab = await addTab(TAB_URL);
+ let { tabs } = await listTabs(client);
+ let [, tabClient] = await attachTarget(client, findTab(tabs, TAB_URL));
+
+ await createWorkerInTab(tab, WORKER_URL);
+
+ let { workers } = await listWorkers(tabClient);
+ let [, workerClient] = await attachWorker(tabClient,
+ findWorker(workers, WORKER_URL));
+
+ let toolbox = await gDevTools.showToolbox(TargetFactory.forWorker(workerClient),
+ "jsdebugger",
+ Toolbox.HostType.WINDOW);
+
+ let debuggerPanel = toolbox.getCurrentPanel();
+ let gDebugger = debuggerPanel.panelWin;
+
+ return {client, tab, tabClient, workerClient, toolbox, gDebugger};
+}
+
+// Override addTab/removeTab as defined by shared-head, since these have
+// an extra window parameter and add a frame script
+this.addTab = 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 = BrowserTestUtils.addTab(targetBrowser, aUrl);
+ let linkedBrowser = tab.linkedBrowser;
+
+ info("Loading frame script with url " + FRAME_SCRIPT_URL + ".");
+ linkedBrowser.messageManager.loadFrameScript(FRAME_SCRIPT_URL, false);
+
+ BrowserTestUtils.browserLoaded(linkedBrowser)
+ .then(function () {
+ info("Tab added and finished loading: " + aUrl);
+ deferred.resolve(tab);
+ });
+
+ return deferred.promise;
+};
+
+this.removeTab = 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 (aEvent) {
+ info("Tab removed and finished closing.");
+ deferred.resolve();
+ }, {once: true});
+
+ targetBrowser.removeTab(aTab);
+ return deferred.promise;
+};
\ No newline at end of file
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment