michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Test if the context menu associated with each breakpoint does what it should. michael@0: */ michael@0: michael@0: const TAB_URL = EXAMPLE_URL + "doc_script-switching-01.html"; michael@0: michael@0: function test() { michael@0: // Debug test slaves are a bit slow at this test. michael@0: requestLongerTimeout(2); michael@0: michael@0: let gTab, gDebuggee, gPanel, gDebugger; michael@0: let gSources, gBreakpoints; michael@0: michael@0: initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { michael@0: gTab = aTab; michael@0: gDebuggee = aDebuggee; michael@0: gPanel = aPanel; michael@0: gDebugger = gPanel.panelWin; michael@0: gSources = gDebugger.DebuggerView.Sources; michael@0: gBreakpoints = gDebugger.DebuggerController.Breakpoints; michael@0: michael@0: waitForSourceShown(gPanel, "-01.js") michael@0: .then(performTestWhileNotPaused) michael@0: .then(performTestWhilePaused) michael@0: .then(() => resumeDebuggerThenCloseAndFinish(gPanel)) michael@0: .then(null, aError => { michael@0: ok(false, "Got an error: " + aError.message + "\n" + aError.stack); michael@0: }); michael@0: }); michael@0: michael@0: function addBreakpoints() { michael@0: return promise.resolve(null) michael@0: .then(() => gPanel.addBreakpoint({ url: gSources.values[0], line: 5 })) michael@0: .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 6 })) michael@0: .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 7 })) michael@0: .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 8 })) michael@0: .then(() => gPanel.addBreakpoint({ url: gSources.values[1], line: 9 })) michael@0: .then(() => ensureThreadClientState(gPanel, "resumed")); michael@0: } michael@0: michael@0: function performTestWhileNotPaused() { michael@0: info("Performing test while not paused..."); michael@0: michael@0: return addBreakpoints() michael@0: .then(initialChecks) michael@0: .then(() => checkBreakpointToggleSelf(0)) michael@0: .then(() => checkBreakpointToggleOthers(0)) michael@0: .then(() => checkBreakpointToggleSelf(1)) michael@0: .then(() => checkBreakpointToggleOthers(1)) michael@0: .then(() => checkBreakpointToggleSelf(2)) michael@0: .then(() => checkBreakpointToggleOthers(2)) michael@0: .then(() => checkBreakpointToggleSelf(3)) michael@0: .then(() => checkBreakpointToggleOthers(3)) michael@0: .then(() => checkBreakpointToggleSelf(4)) michael@0: .then(() => checkBreakpointToggleOthers(4)) michael@0: .then(testDeleteAll); michael@0: } michael@0: michael@0: function performTestWhilePaused() { michael@0: info("Performing test while paused..."); michael@0: michael@0: return addBreakpoints() michael@0: .then(initialChecks) michael@0: .then(pauseAndCheck) michael@0: .then(() => checkBreakpointToggleSelf(0)) michael@0: .then(() => checkBreakpointToggleOthers(0)) michael@0: .then(() => checkBreakpointToggleSelf(1)) michael@0: .then(() => checkBreakpointToggleOthers(1)) michael@0: .then(() => checkBreakpointToggleSelf(2)) michael@0: .then(() => checkBreakpointToggleOthers(2)) michael@0: .then(() => checkBreakpointToggleSelf(3)) michael@0: .then(() => checkBreakpointToggleOthers(3)) michael@0: .then(() => checkBreakpointToggleSelf(4)) michael@0: .then(() => checkBreakpointToggleOthers(4)) michael@0: .then(testDeleteAll); michael@0: } michael@0: michael@0: function pauseAndCheck() { michael@0: let finished = waitForSourceAndCaretAndScopes(gPanel, "-01.js", 5).then(() => { michael@0: is(gSources.selectedValue, EXAMPLE_URL + "code_script-switching-01.js", michael@0: "The currently selected source is incorrect (3)."); michael@0: is(gSources.selectedIndex, 0, michael@0: "The currently selected source is incorrect (4)."); michael@0: ok(isCaretPos(gPanel, 5), michael@0: "The editor location is correct after pausing."); michael@0: }); michael@0: michael@0: is(gSources.selectedValue, EXAMPLE_URL + "code_script-switching-02.js", michael@0: "The currently selected source is incorrect (1)."); michael@0: is(gSources.selectedIndex, 1, michael@0: "The currently selected source is incorrect (2)."); michael@0: ok(isCaretPos(gPanel, 9), michael@0: "The editor location is correct before pausing."); michael@0: michael@0: // Spin the event loop before causing the debuggee to pause, to allow michael@0: // this function to return first. michael@0: executeSoon(() => { michael@0: EventUtils.sendMouseEvent({ type: "click" }, michael@0: gDebuggee.document.querySelector("button"), michael@0: gDebuggee); michael@0: }); michael@0: michael@0: return finished; michael@0: } michael@0: michael@0: function initialChecks() { michael@0: for (let source of gSources) { michael@0: for (let breakpoint of source) { michael@0: ok(gBreakpoints._getAdded(breakpoint.attachment), michael@0: "All breakpoint items should have corresponding promises (1)."); michael@0: ok(!gBreakpoints._getRemoving(breakpoint.attachment), michael@0: "All breakpoint items should have corresponding promises (2)."); michael@0: ok(breakpoint.attachment.actor, michael@0: "All breakpoint items should have corresponding promises (3)."); michael@0: is(!!breakpoint.attachment.disabled, false, michael@0: "All breakpoints should initially be enabled."); michael@0: michael@0: let prefix = "bp-cMenu-"; // "breakpoints context menu" michael@0: let identifier = gBreakpoints.getIdentifier(breakpoint.attachment); michael@0: let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem"; michael@0: let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem"; michael@0: michael@0: is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true", michael@0: "The 'Enable breakpoint' context menu item should initially be hidden'."); michael@0: ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"), michael@0: "The 'Disable breakpoint' context menu item should initially not be hidden'."); michael@0: is(breakpoint.attachment.view.checkbox.getAttribute("checked"), "true", michael@0: "All breakpoints should initially have a checked checkbox."); michael@0: } michael@0: } michael@0: } michael@0: michael@0: function checkBreakpointToggleSelf(aIndex) { michael@0: let deferred = promise.defer(); michael@0: michael@0: EventUtils.sendMouseEvent({ type: "click" }, michael@0: gDebugger.document.querySelectorAll(".dbg-breakpoint")[aIndex], michael@0: gDebugger); michael@0: michael@0: let selectedBreakpoint = gSources._selectedBreakpointItem; michael@0: michael@0: ok(gBreakpoints._getAdded(selectedBreakpoint.attachment), michael@0: "There should be a breakpoint client available (1)."); michael@0: ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment), michael@0: "There should be a breakpoint client available (2)."); michael@0: ok(selectedBreakpoint.attachment.actor, michael@0: "There should be a breakpoint client available (3)."); michael@0: is(!!selectedBreakpoint.attachment.disabled, false, michael@0: "The breakpoint should not be disabled yet (" + aIndex + ")."); michael@0: michael@0: gBreakpoints._getAdded(selectedBreakpoint.attachment).then(aBreakpointClient => { michael@0: ok(aBreakpointClient, michael@0: "There should be a breakpoint client available as a promise."); michael@0: }); michael@0: michael@0: let prefix = "bp-cMenu-"; // "breakpoints context menu" michael@0: let identifier = gBreakpoints.getIdentifier(selectedBreakpoint.attachment); michael@0: let enableSelfId = prefix + "enableSelf-" + identifier + "-menuitem"; michael@0: let disableSelfId = prefix + "disableSelf-" + identifier + "-menuitem"; michael@0: michael@0: is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true", michael@0: "The 'Enable breakpoint' context menu item should be hidden'."); michael@0: ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"), michael@0: "The 'Disable breakpoint' context menu item should not be hidden'."); michael@0: michael@0: ok(isCaretPos(gPanel, selectedBreakpoint.attachment.line), michael@0: "The source editor caret position was incorrect (" + aIndex + ")."); michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED).then(() => { michael@0: ok(!gBreakpoints._getAdded(selectedBreakpoint.attachment), michael@0: "There should be no breakpoint client available (4)."); michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED).then(() => { michael@0: ok(gBreakpoints._getAdded(selectedBreakpoint.attachment), michael@0: "There should be a breakpoint client available (5)."); michael@0: michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: // Test re-disabling this breakpoint. michael@0: gSources._onEnableSelf(selectedBreakpoint.attachment); michael@0: is(selectedBreakpoint.attachment.disabled, false, michael@0: "The current breakpoint should now be enabled.") michael@0: michael@0: is(gDebugger.document.getElementById(enableSelfId).getAttribute("hidden"), "true", michael@0: "The 'Enable breakpoint' context menu item should be hidden'."); michael@0: ok(!gDebugger.document.getElementById(disableSelfId).hasAttribute("hidden"), michael@0: "The 'Disable breakpoint' context menu item should not be hidden'."); michael@0: ok(selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"), michael@0: "The breakpoint should now be checked."); michael@0: }); michael@0: michael@0: // Test disabling this breakpoint. michael@0: gSources._onDisableSelf(selectedBreakpoint.attachment); michael@0: is(selectedBreakpoint.attachment.disabled, true, michael@0: "The current breakpoint should now be disabled.") michael@0: michael@0: ok(!gDebugger.document.getElementById(enableSelfId).hasAttribute("hidden"), michael@0: "The 'Enable breakpoint' context menu item should not be hidden'."); michael@0: is(gDebugger.document.getElementById(disableSelfId).getAttribute("hidden"), "true", michael@0: "The 'Disable breakpoint' context menu item should be hidden'."); michael@0: ok(!selectedBreakpoint.attachment.view.checkbox.hasAttribute("checked"), michael@0: "The breakpoint should now be unchecked."); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function checkBreakpointToggleOthers(aIndex) { michael@0: let deferred = promise.defer(); michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 4).then(() => { michael@0: let selectedBreakpoint = gSources._selectedBreakpointItem; michael@0: michael@0: ok(gBreakpoints._getAdded(selectedBreakpoint.attachment), michael@0: "There should be a breakpoint client available (6)."); michael@0: ok(!gBreakpoints._getRemoving(selectedBreakpoint.attachment), michael@0: "There should be a breakpoint client available (7)."); michael@0: ok(selectedBreakpoint.attachment.actor, michael@0: "There should be a breakpoint client available (8)."); michael@0: is(!!selectedBreakpoint.attachment.disabled, false, michael@0: "The targetted breakpoint should not have been disabled (" + aIndex + ")."); michael@0: michael@0: for (let source of gSources) { michael@0: for (let otherBreakpoint of source) { michael@0: if (otherBreakpoint != selectedBreakpoint) { michael@0: ok(!gBreakpoints._getAdded(otherBreakpoint.attachment), michael@0: "There should be no breakpoint client for a disabled breakpoint (9)."); michael@0: is(otherBreakpoint.attachment.disabled, true, michael@0: "Non-targetted breakpoints should have been disabled (10)."); michael@0: } michael@0: } michael@0: } michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 4).then(() => { michael@0: for (let source of gSources) { michael@0: for (let someBreakpoint of source) { michael@0: ok(gBreakpoints._getAdded(someBreakpoint.attachment), michael@0: "There should be a breakpoint client for all enabled breakpoints (11)."); michael@0: is(someBreakpoint.attachment.disabled, false, michael@0: "All breakpoints should now have been enabled (12)."); michael@0: } michael@0: } michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => { michael@0: for (let source of gSources) { michael@0: for (let someBreakpoint of source) { michael@0: ok(!gBreakpoints._getAdded(someBreakpoint.attachment), michael@0: "There should be no breakpoint client for a disabled breakpoint (13)."); michael@0: is(someBreakpoint.attachment.disabled, true, michael@0: "All breakpoints should now have been disabled (14)."); michael@0: } michael@0: } michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_ADDED, 5).then(() => { michael@0: for (let source of gSources) { michael@0: for (let someBreakpoint of source) { michael@0: ok(gBreakpoints._getAdded(someBreakpoint.attachment), michael@0: "There should be a breakpoint client for all enabled breakpoints (15)."); michael@0: is(someBreakpoint.attachment.disabled, false, michael@0: "All breakpoints should now have been enabled (16)."); michael@0: } michael@0: } michael@0: michael@0: // Done. michael@0: deferred.resolve(); michael@0: }); michael@0: michael@0: // Test re-enabling all breakpoints. michael@0: enableAll(); michael@0: }); michael@0: michael@0: // Test disabling all breakpoints. michael@0: disableAll(); michael@0: }); michael@0: michael@0: // Test re-enabling other breakpoints. michael@0: enableOthers(); michael@0: }); michael@0: michael@0: // Test disabling other breakpoints. michael@0: disableOthers(); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function testDeleteAll() { michael@0: let deferred = promise.defer(); michael@0: michael@0: waitForDebuggerEvents(gPanel, gDebugger.EVENTS.BREAKPOINT_REMOVED, 5).then(() => { michael@0: ok(!gSources._selectedBreakpointItem, michael@0: "There should be no breakpoint available after removing all breakpoints."); michael@0: michael@0: for (let source of gSources) { michael@0: for (let otherBreakpoint of source) { michael@0: ok(false, "It's a trap!"); michael@0: } michael@0: } michael@0: michael@0: // Done. michael@0: deferred.resolve() michael@0: }); michael@0: michael@0: // Test deleting all breakpoints. michael@0: deleteAll(); michael@0: michael@0: return deferred.promise; michael@0: } michael@0: michael@0: function disableOthers() { michael@0: gSources._onDisableOthers(gSources._selectedBreakpointItem.attachment); michael@0: } michael@0: function enableOthers() { michael@0: gSources._onEnableOthers(gSources._selectedBreakpointItem.attachment); michael@0: } michael@0: function disableAll() { michael@0: gSources._onDisableAll(); michael@0: } michael@0: function enableAll() { michael@0: gSources._onEnableAll(); michael@0: } michael@0: function deleteAll() { michael@0: gSources._onDeleteAll(); michael@0: } michael@0: }