summaryrefslogtreecommitdiffstats
path: root/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js')
-rw-r--r--devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js131
1 files changed, 131 insertions, 0 deletions
diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js
new file mode 100644
index 0000000000..742791668d
--- /dev/null
+++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_console.js
@@ -0,0 +1,131 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* import-globals-from helper-serviceworker.js */
+Services.scriptloader.loadSubScript(
+ CHROME_URL_ROOT + "helper-serviceworker.js",
+ this
+);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/debugger/test/mochitest/shared-head.js",
+ 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, state => 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"));
+}