diff -r 000000000000 -r 6474c204b198 browser/devtools/debugger/test/browser_dbg_watch-expressions-01.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/devtools/debugger/test/browser_dbg_watch-expressions-01.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,228 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Bug 727429: Test the debugger watch expressions. + */ + +const TAB_URL = EXAMPLE_URL + "doc_watch-expressions.html"; + +function test() { + // Debug test slaves are a bit slow at this test. + requestLongerTimeout(2); + + let gTab, gDebuggee, gPanel, gDebugger; + let gEditor, gWatch, gVariables; + + initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { + gTab = aTab; + gDebuggee = aDebuggee; + gPanel = aPanel; + gDebugger = gPanel.panelWin; + gEditor = gDebugger.DebuggerView.editor; + gWatch = gDebugger.DebuggerView.WatchExpressions; + gVariables = gDebugger.DebuggerView.Variables; + + gDebugger.DebuggerView.toggleInstrumentsPane({ visible: true, animated: false }); + + waitForSourceShown(gPanel, ".html") + .then(() => performTest()) + .then(() => closeDebuggerAndFinish(gPanel)) + .then(null, aError => { + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); + }); + }); + + function performTest() { + is(gWatch.getAllStrings().length, 0, + "There should initially be no watch expressions."); + + addAndCheckExpressions(1, 0, "a"); + addAndCheckExpressions(2, 0, "b"); + addAndCheckExpressions(3, 0, "c"); + + removeAndCheckExpression(2, 1, "a"); + removeAndCheckExpression(1, 0, "a"); + + addAndCheckExpressions(2, 0, "", true); + gEditor.focus(); + is(gWatch.getAllStrings().length, 1, + "Empty watch expressions are automatically removed."); + + addAndCheckExpressions(2, 0, "a", true); + gEditor.focus(); + is(gWatch.getAllStrings().length, 1, + "Duplicate watch expressions are automatically removed."); + + addAndCheckExpressions(2, 0, "a\t", true); + addAndCheckExpressions(2, 0, "a\r", true); + addAndCheckExpressions(2, 0, "a\n", true); + gEditor.focus(); + is(gWatch.getAllStrings().length, 1, + "Duplicate watch expressions are automatically removed."); + + addAndCheckExpressions(2, 0, "\ta", true); + addAndCheckExpressions(2, 0, "\ra", true); + addAndCheckExpressions(2, 0, "\na", true); + gEditor.focus(); + is(gWatch.getAllStrings().length, 1, + "Duplicate watch expressions are automatically removed."); + + addAndCheckCustomExpression(2, 0, "bazΩΩka"); + addAndCheckCustomExpression(3, 0, "bambøøcha"); + + EventUtils.sendMouseEvent({ type: "click" }, + gWatch.getItemAtIndex(0).attachment.view.closeNode, + gDebugger); + + is(gWatch.getAllStrings().length, 2, + "Watch expressions are removed when the close button is pressed."); + is(gWatch.getAllStrings()[0], "bazΩΩka", + "The expression at index " + 0 + " should be correct (1)."); + is(gWatch.getAllStrings()[1], "a", + "The expression at index " + 1 + " should be correct (2)."); + + EventUtils.sendMouseEvent({ type: "click" }, + gWatch.getItemAtIndex(0).attachment.view.closeNode, + gDebugger); + + is(gWatch.getAllStrings().length, 1, + "Watch expressions are removed when the close button is pressed."); + is(gWatch.getAllStrings()[0], "a", + "The expression at index " + 0 + " should be correct (3)."); + + EventUtils.sendMouseEvent({ type: "click" }, + gWatch.getItemAtIndex(0).attachment.view.closeNode, + gDebugger); + + is(gWatch.getAllStrings().length, 0, + "Watch expressions are removed when the close button is pressed."); + + EventUtils.sendMouseEvent({ type: "click" }, + gWatch.widget._parent, + gDebugger); + + is(gWatch.getAllStrings().length, 1, + "Watch expressions are added when the view container is pressed."); + } + + function addAndCheckCustomExpression(aTotal, aIndex, aString, noBlur) { + addAndCheckExpressions(aTotal, aIndex, "", true); + + for (let i = 0; i < aString.length; i++) { + EventUtils.sendChar(aString[i], gDebugger); + } + + gEditor.focus(); + + let element = gWatch.getItemAtIndex(aIndex).target; + + is(gWatch.getItemAtIndex(aIndex).attachment.initialExpression, "", + "The initial expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.initialExpression, "", + "The initial expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getItemAtIndex(aIndex).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getString(aIndex), aString, + "The expression at index " + aIndex + " should be correct (3)."); + is(gWatch.getAllStrings()[aIndex], aString, + "The expression at index " + aIndex + " should be correct (4)."); + } + + function addAndCheckExpressions(aTotal, aIndex, aString, noBlur) { + gWatch.addExpression(aString); + + is(gWatch.getAllStrings().length, aTotal, + "There should be " + aTotal + " watch expressions available (1)."); + is(gWatch.itemCount, aTotal, + "There should be " + aTotal + " watch expressions available (2)."); + + ok(gWatch.getItemAtIndex(aIndex), + "The expression at index " + aIndex + " should be available."); + is(gWatch.getItemAtIndex(aIndex).attachment.initialExpression, aString, + "The expression at index " + aIndex + " should have an initial expression."); + + let element = gWatch.getItemAtIndex(aIndex).target; + + ok(element, + "There should be a new expression item in the view."); + ok(gWatch.getItemForElement(element), + "The watch expression item should be accessible."); + is(gWatch.getItemForElement(element), gWatch.getItemAtIndex(aIndex), + "The correct watch expression item was accessed."); + + ok(gWatch.widget.getItemAtIndex(aIndex) instanceof XULElement, + "The correct watch expression element was accessed (1)."); + is(element, gWatch.widget.getItemAtIndex(aIndex), + "The correct watch expression element was accessed (2)."); + + is(gWatch.getItemForElement(element).attachment.view.arrowNode.hidden, false, + "The arrow node should be visible."); + is(gWatch.getItemForElement(element).attachment.view.closeNode.hidden, false, + "The close button should be visible."); + is(gWatch.getItemForElement(element).attachment.view.inputNode.getAttribute("focused"), "true", + "The textbox input should be focused."); + + is(gVariables.parentNode.scrollTop, 0, + "The variables view should be scrolled to top"); + + is(gWatch.items[0], gWatch.getItemAtIndex(aIndex), + "The correct watch expression was added to the cache (1)."); + is(gWatch.items[0], gWatch.getItemForElement(element), + "The correct watch expression was added to the cache (2)."); + + if (!noBlur) { + gEditor.focus(); + + is(gWatch.getItemAtIndex(aIndex).attachment.initialExpression, aString, + "The initial expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.initialExpression, aString, + "The initial expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getItemAtIndex(aIndex).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getString(aIndex), aString, + "The expression at index " + aIndex + " should be correct (3)."); + is(gWatch.getAllStrings()[aIndex], aString, + "The expression at index " + aIndex + " should be correct (4)."); + } + } + + function removeAndCheckExpression(aTotal, aIndex, aString) { + gWatch.removeAt(aIndex); + + is(gWatch.getAllStrings().length, aTotal, + "There should be " + aTotal + " watch expressions available (1)."); + is(gWatch.itemCount, aTotal, + "There should be " + aTotal + " watch expressions available (2)."); + + ok(gWatch.getItemAtIndex(aIndex), + "The expression at index " + aIndex + " should still be available."); + is(gWatch.getItemAtIndex(aIndex).attachment.initialExpression, aString, + "The expression at index " + aIndex + " should still have an initial expression."); + + let element = gWatch.getItemAtIndex(aIndex).target; + + is(gWatch.getItemAtIndex(aIndex).attachment.initialExpression, aString, + "The initial expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.initialExpression, aString, + "The initial expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getItemAtIndex(aIndex).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (1)."); + is(gWatch.getItemForElement(element).attachment.currentExpression, aString, + "The expression at index " + aIndex + " should be correct (2)."); + + is(gWatch.getString(aIndex), aString, + "The expression at index " + aIndex + " should be correct (3)."); + is(gWatch.getAllStrings()[aIndex], aString, + "The expression at index " + aIndex + " should be correct (4)."); + } +}