Bug 1500986 - Migrate old event-listener and worker debugger tests r=jdescottes

--HG--
rename : devtools/client/debugger/test/mochitest/browser_dbg_debugger-statement.js => devtools/client/shared/test/browser_dbg_debugger-statement.js
rename : devtools/client/debugger/test/mochitest/browser_dbg_event-listeners-01.js => devtools/client/shared/test/browser_dbg_event-listeners-01.js
rename : devtools/client/debugger/test/mochitest/browser_dbg_event-listeners-02.js => devtools/client/shared/test/browser_dbg_event-listeners-02.js
rename : devtools/client/debugger/test/mochitest/browser_dbg_event-listeners-03.js => devtools/client/shared/test/browser_dbg_event-listeners-03.js
rename : devtools/client/debugger/test/mochitest/browser_dbg_listworkers.js => devtools/client/shared/test/browser_dbg_listworkers.js
rename : devtools/client/debugger/test/mochitest/browser_dbg_worker-window.js => devtools/client/shared/test/browser_dbg_worker-window.js
rename : devtools/client/debugger/test/mochitest/code_listworkers-worker1.js => devtools/client/shared/test/code_listworkers-worker1.js
rename : devtools/client/debugger/test/mochitest/code_listworkers-worker2.js => devtools/client/shared/test/code_listworkers-worker2.js
rename : devtools/client/debugger/test/mochitest/doc_event-listeners-01.html => devtools/client/shared/test/doc_event-listeners-01.html
rename : devtools/client/debugger/test/mochitest/doc_event-listeners-03.html => devtools/client/shared/test/doc_event-listeners-03.html
rename : devtools/client/debugger/test/mochitest/doc_inline-debugger-statement.html => devtools/client/shared/test/doc_inline-debugger-statement.html
rename : devtools/client/debugger/test/mochitest/doc_listworkers-tab.html => devtools/client/shared/test/doc_listworkers-tab.html
rename : devtools/client/debugger/test/mochitest/doc_native-event-handler.html => devtools/client/shared/test/doc_native-event-handler.html
This commit is contained in:
David Walsh 2018-10-23 20:39:19 -05:00
parent f90b32afb1
commit d843fa0143
22 changed files with 331 additions and 224 deletions

View file

@ -98,6 +98,8 @@ devtools/client/inspector/markup/test/doc_markup_events_*.html
devtools/client/inspector/rules/test/doc_media_queries.html
devtools/client/performance/components/test/test_jit_optimizations_01.html
devtools/client/responsive.html/test/browser/touch.html
devtools/client/shared/test/*.html
devtools/client/shared/test/code_*.js
devtools/client/shared/components/test/mochitest/*.html
!devtools/client/shared/components/test/mochitest/test_stack-trace.html
devtools/client/storage/test/*.html

View file

@ -7,34 +7,16 @@ subsuite = devtools
skip-if = (os == 'linux' && debug && bits == 32)
support-files =
addon4.xpi
code_listworkers-worker1.js
code_listworkers-worker2.js
code_WorkerTargetActor.attachThread-worker.js
doc_event-listeners-01.html
doc_event-listeners-03.html
doc_inline-debugger-statement.html
doc_listworkers-tab.html
doc_native-event-handler.html
doc_promise-get-allocation-stack.html
doc_promise-get-fulfillment-stack.html
doc_promise-get-rejection-stack.html
doc_terminate-on-tab-close.html
doc_WorkerTargetActor.attachThread-tab.html
head.js
!/devtools/client/shared/test/shared-head.js
!/devtools/client/shared/test/telemetry-test-helpers.js
[browser_dbg_addon-console.js]
skip-if = (e10s && debug || os == 'win' || verify) || true # bug 1005274
tags = addons
[browser_dbg_debugger-statement.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-01.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-02.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-03.js]
skip-if = e10s && debug
[browser_dbg_listworkers.js]
[browser_dbg_promises-allocation-stack.js]
uses-unsafe-cpows = true
skip-if = true
@ -49,6 +31,4 @@ uses-unsafe-cpows = true
skip-if = true
[browser_dbg_terminate-on-tab-close.js]
uses-unsafe-cpows = true
skip-if = true
[browser_dbg_worker-window.js]
skip-if = (e10s && debug) || true # Bug 1486974
skip-if = true

View file

@ -1,59 +0,0 @@
var TAB_URL = EXAMPLE_URL + "doc_listworkers-tab.html";
var WORKER1_URL = "code_listworkers-worker1.js";
var WORKER2_URL = "code_listworkers-worker2.js";
function test() {
Task.spawn(function* () {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let client = new DebuggerClient(DebuggerServer.connectPipe());
yield connect(client);
let tab = yield addTab(TAB_URL);
let { tabs } = yield listTabs(client);
let [, targetFront] = yield attachTarget(client, findTab(tabs, TAB_URL));
let { workers } = yield listWorkers(targetFront);
is(workers.length, 0);
executeSoon(() => {
evalInTab(tab, "var worker1 = new Worker('" + WORKER1_URL + "');");
});
yield waitForWorkerListChanged(targetFront);
({ workers } = yield listWorkers(targetFront));
is(workers.length, 1);
is(workers[0].url, WORKER1_URL);
executeSoon(() => {
evalInTab(tab, "var worker2 = new Worker('" + WORKER2_URL + "');");
});
yield waitForWorkerListChanged(targetFront);
({ workers } = yield listWorkers(targetFront));
is(workers.length, 2);
is(workers[0].url, WORKER1_URL);
is(workers[1].url, WORKER2_URL);
executeSoon(() => {
evalInTab(tab, "worker1.terminate()");
});
yield waitForWorkerListChanged(targetFront);
({ workers } = yield listWorkers(targetFront));
is(workers.length, 1);
is(workers[0].url, WORKER2_URL);
executeSoon(() => {
evalInTab(tab, "worker2.terminate()");
});
yield waitForWorkerListChanged(targetFront);
({ workers } = yield listWorkers(targetFront));
is(workers.length, 0);
yield close(client);
finish();
});
}

View file

@ -1,16 +0,0 @@
"use strict";
function f() {
var a = 1;
var b = 2;
var c = 3;
}
self.onmessage = function (event) {
if (event.data == "ping") {
f();
postMessage("pong");
}
};
postMessage("load");

View file

@ -1,3 +0,0 @@
"use strict";
self.onmessage = function () {};

View file

@ -1,3 +0,0 @@
"use strict";
self.onmessage = function () {};

View file

@ -1,8 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
</head>
<body>
</body>
</html>

View file

@ -5,6 +5,8 @@ support-files =
addon1.xpi
addon2.xpi
browser_devices.json
code_listworkers-worker1.js
code_listworkers-worker2.js
code_WorkerTargetActor.attach-worker1.js
code_WorkerTargetActor.attach-worker2.js
code_WorkerTargetActor.attachThread-worker.js
@ -13,6 +15,8 @@ support-files =
doc_cubic-bezier-02.html
doc_empty-tab-01.html
doc_empty-tab-02.html
doc_event-listeners-01.html
doc_event-listeners-03.html
doc_filter-editor-01.html
doc_html_tooltip-02.xul
doc_html_tooltip-03.xul
@ -25,9 +29,12 @@ support-files =
doc_html_tooltip_doorhanger-02.xul
doc_html_tooltip_hover.xul
doc_html_tooltip_rtl.xul
doc_inline-debugger-statement.html
doc_inplace-editor_autocomplete_offset.xul
doc_layoutHelpers-getBoxQuads.html
doc_layoutHelpers.html
doc_listworkers-tab.html
doc_native-event-handler.html
doc_options-view.xul
doc_script-switching-01.html
doc_script-switching-02.html
@ -67,8 +74,17 @@ support-files =
[browser_cubic-bezier-05.js]
[browser_cubic-bezier-06.js]
[browser_cubic-bezier-07.js]
[browser_dbg_debugger-statement.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-01.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-02.js]
skip-if = e10s && debug
[browser_dbg_event-listeners-03.js]
skip-if = e10s && debug
[browser_dbg_globalactor.js]
skip-if = e10s
[browser_dbg_listworkers.js]
[browser_filter-editor-01.js]
[browser_filter-editor-02.js]
[browser_filter-editor-03.js]
@ -246,3 +262,5 @@ skip-if = debug # bug 1334683
skip-if = e10s && debug
[browser_dbg_WorkerTargetActor.attach.js]
skip-if = e10s && debug
[browser_dbg_worker-window.js]
skip-if = (e10s && debug) || true # Bug 1486974

View file

@ -3,11 +3,22 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/**
* Tests the behavior of the debugger statement.
*/
const TAB_URL = EXAMPLE_URL + "doc_inline-debugger-statement.html";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
var { DebuggerServer } = require("devtools/server/main");
var { DebuggerClient } = require("devtools/shared/client/debugger-client");
const TAB_URL = TEST_URI_ROOT + "doc_inline-debugger-statement.html";
var gClient;
var gTab;
@ -16,31 +27,31 @@ function test() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let transport = DebuggerServer.connectPipe();
const transport = DebuggerServer.connectPipe();
gClient = new DebuggerClient(transport);
gClient.connect().then(([aType, aTraits]) => {
is(aType, "browser",
"Root actor should identify itself as a browser.");
addTab(TAB_URL)
.then((aTab) => {
gTab = aTab;
.then(tab => {
gTab = tab;
return attachTargetActorForUrl(gClient, TAB_URL);
})
.then(testEarlyDebuggerStatement)
.then(testDebuggerStatement)
.then(() => gClient.close())
.then(finish)
.catch(aError => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
.catch(error => {
ok(false, "Got an error: " + error.message + "\n" + error.stack);
});
});
}
function testEarlyDebuggerStatement([aGrip, aResponse]) {
let deferred = promise.defer();
const deferred = getDeferredPromise().defer();
let onPaused = function (aEvent, aPacket) {
const onPaused = function(event, packet) {
ok(false, "Pause shouldn't be called before we've attached!");
deferred.reject();
};
@ -65,9 +76,9 @@ function testEarlyDebuggerStatement([aGrip, aResponse]) {
}
function testDebuggerStatement([aGrip, aResponse]) {
let deferred = promise.defer();
const deferred = getDeferredPromise().defer();
gClient.addListener("paused", (aEvent, aPacket) => {
gClient.addListener("paused", (event, packet) => {
gClient.request({ to: aResponse.threadActor, type: "resume" }, () => {
ok(true, "The pause handler was triggered on a debugger statement.");
deferred.resolve();
@ -80,6 +91,6 @@ function testDebuggerStatement([aGrip, aResponse]) {
return deferred.promise;
}
registerCleanupFunction(function () {
registerCleanupFunction(function() {
gClient = null;
});

View file

@ -3,92 +3,104 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/**
* Tests that the eventListeners request works.
*/
const TAB_URL = EXAMPLE_URL + "doc_event-listeners-01.html";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
var { DebuggerServer } = require("devtools/server/main");
var { DebuggerClient } = require("devtools/shared/client/debugger-client");
const TAB_URL = TEST_URI_ROOT + "doc_event-listeners-01.html";
add_task(async function() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let transport = DebuggerServer.connectPipe();
let client = new DebuggerClient(transport);
let [type, traits] = await client.connect();
const transport = DebuggerServer.connectPipe();
const client = new DebuggerClient(transport);
const [type] = await client.connect();
Assert.equal(type, "browser",
"Root actor should identify itself as a browser.");
let tab = await addTab(TAB_URL);
let threadClient = await attachThreadActorForUrl(client, TAB_URL);
const tab = await addTab(TAB_URL);
const threadClient = await attachThreadActorForUrl(client, TAB_URL);
await pauseDebuggee(tab, client, threadClient);
await testEventListeners(client, threadClient);
await client.close();
});
function pauseDebuggee(aTab, aClient, aThreadClient) {
let deferred = promise.defer();
function pauseDebuggee(tab, client, threadClient) {
const deferred = getDeferredPromise().defer();
aClient.addOneTimeListener("paused", (aEvent, aPacket) => {
is(aPacket.type, "paused",
client.addOneTimeListener("paused", (event, packet) => {
is(packet.type, "paused",
"We should now be paused.");
is(aPacket.why.type, "debuggerStatement",
is(packet.why.type, "debuggerStatement",
"The debugger statement was hit.");
deferred.resolve(aThreadClient);
deferred.resolve(threadClient);
});
generateMouseClickInTab(aTab, "content.document.querySelector('button')");
generateMouseClickInTab(tab, "content.document.querySelector('button')");
return deferred.promise;
}
async function testEventListeners(aClient, aThreadClient) {
let packet = await aThreadClient.eventListeners();
async function testEventListeners(client, threadClient) {
const packet = await threadClient.eventListeners();
if (packet.error) {
let msg = "Error getting event listeners: " + packet.message;
const msg = "Error getting event listeners: " + packet.message;
Assert.ok(false, msg);
return;
}
is(packet.listeners.length, 3, "Found all event listeners.");
let listeners = await promise.all(packet.listeners.map(listener => {
const lDeferred = promise.defer();
aThreadClient.pauseGrip(listener.function).getDefinitionSite(aResponse => {
if (aResponse.error) {
const msg = "Error getting function definition site: " + aResponse.message;
const listeners = await getDeferredPromise().all(packet.listeners.map(listener => {
const lDeferred = getDeferredPromise().defer();
threadClient.pauseGrip(listener.function).getDefinitionSite(response => {
if (response.error) {
const msg = "Error getting function definition site: " + response.message;
ok(false, msg);
lDeferred.reject(msg);
return;
}
listener.function.url = aResponse.source.url;
listener.function.url = response.source.url;
lDeferred.resolve(listener);
});
return lDeferred.promise;
}));
let types = [];
const types = [];
for (let l of listeners) {
for (const l of listeners) {
info("Listener for the " + l.type + " event.");
let node = l.node;
const node = l.node;
ok(node, "There is a node property.");
ok(node.object, "There is a node object property.");
if (node.selector != "window") {
let nodeCount =
await ContentTask.spawn(gBrowser.selectedBrowser, node.selector, async (selector) => {
return content.document.querySelectorAll(selector).length;
});
const nodeCount =
await ContentTask.spawn(gBrowser.selectedBrowser, node.selector,
async (selector) => {
return content.document.querySelectorAll(selector).length;
});
Assert.equal(nodeCount, 1, "The node property is a unique CSS selector.");
} else {
Assert.ok(true, "The node property is a unique CSS selector.");
}
let func = l.function;
const func = l.function;
ok(func, "There is a function property.");
is(func.type, "object", "The function form is of type 'object'.");
is(func.class, "Function", "The function form is of class 'Function'.");
@ -128,5 +140,5 @@ async function testEventListeners(aClient, aThreadClient) {
Assert.ok(types.includes("change"), "Found the change handler.");
Assert.ok(types.includes("keyup"), "Found the keyup handler.");
await aThreadClient.resume();
await threadClient.resume();
}

View file

@ -3,54 +3,64 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/**
* Tests that the eventListeners request works when bound functions are used as
* event listeners.
*/
const TAB_URL = EXAMPLE_URL + "doc_event-listeners-03.html";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
var { DebuggerServer } = require("devtools/server/main");
var { DebuggerClient } = require("devtools/shared/client/debugger-client");
const TAB_URL = TEST_URI_ROOT + "doc_event-listeners-03.html";
add_task(async function() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let transport = DebuggerServer.connectPipe();
let client = new DebuggerClient(transport);
let [type, traits] = await client.connect();
const transport = DebuggerServer.connectPipe();
const client = new DebuggerClient(transport);
const [type] = await client.connect();
Assert.equal(type, "browser",
"Root actor should identify itself as a browser.");
let tab = await addTab(TAB_URL);
let threadClient = await attachThreadActorForUrl(client, TAB_URL);
const tab = await addTab(TAB_URL);
const threadClient = await attachThreadActorForUrl(client, TAB_URL);
await pauseDebuggee(tab, client, threadClient);
await testEventListeners(client, threadClient);
await client.close();
});
function pauseDebuggee(aTab, aClient, aThreadClient) {
let deferred = promise.defer();
function pauseDebuggee(tab, client, threadClient) {
const deferred = getDeferredPromise().defer();
aClient.addOneTimeListener("paused", (aEvent, aPacket) => {
is(aPacket.type, "paused",
client.addOneTimeListener("paused", (event, packet) => {
is(packet.type, "paused",
"We should now be paused.");
is(aPacket.why.type, "debuggerStatement",
is(packet.why.type, "debuggerStatement",
"The debugger statement was hit.");
deferred.resolve(aThreadClient);
deferred.resolve(threadClient);
});
generateMouseClickInTab(aTab, "content.document.querySelector('button')");
generateMouseClickInTab(tab, "content.document.querySelector('button')");
return deferred.promise;
}
async function testEventListeners(aClient, aThreadClient) {
let packet = await aThreadClient.eventListeners();
async function testEventListeners(client, threadClient) {
const packet = await threadClient.eventListeners();
if (packet.error) {
let msg = "Error getting event listeners: " + aPacket.message;
const msg = "Error getting event listeners: " + packet.message;
ok(false, msg);
return;
}
@ -58,16 +68,16 @@ async function testEventListeners(aClient, aThreadClient) {
is(packet.listeners.length, 3,
"Found all event listeners.");
let listeners = await promise.all(packet.listeners.map(listener => {
const lDeferred = promise.defer();
aThreadClient.pauseGrip(listener.function).getDefinitionSite(aResponse => {
if (aResponse.error) {
const msg = "Error getting function definition site: " + aResponse.message;
const listeners = await getDeferredPromise().all(packet.listeners.map(listener => {
const lDeferred = getDeferredPromise().defer();
threadClient.pauseGrip(listener.function).getDefinitionSite(response => {
if (response.error) {
const msg = "Error getting function definition site: " + response.message;
ok(false, msg);
lDeferred.reject(msg);
return;
}
listener.function.url = aResponse.source.url;
listener.function.url = response.source.url;
lDeferred.resolve(listener);
});
return lDeferred.promise;
@ -75,22 +85,23 @@ async function testEventListeners(aClient, aThreadClient) {
Assert.equal(listeners.length, 3, "Found three event listeners.");
for (let l of listeners) {
let node = l.node;
for (const l of listeners) {
const node = l.node;
ok(node, "There is a node property.");
ok(node.object, "There is a node object property.");
if (node.selector != "window") {
let nodeCount =
await ContentTask.spawn(gBrowser.selectedBrowser, node.selector, async (selector) => {
return content.document.querySelectorAll(selector).length;
});
const nodeCount =
await ContentTask.spawn(gBrowser.selectedBrowser, node.selector,
async (selector) => {
return content.document.querySelectorAll(selector).length;
});
Assert.equal(nodeCount, 1, "The node property is a unique CSS selector.");
} else {
Assert.ok(true, "The node property is a unique CSS selector.");
}
let func = l.function;
const func = l.function;
ok(func, "There is a function property.");
is(func.type, "object", "The function form is of type 'object'.");
is(func.class, "Function", "The function form is of class 'Function'.");
@ -107,5 +118,5 @@ async function testEventListeners(aClient, aThreadClient) {
"Capturing property has the right value.");
}
await aThreadClient.resume();
await threadClient.resume();
}

View file

@ -3,12 +3,23 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
/**
* Tests that the eventListeners request works when there are event handlers
* that the debugger cannot unwrap.
*/
const TAB_URL = EXAMPLE_URL + "doc_native-event-handler.html";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
var { DebuggerServer } = require("devtools/server/main");
var { DebuggerClient } = require("devtools/shared/client/debugger-client");
const TAB_URL = TEST_URI_ROOT + "doc_native-event-handler.html";
var gClient;
var gTab;
@ -17,37 +28,37 @@ function test() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let transport = DebuggerServer.connectPipe();
const transport = DebuggerServer.connectPipe();
gClient = new DebuggerClient(transport);
gClient.connect().then(([aType, aTraits]) => {
is(aType, "browser",
"Root actor should identify itself as a browser.");
addTab(TAB_URL)
.then((aTab) => {
gTab = aTab;
.then((tab) => {
gTab = tab;
return attachThreadActorForUrl(gClient, TAB_URL);
})
.then(pauseDebuggee)
.then(testEventListeners)
.then(() => gClient.close())
.then(finish)
.catch(aError => {
ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
.catch(error => {
ok(false, "Got an error: " + error.message + "\n" + error.stack);
});
});
}
function pauseDebuggee(aThreadClient) {
let deferred = promise.defer();
function pauseDebuggee(threadClient) {
const deferred = getDeferredPromise().defer();
gClient.addOneTimeListener("paused", (aEvent, aPacket) => {
is(aPacket.type, "paused",
gClient.addOneTimeListener("paused", (event, packet) => {
is(packet.type, "paused",
"We should now be paused.");
is(aPacket.why.type, "debuggerStatement",
is(packet.why.type, "debuggerStatement",
"The debugger statement was hit.");
deferred.resolve(aThreadClient);
deferred.resolve(threadClient);
});
generateMouseClickInTab(gTab, "content.document.querySelector('button')");
@ -55,12 +66,12 @@ function pauseDebuggee(aThreadClient) {
return deferred.promise;
}
function testEventListeners(aThreadClient) {
let deferred = promise.defer();
function testEventListeners(threadClient) {
const deferred = getDeferredPromise().defer();
aThreadClient.eventListeners(aPacket => {
if (aPacket.error) {
let msg = "Error getting event listeners: " + aPacket.message;
threadClient.eventListeners(packet => {
if (packet.error) {
const msg = "Error getting event listeners: " + packet.message;
ok(false, msg);
deferred.reject(msg);
return;
@ -69,13 +80,13 @@ function testEventListeners(aThreadClient) {
// There are 2 event listeners in the page: button.onclick, window.onload.
// The video element controls listeners are skipped — they cannot be
// unwrapped but they shouldn't cause us to throw either.
is(aPacket.listeners.length, 2, "Found all event listeners.");
aThreadClient.resume(deferred.resolve);
is(packet.listeners.length, 2, "Found all event listeners.");
threadClient.resume(deferred.resolve);
});
return deferred.promise;
}
registerCleanupFunction(function () {
registerCleanupFunction(function() {
gClient = null;
});

View file

@ -0,0 +1,73 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
var { DebuggerServer } = require("devtools/server/main");
var { DebuggerClient } = require("devtools/shared/client/debugger-client");
var TAB_URL = EXAMPLE_URL + "doc_listworkers-tab.html";
var WORKER1_URL = "code_listworkers-worker1.js";
var WORKER2_URL = "code_listworkers-worker2.js";
add_task(async function test() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
const client = new DebuggerClient(DebuggerServer.connectPipe());
await connect(client);
const tab = await addTab(TAB_URL);
const { tabs } = await listTabs(client);
const [, targetFront] = await attachTarget(client, findTab(tabs, TAB_URL));
let { workers } = await listWorkers(targetFront);
is(workers.length, 0);
executeSoon(() => {
evalInTab(tab, "var worker1 = new Worker('" + WORKER1_URL + "');");
});
await waitForWorkerListChanged(targetFront);
({ workers } = await listWorkers(targetFront));
is(workers.length, 1);
is(workers[0].url, WORKER1_URL);
executeSoon(() => {
evalInTab(tab, "var worker2 = new Worker('" + WORKER2_URL + "');");
});
await waitForWorkerListChanged(targetFront);
({ workers } = await listWorkers(targetFront));
is(workers.length, 2);
is(workers[0].url, WORKER1_URL);
is(workers[1].url, WORKER2_URL);
executeSoon(() => {
evalInTab(tab, "worker1.terminate()");
});
await waitForWorkerListChanged(targetFront);
({ workers } = await listWorkers(targetFront));
is(workers.length, 1);
is(workers[0].url, WORKER2_URL);
executeSoon(() => {
evalInTab(tab, "worker2.terminate()");
});
await waitForWorkerListChanged(targetFront);
({ workers } = await listWorkers(targetFront));
is(workers.length, 0);
await close(client);
finish();
});

View file

@ -3,13 +3,19 @@
"use strict";
// Import helpers for the workers
/* import-globals-from helper_workers.js */
Services.scriptloader.loadSubScript(
"chrome://mochitests/content/browser/devtools/client/shared/test/helper_workers.js",
this);
// The following "connectionClosed" rejection should not be left uncaught. This
// test has been whitelisted until the issue is fixed.
ChromeUtils.import("resource://testing-common/PromiseTestUtils.jsm", this);
PromiseTestUtils.expectUncaughtRejection(/[object Object]/);
var TAB_URL = EXAMPLE_URL + "doc_WorkerTargetActor.attachThread-tab.html";
var WORKER_URL = "code_WorkerTargetActor.attachThread-worker.js";
const TAB_URL = EXAMPLE_URL + "doc_WorkerTargetActor.attachThread-tab.html";
const WORKER_URL = "code_WorkerTargetActor.attachThread-worker.js";
add_task(async function() {
await pushPrefs(["devtools.scratchpad.enabled", true]);
@ -17,21 +23,21 @@ add_task(async function() {
DebuggerServer.init();
DebuggerServer.registerAllActors();
let client = new DebuggerClient(DebuggerServer.connectPipe());
const client = new DebuggerClient(DebuggerServer.connectPipe());
await connect(client);
let tab = await addTab(TAB_URL);
let { tabs } = await listTabs(client);
let [, targetFront] = await attachTarget(client, findTab(tabs, TAB_URL));
const tab = await addTab(TAB_URL);
const { tabs } = await listTabs(client);
const [, targetFront] = await attachTarget(client, findTab(tabs, TAB_URL));
await listWorkers(targetFront);
await createWorkerInTab(tab, WORKER_URL);
let { workers } = await listWorkers(targetFront);
let [, workerTargetFront] = await attachWorker(targetFront,
const { workers } = await listWorkers(targetFront);
const [, workerTargetFront] = await attachWorker(targetFront,
findWorker(workers, WORKER_URL));
let toolbox = await gDevTools.showToolbox(TargetFactory.forWorker(workerTargetFront),
const toolbox = await gDevTools.showToolbox(TargetFactory.forWorker(workerTargetFront),
"jsdebugger",
Toolbox.HostType.WINDOW);
@ -48,8 +54,8 @@ add_task(async function() {
ok(toolbox.win.parent.document.title.includes(WORKER_URL),
"worker URL in host title");
let toolTabs = toolbox.doc.querySelectorAll(".devtools-tab");
let activeTools = [...toolTabs].map(tab=>tab.getAttribute("data-id"));
const toolTabs = toolbox.doc.querySelectorAll(".devtools-tab");
const activeTools = [...toolTabs].map(toolTab => toolTab.getAttribute("data-id"));
is(activeTools.join(","), "webconsole,jsdebugger,scratchpad",
"Correct set of tools supported by worker");

View file

@ -0,0 +1,3 @@
"use strict";
self.onmessage = function() {};

View file

@ -0,0 +1,3 @@
"use strict";
self.onmessage = function() {};

View file

@ -12,10 +12,12 @@
<input type="text" onchange="changeHandler()">
<script type="text/javascript">
window.addEventListener("load", function () {
"use strict";
window.addEventListener("load", function() {
function initialSetup(event) {
debugger;
var button = document.querySelector("button");
const button = document.querySelector("button");
button.onclick = clickHandler;
}
function clickHandler(event) {
@ -28,10 +30,10 @@
window.foobar = "keyupHandler";
}
var button = document.querySelector("button");
const button = document.querySelector("button");
button.onclick = initialSetup;
var input = document.querySelector("input");
const input = document.querySelector("input");
input.addEventListener("keyup", keyupHandler, true);
window.changeHandler = changeHandler;

View file

@ -14,9 +14,11 @@
<button id="boundHandleEventClick">boundHandleEventClick</button>
<script type="text/javascript">
window.addEventListener("load", function () {
"use strict";
window.addEventListener("load", function() {
function initialSetup(event) {
var button = document.getElementById("initialSetup");
const button = document.getElementById("initialSetup");
button.removeEventListener("click", initialSetup);
debugger;
}
@ -26,7 +28,7 @@
}
function handleEventClick() {
var button = document.getElementById("handleEventClick");
const button = document.getElementById("handleEventClick");
// Create a long prototype chain to test for weird edge cases.
button.addEventListener("click", Object.create(Object.create(this)));
}
@ -36,7 +38,7 @@
};
function boundHandleEventClick() {
var button = document.getElementById("boundHandleEventClick");
const button = document.getElementById("boundHandleEventClick");
this.handleEvent = this.handleEvent.bind(this);
button.addEventListener("click", this);
}
@ -45,15 +47,15 @@
window.foobar = "boundHandleEventClick";
};
var button = document.getElementById("clicker");
const button = document.getElementById("clicker");
// Bind more than once to test for weird edge cases.
var boundClicker = clicker.bind(this).bind(this).bind(this);
const boundClicker = clicker.bind(this).bind(this).bind(this);
button.addEventListener("click", boundClicker);
new handleEventClick();
new boundHandleEventClick();
var initButton = document.getElementById("initialSetup");
const initButton = document.getElementById("initialSetup");
initButton.addEventListener("click", initialSetup);
}, {once: true});
</script>

View file

@ -12,6 +12,7 @@
<button>Click me!</button>
<script type="text/javascript">
"use strict";
function runDebuggerStatement() {
debugger;
}

View file

@ -6,6 +6,8 @@
<meta charset="utf-8">
<title>A video element with native event handlers</title>
<script type="text/javascript">
"use strict";
function initialSetup(event) {
debugger;
}

View file

@ -68,6 +68,24 @@ function postMessageToWorkerInTab(tab, url, message) {
return jsonrpc(tab, "postMessageToWorker", [url, message]);
}
function generateMouseClickInTab(tab, path) {
info("Generating mouse click in tab.");
return jsonrpc(tab, "generateMouseClick", [path]);
}
function evalInTab(tab, string) {
info("Evalling string in tab.");
return jsonrpc(tab, "_eval", [string]);
}
function callInTab(tab, name) {
info("Calling function with name '" + name + "' in tab.");
return jsonrpc(tab, "call", [name, Array.prototype.slice.call(arguments, 2)]);
}
function connect(client) {
info("Connecting client.");
return client.connect();
@ -118,6 +136,11 @@ function attachWorker(targetFront, worker) {
return targetFront.attachWorker(worker.actor);
}
function waitForWorkerListChanged(targetFront) {
info("Waiting for worker list to change.");
return targetFront.once("workerListChanged");
}
function attachThread(workerTargetFront, options) {
info("Attaching to thread.");
return workerTargetFront.attachThread(options);
@ -221,3 +244,39 @@ this.removeTab = function removeTab(tab, win) {
targetBrowser.removeTab(tab);
return deferred.promise;
};
async function attachTargetActorForUrl(client, url) {
const grip = await getTargetActorForUrl(client, url);
const [ response, front ] = await client.attachTarget(grip.actor);
return [grip, response, front];
}
async function attachThreadActorForUrl(client, url) {
const [, response] = await attachTargetActorForUrl(client, url);
const [, threadClient] = await client.attachThread(response.threadActor);
await threadClient.resume();
return threadClient;
}
function getTargetActorForUrl(client, url) {
const deferred = getDeferredPromise().defer();
client.listTabs().then(response => {
const targetActor = response.tabs.filter(grip => grip.url == url).pop();
deferred.resolve(targetActor);
});
return deferred.promise;
}
function pushPrefs(...aPrefs) {
const deferred = getDeferredPromise().defer();
SpecialPowers.pushPrefEnv({"set": aPrefs}, deferred.resolve);
return deferred.promise;
}
function popPrefs() {
const deferred = getDeferredPromise().defer();
SpecialPowers.popPrefEnv(deferred.resolve);
return deferred.promise;
}