summaryrefslogtreecommitdiff
path: root/toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js
diff options
context:
space:
mode:
authorMatt A. Tobin <email@mattatobin.com>2016-10-16 19:34:53 -0400
committerMatt A. Tobin <email@mattatobin.com>2016-10-16 19:34:53 -0400
commit81805ce3f63e2e4a799bd54f174083c58a9b5640 (patch)
tree6e13374b213ac9b2ae74c25d8aac875faf71fdd0 /toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js
parent28c8da71bf521bb3ee76f27b8a241919e24b7cd5 (diff)
downloadpalemoon-gre-81805ce3f63e2e4a799bd54f174083c58a9b5640.tar.gz
Move Mozilla DevTools to Platform - Part 3: Merge the browser/devtools and toolkit/devtools adjusting for directory collisions
Diffstat (limited to 'toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js')
-rw-r--r--toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js322
1 files changed, 322 insertions, 0 deletions
diff --git a/toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js b/toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js
new file mode 100644
index 000000000..2b8139dd3
--- /dev/null
+++ b/toolkit/devtools/debugger/test/browser_dbg_breakpoints-contextmenu.js
@@ -0,0 +1,322 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Test if the context menu associated with each breakpoint does what it should.
+ */
+
+const TAB_URL = EXAMPLE_URL + "doc_script-switching-01.html";
+
+function test() {
+ // Debug test slaves are a bit slow at this test.
+ requestLongerTimeout(2);
+
+ let gTab, gPanel, gDebugger;
+ let gSources, gBreakpoints;
+
+ initDebugger(TAB_URL).then(([aTab,, aPanel]) => {
+ gTab = aTab;
+ gPanel = aPanel;
+ gDebugger = gPanel.panelWin;
+ gSources = gDebugger.DebuggerView.Sources;
+ gBreakpoints = gDebugger.DebuggerController.Breakpoints;
+
+ waitForSourceShown(gPanel, "-01.js")
+ .then(performTestWhileNotPaused)
+ .then(performTestWhilePaused)
+ .then(() => resumeDebuggerThenCloseAndFinish(gPanel))
+ .then(null, aError => {
+ ok(false, "Got an error: " + aError.message + "\n" + aError.stack);
+ });
+ });
+
+ 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(() => gPanel.addBreakpoint({ actor: gSources.values[1], line: 8 }))
+ .then(() => gPanel.addBreakpoint({ actor: gSources.values[1], line: 9 }))
+ .then(() => ensureThreadClientState(gPanel, "resumed"));
+ }
+
+ function performTestWhileNotPaused() {
+ info("Performing test while not paused...");
+
+ return addBreakpoints()
+ .then(initialChecks)
+ .then(() => checkBreakpointToggleSelf(0))
+ .then(() => checkBreakpointToggleOthers(0))
+ .then(() => checkBreakpointToggleSelf(1))
+ .then(() => checkBreakpointToggleOthers(1))
+ .then(() => checkBreakpointToggleSelf(2))
+ .then(() => checkBreakpointToggleOthers(2))
+ .then(() => checkBreakpointToggleSelf(3))
+ .then(() => checkBreakpointToggleOthers(3))
+ .then(() => checkBreakpointToggleSelf(4))
+ .then(() => checkBreakpointToggleOthers(4))
+ .then(testDeleteAll);
+ }
+
+ function performTestWhilePaused() {
+ info("Performing test while paused...");
+
+ return addBreakpoints()
+ .then(initialChecks)
+ .then(pauseAndCheck)
+ .then(() => checkBreakpointToggleSelf(0))
+ .then(() => checkBreakpointToggleOthers(0))
+ .then(() => checkBreakpointToggleSelf(1))
+ .then(() => checkBreakpointToggleOthers(1))
+ .then(() => checkBreakpointToggleSelf(2))
+ .then(() => checkBreakpointToggleOthers(2))
+ .then(() => checkBreakpointToggleSelf(3))
+ .then(() => checkBreakpointToggleOthers(3))
+ .then(() => checkBreakpointToggleSelf(4))
+ .then(() => checkBreakpointToggleOthers(4))
+ .then(testDeleteAll);
+ }
+
+ function pauseAndCheck() {
+ let finished = waitForSourceAndCaretAndScopes(gPanel, "-01.js", 5).then(() => {
+ let source = gSources.selectedItem.attachment.source;
+ is(source.url, EXAMPLE_URL + "code_script-switching-01.js",
+ "The currently selected source is incorrect (3).");
+ is(gSources.selectedIndex, 0,
+ "The currently selected source is incorrect (4).");
+ ok(isCaretPos(gPanel, 5),
+ "The editor location is correct after pausing.");
+ });
+
+ let source = gSources.selectedItem.attachment.source;
+ is(source.url, EXAMPLE_URL + "code_script-switching-02.js",
+ "The currently selected source is incorrect (1).");
+ is(gSources.selectedIndex, 1,
+ "The currently selected source is incorrect (2).");
+ ok(isCaretPos(gPanel, 9),
+ "The editor location is correct before pausing.");
+
+ sendMouseClickToTab(gTab, content.document.querySelector("button"));
+
+ return finished;
+ }
+
+ function initialChecks() {
+ for (let source of gSources) {
+ for (let breakpoint of source) {
+ ok(gBreakpoints._getAdded(breakpoint.attachment),
+ "All breakpoint items should have corresponding promises (1).");
+ ok(!gBreakpoints._getRemoving(breakpoint.attachment),
+ "All breakpoint items should have corresponding promises (2).");
+ ok(breakpoint.attachment.actor,
+ "All breakpoint items should have corresponding promises (3).");
+ is(!!breakpoint.attachment.disabled, false,
+ "All breakpoints should initially be enabled.");
+
+ let prefix = "bp-cMenu-"; // "breakpoints context menu"
+ let identifier = gBreakpoints.getIdentifier(breakpoint.attachment);
+ let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem";
+ let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem";
+
+ is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
+ "The 'Enable breakpoint' context menu item should initially be hidden'.");
+ ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
+ "The 'Disable breakpoint' context menu item should initially not be hidden'.");
+ is(breakpoint.attachment.view.checkbox.getAttribute("checked"), "true",
+ "All breakpoints should initially have a checked checkbox.");
+ }
+ }
+ }
+
+ function checkBreakpointToggleSelf(aIndex) {
+ let deferred = promise.defer();
+
+ EventUtils.sendMouseEvent({ type: "click" },
+ gDebugger.document.querySelectorAll(".dbg-breakpoint")[aIndex],
+ gDebugger);
+
+ let selectedBreakpoint = gSources._selectedBreakpointItem;
+
+ ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
+ "There should be a breakpoint client available (1).");
+ ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment),
+ "There should be a breakpoint client available (2).");
+ ok(selectedBreakpoint.attachment.actor,
+ "There should be a breakpoint client available (3).");
+ is(!!selectedBreakpoint.attachment.disabled, false,
+ "The breakpoint should not be disabled yet (" + aIndex + ").");
+
+ gBreakpoints._getAdded(selectedBreakpoint.attachment).then(aBreakpointClient => {
+ ok(aBreakpointClient,
+ "There should be a breakpoint client available as a promise.");
+ });
+
+ let prefix = "bp-cMenu-"; // "breakpoints context menu"
+ let identifier = gBreakpoints.getIdentifier(selectedBreakpoint.attachment);
+ let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem";
+ let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem";
+
+ is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
+ "The 'Enable breakpoint' context menu item should be hidden'.");
+ ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
+ "The 'Disable breakpoint' context menu item should not be hidden'.");
+
+ ok(isCaretPos(gPanel, selectedBreakpoint.attachment.line),
+ "The source editor caret position was incorrect (" + aIndex + ").");
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED).then(() => {
+ ok(!gBreakpoints._getAdded(selectedBreakpoint.attachment),
+ "There should be no breakpoint client available (4).");
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED).then(() => {
+ ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
+ "There should be a breakpoint client available (5).");
+
+ deferred.resolve();
+ });
+
+ // Test re-disabling this breakpoint.
+ gSources._onEnableSelf(selectedBreakpoint.attachment);
+ is(selectedBreakpoint.attachment.disabled, false,
+ "The current breakpoint should now be enabled.")
+
+ is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true",
+ "The 'Enable breakpoint' context menu item should be hidden'.");
+ ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"),
+ "The 'Disable breakpoint' context menu item should not be hidden'.");
+ ok(selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"),
+ "The breakpoint should now be checked.");
+ });
+
+ // Test disabling this breakpoint.
+ gSources._onDisableSelf(selectedBreakpoint.attachment);
+ is(selectedBreakpoint.attachment.disabled, true,
+ "The current breakpoint should now be disabled.")
+
+ ok(!gDebugger.document.getElementById(enableSelfId).hasAttribute("hidden"),
+ "The 'Enable breakpoint' context menu item should not be hidden'.");
+ is(gDebugger.document.getElementById(disableSelfId).getAttribute("hidden"), "true",
+ "The 'Disable breakpoint' context menu item should be hidden'.");
+ ok(!selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"),
+ "The breakpoint should now be unchecked.");
+
+ return deferred.promise;
+ }
+
+ function checkBreakpointToggleOthers(aIndex) {
+ let deferred = promise.defer();
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 4).then(() => {
+ let selectedBreakpoint = gSources._selectedBreakpointItem;
+
+ ok(gBreakpoints._getAdded(selectedBreakpoint.attachment),
+ "There should be a breakpoint client available (6).");
+ ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment),
+ "There should be a breakpoint client available (7).");
+ ok(selectedBreakpoint.attachment.actor,
+ "There should be a breakpoint client available (8).");
+ is(!!selectedBreakpoint.attachment.disabled, false,
+ "The targetted breakpoint should not have been disabled (" + aIndex + ").");
+
+ for (let source of gSources) {
+ for (let otherBreakpoint of source) {
+ if (otherBreakpoint != selectedBreakpoint) {
+ ok(!gBreakpoints._getAdded(otherBreakpoint.attachment),
+ "There should be no breakpoint client for a disabled breakpoint (9).");
+ is(otherBreakpoint.attachment.disabled, true,
+ "Non-targetted breakpoints should have been disabled (10).");
+ }
+ }
+ }
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 4).then(() => {
+ for (let source of gSources) {
+ for (let someBreakpoint of source) {
+ ok(gBreakpoints._getAdded(someBreakpoint.attachment),
+ "There should be a breakpoint client for all enabled breakpoints (11).");
+ is(someBreakpoint.attachment.disabled, false,
+ "All breakpoints should now have been enabled (12).");
+ }
+ }
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => {
+ for (let source of gSources) {
+ for (let someBreakpoint of source) {
+ ok(!gBreakpoints._getAdded(someBreakpoint.attachment),
+ "There should be no breakpoint client for a disabled breakpoint (13).");
+ is(someBreakpoint.attachment.disabled, true,
+ "All breakpoints should now have been disabled (14).");
+ }
+ }
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 5).then(() => {
+ for (let source of gSources) {
+ for (let someBreakpoint of source) {
+ ok(gBreakpoints._getAdded(someBreakpoint.attachment),
+ "There should be a breakpoint client for all enabled breakpoints (15).");
+ is(someBreakpoint.attachment.disabled, false,
+ "All breakpoints should now have been enabled (16).");
+ }
+ }
+
+ // Done.
+ deferred.resolve();
+ });
+
+ // Test re-enabling all breakpoints.
+ enableAll();
+ });
+
+ // Test disabling all breakpoints.
+ disableAll();
+ });
+
+ // Test re-enabling other breakpoints.
+ enableOthers();
+ });
+
+ // Test disabling other breakpoints.
+ disableOthers();
+
+ return deferred.promise;
+ }
+
+ function testDeleteAll() {
+ let deferred = promise.defer();
+
+ waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => {
+ ok(!gSources._selectedBreakpointItem,
+ "There should be no breakpoint available after removing all breakpoints.");
+
+ for (let source of gSources) {
+ for (let otherBreakpoint of source) {
+ ok(false, "It's a trap!");
+ }
+ }
+
+ // Done.
+ deferred.resolve()
+ });
+
+ // Test deleting all breakpoints.
+ deleteAll();
+
+ return deferred.promise;
+ }
+
+ function disableOthers() {
+ gSources._onDisableOthers(gSources._selectedBreakpointItem.attachment);
+ }
+ function enableOthers() {
+ gSources._onEnableOthers(gSources._selectedBreakpointItem.attachment);
+ }
+ function disableAll() {
+ gSources._onDisableAll();
+ }
+ function enableAll() {
+ gSources._onEnableAll();
+ }
+ function deleteAll() {
+ gSources._onDeleteAll();
+ }
+}