diff options
Diffstat (limited to 'devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js')
-rw-r--r-- | devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js b/devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js new file mode 100644 index 000000000..d3d857753 --- /dev/null +++ b/devtools/client/debugger/test/mochitest/browser_dbg_conditional-breakpoints-02.js @@ -0,0 +1,219 @@ +/* -*- 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/ */ + +/** + * Bug 740825: Test the debugger conditional breakpoints. + */ + +const TAB_URL = EXAMPLE_URL + "doc_conditional-breakpoints.html"; + +function test() { + let options = { + source: TAB_URL, + line: 1 + }; + initDebugger(TAB_URL, options).then(([aTab,, aPanel]) => { + const gTab = aTab; + const gPanel = aPanel; + const gDebugger = gPanel.panelWin; + const gEditor = gDebugger.DebuggerView.editor; + const gSources = gDebugger.DebuggerView.Sources; + const queries = gDebugger.require("./content/queries"); + const constants = gDebugger.require("./content/constants"); + const actions = bindActionCreators(gPanel); + const getState = gDebugger.DebuggerController.getState; + const CONDITIONAL_POPUP_SHOWN = gDebugger.EVENTS.CONDITIONAL_BREAKPOINT_POPUP_SHOWN; + + // This test forces conditional breakpoints to be evaluated on the + // client-side + var client = gPanel.target.client; + client.mainRoot.traits.conditionalBreakpoints = false; + + function addBreakpoint1() { + return actions.addBreakpoint({ actor: gSources.selectedValue, line: 18 }); + } + + function addBreakpoint2() { + let finished = waitForDispatch(gPanel, constants.ADD_BREAKPOINT); + setCaretPosition(19); + gSources._onCmdAddBreakpoint(); + return finished; + } + + function modBreakpoint2() { + setCaretPosition(19); + let popupShown = waitForDebuggerEvents(gPanel, CONDITIONAL_POPUP_SHOWN); + gSources._onCmdAddConditionalBreakpoint(); + return popupShown; + } + + function* addBreakpoint3() { + let finished = waitForDispatch(gPanel, constants.ADD_BREAKPOINT); + let popupShown = waitForDebuggerEvents(gPanel, CONDITIONAL_POPUP_SHOWN); + setCaretPosition(20); + gSources._onCmdAddConditionalBreakpoint(); + yield finished; + yield popupShown; + } + + function* modBreakpoint3() { + setCaretPosition(20); + + let popupShown = waitForDebuggerEvents(gPanel, CONDITIONAL_POPUP_SHOWN); + gSources._onCmdAddConditionalBreakpoint(); + yield popupShown; + + typeText(gSources._cbTextbox, "bamboocha"); + + let finished = waitForDispatch(gPanel, constants.SET_BREAKPOINT_CONDITION); + EventUtils.sendKey("RETURN", gDebugger); + yield finished; + } + + function addBreakpoint4() { + let finished = waitForDispatch(gPanel, constants.ADD_BREAKPOINT); + setCaretPosition(21); + gSources._onCmdAddBreakpoint(); + return finished; + } + + function delBreakpoint4() { + let finished = waitForDispatch(gPanel, constants.REMOVE_BREAKPOINT); + setCaretPosition(21); + gSources._onCmdAddBreakpoint(); + return finished; + } + + function testBreakpoint(aLine, aPopupVisible, aConditionalExpression) { + const source = queries.getSelectedSource(getState()); + ok(source, + "There should be a selected item in the sources pane."); + + const bp = queries.getBreakpoint(getState(), { + actor: source.actor, + line: aLine + }); + const bpItem = gSources._getBreakpoint(bp); + ok(bp, "There should be a breakpoint."); + ok(bpItem, "There should be a breakpoint in the sources pane."); + + is(bp.location.actor, source.actor, + "The breakpoint on line " + aLine + " wasn't added on the correct source."); + is(bp.location.line, aLine, + "The breakpoint on line " + aLine + " wasn't found."); + is(!!bp.disabled, false, + "The breakpoint on line " + aLine + " should be enabled."); + is(gSources._conditionalPopupVisible, aPopupVisible, + "The breakpoint on line " + aLine + " should have a correct popup state (2)."); + is(bp.condition, aConditionalExpression, + "The breakpoint on line " + aLine + " should have a correct conditional expression."); + } + + function testNoBreakpoint(aLine) { + let selectedActor = gSources.selectedValue; + let selectedBreakpoint = gSources._selectedBreakpoint; + + ok(selectedActor, + "There should be a selected item in the sources pane for line " + aLine + "."); + ok(!selectedBreakpoint, + "There should be no selected brekapoint in the sources pane for line " + aLine + "."); + + ok(isCaretPos(gPanel, aLine), + "The editor caret position is not properly set."); + } + + function setCaretPosition(aLine) { + gEditor.setCursor({ line: aLine - 1, ch: 0 }); + } + + function clickOnBreakpoint(aIndex) { + EventUtils.sendMouseEvent({ type: "click" }, + gDebugger.document.querySelectorAll(".dbg-breakpoint")[aIndex], + gDebugger); + } + + function waitForConditionUpdate() { + // This will close the popup and send another request to update + // the condition + gSources._hideConditionalPopup(); + return waitForDispatch(gPanel, constants.SET_BREAKPOINT_CONDITION); + } + + Task.spawn(function* () { + let onCaretUpdated = waitForCaretAndScopes(gPanel, 17); + callInTab(gTab, "ermahgerd"); + yield onCaretUpdated; + + is(gDebugger.gThreadClient.state, "paused", + "Should only be getting stack frames while paused."); + is(queries.getSourceCount(getState()), 1, + "Found the expected number of sources."); + is(gEditor.getText().indexOf("ermahgerd"), 253, + "The correct source was loaded initially."); + is(gSources.selectedValue, gSources.values[0], + "The correct source is selected."); + + is(queries.getBreakpoints(getState()).length, 0, + "No breakpoints currently added."); + + yield addBreakpoint1(); + testBreakpoint(18, false, undefined); + + yield addBreakpoint2(); + testBreakpoint(19, false, undefined); + yield modBreakpoint2(); + testBreakpoint(19, true, undefined); + yield waitForConditionUpdate(); + yield addBreakpoint3(); + testBreakpoint(20, true, ""); + yield waitForConditionUpdate(); + yield modBreakpoint3(); + testBreakpoint(20, false, "bamboocha"); + yield addBreakpoint4(); + testBreakpoint(21, false, undefined); + yield delBreakpoint4(); + + setCaretPosition(18); + is(gSources._selectedBreakpoint.location.line, 18, + "The selected breakpoint is line 18"); + yield testBreakpoint(18, false, undefined); + + setCaretPosition(19); + is(gSources._selectedBreakpoint.location.line, 19, + "The selected breakpoint is line 19"); + yield testBreakpoint(19, false, ""); + + setCaretPosition(20); + is(gSources._selectedBreakpoint.location.line, 20, + "The selected breakpoint is line 20"); + yield testBreakpoint(20, false, "bamboocha"); + + setCaretPosition(17); + yield testNoBreakpoint(17); + + setCaretPosition(21); + yield testNoBreakpoint(21); + + clickOnBreakpoint(0); + is(gSources._selectedBreakpoint.location.line, 18, + "The selected breakpoint is line 18"); + yield testBreakpoint(18, false, undefined); + + clickOnBreakpoint(1); + is(gSources._selectedBreakpoint.location.line, 19, + "The selected breakpoint is line 19"); + yield testBreakpoint(19, false, ""); + + clickOnBreakpoint(2); + is(gSources._selectedBreakpoint.location.line, 20, + "The selected breakpoint is line 20"); + testBreakpoint(20, true, "bamboocha"); + + // Reset traits back to default value + client.mainRoot.traits.conditionalBreakpoints = true; + resumeDebuggerThenCloseAndFinish(gPanel); + }); + }); +} |