summaryrefslogtreecommitdiffstats
path: root/devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js')
-rw-r--r--devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js b/devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js
new file mode 100644
index 000000000..d6d61a76b
--- /dev/null
+++ b/devtools/client/debugger/test/mochitest/browser_dbg_interrupts.js
@@ -0,0 +1,123 @@
+/* -*- 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/ */
+
+/**
+ * Test resuming from button and keyboard shortcuts.
+ */
+
+const TAB_URL = EXAMPLE_URL + "doc_script-switching-01.html";
+
+function test() {
+ let gTab, gPanel, gDebugger;
+ let gSources, gBreakpoints, gTarget, gResumeButton, gResumeKey, gThreadClient;
+
+ let options = {
+ source: EXAMPLE_URL + "code_script-switching-01.js",
+ line: 1
+ };
+ initDebugger(TAB_URL, options).then(([aTab,, aPanel]) => {
+ gTab = aTab;
+ gPanel = aPanel;
+ gDebugger = gPanel.panelWin;
+ gSources = gDebugger.DebuggerView.Sources;
+ gBreakpoints = gDebugger.DebuggerController.Breakpoints;
+ gTarget = gDebugger.gTarget;
+ gThreadClient = gDebugger.gThreadClient;
+ gResumeButton = gDebugger.document.getElementById("resume");
+ gResumeKey = gDebugger.document.getElementById("resumeKey");
+
+ gTarget.on("thread-paused", failOnPause);
+ addBreakpoints()
+ .then(() => { gTarget.off("thread-paused", failOnPause); })
+ .then(testResumeButton)
+ .then(testResumeKeyboard)
+ .then(() => closeDebuggerAndFinish(gPanel))
+ .then(null, aError => {
+ ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
+ });
+ });
+
+ function failOnPause() {
+ ok(false, "A pause was sent, but it shouldn't have been");
+ }
+
+ function addBreakpoints() {
+ return promise.resolve(null)
+ .then(() => gPanel.addBreakpoint({ actor: gSources.values[0], line: 5 }))
+ .then(() => gPanel.addBreakpoint({ actor: gSources.values[1], line: 6 }))
+ .then(() => gPanel.addBreakpoint({ actor: gSources.values[1], line: 7 }))
+ .then(() => ensureThreadClientState(gPanel, "resumed"));
+ }
+
+ function resume() {
+ let onceResumed = gTarget.once("thread-resumed");
+ gThreadClient.resume();
+ return onceResumed;
+ }
+
+ function testResumeButton() {
+ info("Pressing the resume button, expecting a thread-paused");
+
+ ok(!gResumeButton.hasAttribute("disabled"), "Resume button is not disabled 1");
+ ok(!gResumeButton.hasAttribute("break-on-next"), "Resume button isn't waiting for next execution");
+ ok(!gResumeButton.hasAttribute("checked"), "Resume button is not checked");
+ let oncePaused = gTarget.once("thread-paused");
+
+ // Click the pause button to break on next execution
+ EventUtils.sendMouseEvent({ type: "mousedown" }, gResumeButton, gDebugger);
+ ok(gResumeButton.hasAttribute("disabled"), "Resume button is disabled");
+ ok(gResumeButton.hasAttribute("break-on-next"), "Resume button is waiting for next execution");
+ ok(!gResumeButton.hasAttribute("checked"), "Resume button is not checked");
+
+ // Evaluate a script to fully pause the debugger
+ once(gDebugger.gClient, "willInterrupt").then(() => {
+ evalInTab(gTab, "1+1;");
+ });
+
+ return waitForDebuggerEvents(gPanel, gDebugger.EVENTS.SOURCE_SHOWN)
+ .then(() => {
+ ok(!gResumeButton.hasAttribute("break-on-next"), "Resume button isn't waiting for next execution");
+ is(gResumeButton.getAttribute("checked"), "true", "Resume button is checked");
+ ok(!gResumeButton.hasAttribute("disabled"), "Resume button is not disabled 2");
+ })
+ .then(() => {
+ let p = ensureThreadClientState(gPanel, "resumed");
+ gThreadClient.resume();
+ return p;
+ });
+ }
+
+ function testResumeKeyboard() {
+ let key = gResumeKey.getAttribute("keycode");
+ info("Triggering a pause with keyboard (" + key + "), expecting a thread-paused");
+
+ ok(!gResumeButton.hasAttribute("disabled"), "Resume button is not disabled 3");
+ ok(!gResumeButton.hasAttribute("break-on-next"), "Resume button isn't waiting for next execution");
+ ok(!gResumeButton.hasAttribute("checked"), "Resume button is not checked");
+
+ // Press the key to break on next execution
+ EventUtils.synthesizeKey(key, { }, gDebugger);
+ ok(gResumeButton.hasAttribute("disabled"), "Resume button is disabled");
+ ok(gResumeButton.hasAttribute("break-on-next"), "Resume button is waiting for next execution");
+ ok(!gResumeButton.hasAttribute("checked"), "Resume button is not checked");
+
+ // Evaluate a script to fully pause the debugger
+ once(gDebugger.gClient, "willInterrupt").then(() => {
+ evalInTab(gTab, "1+1;");
+ });
+
+ return waitForDebuggerEvents(gPanel, gDebugger.EVENTS.SOURCE_SHOWN)
+ .then(() => {
+ ok(!gResumeButton.hasAttribute("break-on-next"), "Resume button isn't waiting for next execution");
+ is(gResumeButton.getAttribute("checked"), "true", "Resume button is checked");
+ ok(!gResumeButton.hasAttribute("disabled"), "Resume button is not disabled 4");
+ })
+ .then(() => {
+ let p = ensureThreadClientState(gPanel, "resumed");
+ gThreadClient.resume();
+ return p;
+ });
+ }
+}