Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
"use strict";
/* import-globals-from helper-serviceworker.js */
Services.scriptloader.loadSubScript(
CHROME_URL_ROOT + "helper-serviceworker.js",
this
);
Services.scriptloader.loadSubScript(
this
);
const SW_TAB_URL =
URL_ROOT_SSL + "resources/service-workers/controlled-sw.html";
const SW_URL = URL_ROOT_SSL + "resources/service-workers/controlled-sw.js";
/**
* Test various simple debugging operation against service workers debugged through about:debugging.
*/
add_task(async function () {
await enableServiceWorkerDebugging();
const { document, tab, window } = await openAboutDebugging({
enableWorkerUpdates: true,
});
await selectThisFirefoxPage(document, window.AboutDebugging.store);
// Open a tab that registers a basic service worker.
const swTab = await addTab(SW_TAB_URL);
// Wait for the registration to make sure service worker has been started, and that we
// are not just reading STOPPED as the initial state.
await waitForRegistration(swTab);
info("Open a toolbox to debug the worker");
const { devtoolsTab, devtoolsWindow } = await openAboutDevtoolsToolbox(
document,
tab,
window,
SW_URL
);
const toolbox = getToolbox(devtoolsWindow);
info("Assert the default tools displayed in worker toolboxes");
const toolTabs = toolbox.doc.querySelectorAll(".devtools-tab");
const activeTools = [...toolTabs].map(toolTab =>
toolTab.getAttribute("data-id")
);
is(
activeTools.join(","),
"webconsole,jsdebugger",
"Correct set of tools supported by worker"
);
const webconsole = await toolbox.selectTool("webconsole");
const { hud } = webconsole;
info("Evaluate location in the console");
await executeAndWaitForMessage(hud, "this.location.toString()", SW_URL);
ok(true, "Got the location logged in the console");
info(
"Evaluate Date and RegExp to ensure their formater also work from worker threads"
);
await executeAndWaitForMessage(
hud,
"new Date(2013, 3, 1)",
"Mon Apr 01 2013 00:00:00"
);
ok(true, "Date object has expected text content");
await executeAndWaitForMessage(hud, "new RegExp('.*')", "/.*/");
ok(true, "RegExp has expected text content");
await toolbox.selectTool("jsdebugger");
const dbg = createDebuggerContext(toolbox);
const {
selectors: { getIsWaitingOnBreak, getCurrentThread },
} = dbg;
info("Wait for next interupt in the worker thread");
await clickElement(dbg, "pause");
await waitForState(dbg, () => getIsWaitingOnBreak(getCurrentThread()));
info("Trigger some code in the worker and wait for pause");
await SpecialPowers.spawn(swTab.linkedBrowser, [], async function () {
content.wrappedJSObject.installServiceWorker();
});
await waitForPaused(dbg);
ok(true, "successfully paused");
info(
"Evaluate some variable only visible if we execute in the breakpoint frame"
);
await executeAndWaitForMessage(hud, "event.data", "install-service-worker");
info("Resume execution");
await resume(dbg);
info("Test pausing from console evaluation");
hud.ui.wrapper.dispatchEvaluateExpression("debugger; 42");
await waitForPaused(dbg);
ok(true, "successfully paused");
info("Immediately resume");
await resume(dbg);
await waitFor(() => findMessagesByType(hud, "42", ".result"));
ok("The paused console evaluation resumed and logged its magic number");
info("Destroy the toolbox");
await closeAboutDevtoolsToolbox(document, devtoolsTab, window);
info("Unregister service worker");
await unregisterServiceWorker(swTab);
info("Wait until the service worker disappears from about:debugging");
await waitUntil(() => !findDebugTargetByText(SW_URL, document));
info("Remove tabs");
await removeTab(swTab);
await removeTab(tab);
});
async function executeAndWaitForMessage(hud, evaluationString, expectedResult) {
hud.ui.wrapper.dispatchEvaluateExpression();
await waitFor(() => findMessagesByType(hud, expectedResult, ".result"));
}