From b51f9b38aed8ef4db2c1c65183b4f02dcf6866c2 Mon Sep 17 00:00:00 2001 From: Victor Porof Date: Wed, 8 Jan 2014 10:48:32 +0200 Subject: [PATCH] Bug 885294 - Immediate script selection from debugger search box is really janky and loses selection if you don't find anything, r=past --- browser/devtools/debugger/debugger-toolbar.js | 21 +++- browser/devtools/debugger/debugger-view.js | 2 + browser/devtools/debugger/test/browser.ini | 1 + .../test/browser_dbg_search-popup-jank.js | 118 ++++++++++++++++++ browser/devtools/debugger/test/head.js | 8 +- 5 files changed, 142 insertions(+), 8 deletions(-) create mode 100644 browser/devtools/debugger/test/browser_dbg_search-popup-jank.js diff --git a/browser/devtools/debugger/debugger-toolbar.js b/browser/devtools/debugger/debugger-toolbar.js index 874da2c04946..3418ecd00e87 100644 --- a/browser/devtools/debugger/debugger-toolbar.js +++ b/browser/devtools/debugger/debugger-toolbar.js @@ -868,7 +868,6 @@ FilterView.prototype = { if (!aToken) { return; } - DebuggerView.editor.find(aToken); }, @@ -1000,6 +999,9 @@ FilterView.prototype = { } else if (targetView.hidden) { targetView.scheduleSearch(args[0], 0); } else { + if (!targetView.selectedItem) { + targetView.selectedIndex = 0; + } this.clearSearch(); } return; @@ -1023,6 +1025,9 @@ FilterView.prototype = { } else if (targetView.hidden) { targetView.scheduleSearch(args[0], 0); } else { + if (!targetView.selectedItem) { + targetView.selectedIndex = 0; + } this.clearSearch(); } return; @@ -1258,8 +1263,11 @@ FilteredSourcesView.prototype = Heritage.extend(ResultsPanelContainer.prototype, }); } - // Select the first entry in this container. - this.selectedIndex = 0; + // There's at least one item displayed in this container. Don't select it + // automatically if not forced (by tests) or in tandem with an operator. + if (this._autoSelectFirstItem || DebuggerView.Filtering.searchOperator) { + this.selectedIndex = 0; + } this.hidden = false; // Signal that file search matches were found and displayed. @@ -1459,8 +1467,11 @@ FilteredFunctionsView.prototype = Heritage.extend(ResultsPanelContainer.prototyp }); } - // Select the first entry in this container. - this.selectedIndex = 0; + // There's at least one item displayed in this container. Don't select it + // automatically if not forced (by tests). + if (this._autoSelectFirstItem) { + this.selectedIndex = 0; + } this.hidden = false; // Signal that function search matches were found and displayed. diff --git a/browser/devtools/debugger/debugger-view.js b/browser/devtools/debugger/debugger-view.js index 56e17d32cba6..72278325644b 100644 --- a/browser/devtools/debugger/debugger-view.js +++ b/browser/devtools/debugger/debugger-view.js @@ -690,6 +690,8 @@ ResultsPanelContainer.prototype = Heritage.extend(WidgetMethods, { } if (!this.widget) { this.widget = new SimpleListWidget(this._panel); + this.autoFocusOnFirstItem = false; + this.autoFocusOnSelection = false; this.maintainSelectionVisible = false; } } diff --git a/browser/devtools/debugger/test/browser.ini b/browser/devtools/debugger/test/browser.ini index e8ae0b28d1f3..80ba51134eec 100644 --- a/browser/devtools/debugger/test/browser.ini +++ b/browser/devtools/debugger/test/browser.ini @@ -175,6 +175,7 @@ support-files = [browser_dbg_search-global-04.js] [browser_dbg_search-global-05.js] [browser_dbg_search-global-06.js] +[browser_dbg_search-popup-jank.js] [browser_dbg_search-sources-01.js] [browser_dbg_search-sources-02.js] [browser_dbg_search-sources-03.js] diff --git a/browser/devtools/debugger/test/browser_dbg_search-popup-jank.js b/browser/devtools/debugger/test/browser_dbg_search-popup-jank.js new file mode 100644 index 000000000000..6a6c15043157 --- /dev/null +++ b/browser/devtools/debugger/test/browser_dbg_search-popup-jank.js @@ -0,0 +1,118 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +/** + * Tests that sources aren't selected by default when finding a match. + */ + +const TAB_URL = EXAMPLE_URL + "doc_editor-mode.html"; + +let gTab, gDebuggee, gPanel, gDebugger; +let gSearchBox; + +function test() { + initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { + gTab = aTab; + gDebuggee = aDebuggee; + gPanel = aPanel; + gDebugger = gPanel.panelWin; + gSearchBox = gDebugger.DebuggerView.Filtering._searchbox; + + gDebugger.DebuggerView.FilteredSources._autoSelectFirstItem = false; + gDebugger.DebuggerView.FilteredFunctions._autoSelectFirstItem = false; + + waitForSourceShown(gPanel, "-01.js") + .then(superGenericFileSearch) + .then(() => ensureSourceIs(aPanel, "-01.js")) + .then(() => ensureCaretAt(aPanel, 1)) + + .then(superAccurateFileSearch) + .then(() => ensureSourceIs(aPanel, "-01.js")) + .then(() => ensureCaretAt(aPanel, 1)) + .then(() => pressKeyToHide("RETURN")) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode", true)) + .then(() => ensureCaretAt(aPanel, 1)) + + .then(superGenericFileSearch) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode")) + .then(() => ensureCaretAt(aPanel, 1)) + .then(() => pressKey("UP")) + .then(() => ensureSourceIs(aPanel, "doc_editor-mode", true)) + .then(() => ensureCaretAt(aPanel, 1)) + .then(() => pressKeyToHide("RETURN")) + .then(() => ensureSourceIs(aPanel, "doc_editor-mode")) + .then(() => ensureCaretAt(aPanel, 1)) + + .then(superAccurateFileSearch) + .then(() => ensureSourceIs(aPanel, "doc_editor-mode")) + .then(() => ensureCaretAt(aPanel, 1)) + .then(() => typeText(gSearchBox, ":")) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode", true)) + .then(() => ensureCaretAt(aPanel, 1)) + .then(() => typeText(gSearchBox, "5")) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode")) + .then(() => ensureCaretAt(aPanel, 5)) + .then(() => pressKey("DOWN")) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode")) + .then(() => ensureCaretAt(aPanel, 6)) + + .then(superGenericFunctionSearch) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode")) + .then(() => ensureCaretAt(aPanel, 6)) + .then(() => pressKey("RETURN")) + .then(() => ensureSourceIs(aPanel, "code_test-editor-mode")) + .then(() => ensureCaretAt(aPanel, 4, 10)) + + .then(() => closeDebuggerAndFinish(gPanel)) + .then(null, aError => { + ok(false, "Got an error: " + aError.message + "\n" + aError.stack); + }); + }); +} + +function waitForMatchFoundAndResultsShown(aName) { + return promise.all([ + once(gDebugger, "popupshown"), + waitForDebuggerEvents(gPanel, gDebugger.EVENTS[aName]) + ]); +} + +function waitForResultsHidden() { + return once(gDebugger, "popuphidden"); +} + +function superGenericFunctionSearch() { + let finished = waitForMatchFoundAndResultsShown("FUNCTION_SEARCH_MATCH_FOUND"); + setText(gSearchBox, "@"); + return finished; +} + +function superGenericFileSearch() { + let finished = waitForMatchFoundAndResultsShown("FILE_SEARCH_MATCH_FOUND"); + setText(gSearchBox, "."); + return finished; +} + +function superAccurateFileSearch() { + let finished = waitForMatchFoundAndResultsShown("FILE_SEARCH_MATCH_FOUND"); + setText(gSearchBox, "editor"); + return finished; +} + +function pressKey(aKey) { + EventUtils.sendKey(aKey, gDebugger); +} + +function pressKeyToHide(aKey) { + let finished = waitForResultsHidden(); + EventUtils.sendKey(aKey, gDebugger); + return finished; +} + +registerCleanupFunction(function() { + gTab = null; + gDebuggee = null; + gPanel = null; + gDebugger = null; + gSearchBox = null; +}); diff --git a/browser/devtools/debugger/test/head.js b/browser/devtools/debugger/test/head.js index 0a0f78a6a0ab..d14dab5cd3f9 100644 --- a/browser/devtools/debugger/test/head.js +++ b/browser/devtools/debugger/test/head.js @@ -506,9 +506,11 @@ function initChromeDebugger(aOnClose) { function prepareDebugger(aDebugger) { if ("target" in aDebugger) { - let variables = aDebugger.panelWin.DebuggerView.Variables; - variables.lazyEmpty = false; - variables.lazySearch = false; + let view = aDebugger.panelWin.DebuggerView; + view.Variables.lazyEmpty = false; + view.Variables.lazySearch = false; + view.FilteredSources._autoSelectFirstItem = true; + view.FilteredFunctions._autoSelectFirstItem = true; } else { // Nothing to do here yet. }