Bug 1368074 - Autocomplete popup is not re-opened when repeating the same search in a new tab. r=mconley
authorMarco Bonardo <mbonardo@mozilla.com>
Tue, 30 May 2017 17:28:34 +0200
changeset 361590 38d34be6d67446b9f6241cef1d7188310c28c426
parent 361589 7f4d49af53f1bd362527154076d2bcb42e928d7e
child 361591 48a6570b38cb0501ba6fef5641704c8f493ce9f2
push id43814
push usermak77@bonardo.net
push dateWed, 31 May 2017 18:51:07 +0000
treeherderautoland@38d34be6d674 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmconley
bugs1368074
milestone55.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1368074 - Autocomplete popup is not re-opened when repeating the same search in a new tab. r=mconley MozReview-Commit-ID: GSZoWFgw0X8
browser/base/content/test/urlbar/browser.ini
browser/base/content/test/urlbar/browser_new_tab_urlbar_reset.js
browser/base/content/urlbarBindings.xml
toolkit/components/autocomplete/nsAutoCompleteController.cpp
--- a/browser/base/content/test/urlbar/browser.ini
+++ b/browser/base/content/test/urlbar/browser.ini
@@ -33,16 +33,17 @@ subsuite = clipboard
 support-files =
   redirect_bug623155.sjs
 [browser_bug783614.js]
 [browser_canonizeURL.js]
 [browser_dragdropURL.js]
 [browser_locationBarCommand.js]
 [browser_locationBarExternalLoad.js]
 [browser_moz_action_link.js]
+[browser_new_tab_urlbar_reset.js]
 [browser_pasteAndGo.js]
 subsuite = clipboard
 [browser_removeUnsafeProtocolsFromURLBarPaste.js]
 subsuite = clipboard
 [browser_search_favicon.js]
 [browser_tabMatchesInAwesomebar.js]
 support-files =
   moz.png
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/browser_new_tab_urlbar_reset.js
@@ -0,0 +1,16 @@
+"use strict";
+
+/**
+ * Verify that urlbar state is reset when openig a new tab, so searching for the
+ * same text will reopen the results popup.
+ */
+add_task(async function() {
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", false);
+  await promiseAutocompleteResultPopup("m");
+  ok(gURLBar.popupOpen, "The popup is open");
+  let tab2 = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:blank", false);
+  await promiseAutocompleteResultPopup("m");
+  ok(gURLBar.popupOpen, "The popup is open");
+  await BrowserTestUtils.removeTab(tab);
+  await BrowserTestUtils.removeTab(tab2);
+});
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -117,16 +117,21 @@ file, You can obtain one at http://mozil
           pasteAndGo.setAttribute("label", label);
           pasteAndGo.setAttribute("anonid", "paste-and-go");
           pasteAndGo.setAttribute("oncommand",
               "gURLBar.select(); goDoCommand('cmd_paste'); gURLBar.handleCommand();");
           cxmenu.insertBefore(pasteAndGo, insertLocation.nextSibling);
         }
 
         this._enableOrDisableOneOffSearches();
+
+        // The autocomplete controller uses heuristic on some internal caches
+        // to handle cases like backspace, autofill or repeated searches.
+        // Ensure to clear those internal caches when switching tabs.
+        gBrowser.tabContainer.addEventListener("TabSelect", this);
       ]]></constructor>
 
       <destructor><![CDATA[
         this._prefs.removeObserver("", this);
         this._prefs = null;
         this.inputField.controllers.removeController(this._copyCutController);
         this.inputField.removeEventListener("paste", this);
         this.inputField.removeEventListener("mousedown", this);
@@ -1143,16 +1148,20 @@ file, You can obtain one at http://mozil
                 break;
               }
               this.setAttribute("textoverflow", "true");
               break;
             case "underflow":
               this.removeAttribute("textoverflow");
               this._hideURLTooltip();
               break;
+            case "TabSelect":
+              this.detachController();
+              this.attachController();
+              break;
           }
         ]]></body>
       </method>
 
       <!--
         onBeforeTextValueSet is called by the base-binding's .textValue getter.
         It should return the value that the getter should use.
       -->
--- a/toolkit/components/autocomplete/nsAutoCompleteController.cpp
+++ b/toolkit/components/autocomplete/nsAutoCompleteController.cpp
@@ -659,17 +659,17 @@ nsAutoCompleteController::HandleDelete(b
 {
   *_retval = false;
   if (!mInput)
     return NS_OK;
 
   nsCOMPtr<nsIAutoCompleteInput> input(mInput);
   bool isOpen = false;
   input->GetPopupOpen(&isOpen);
-  if (!isOpen || mRowCount <= 0) {
+  if (!isOpen || mRowCount == 0) {
     // Nothing left to delete, proceed as normal
     bool unused = false;
     HandleText(&unused);
     return NS_OK;
   }
 
   nsCOMPtr<nsIAutoCompletePopup> popup;
   input->GetPopup(getter_AddRefs(popup));
@@ -702,17 +702,18 @@ nsAutoCompleteController::HandleDelete(b
   // Unselect the current item.
   popup->SetSelectedIndex(-1);
 
   // Tell the tree that the row count changed.
   if (mTree)
     mTree->RowCountChanged(mRowCount, -1);
 
   // Adjust index, if needed.
-  if (index >= (int32_t)mRowCount)
+  MOZ_ASSERT(index >= 0); // We verified this above, after RowIndexToSearch.
+  if (static_cast<uint32_t>(index) >= mRowCount)
     index = mRowCount - 1;
 
   if (mRowCount > 0) {
     // There are still rows in the popup, select the current index again.
     popup->SetSelectedIndex(index);
 
     // Complete to the new current value.
     bool shouldComplete = false;
@@ -1974,17 +1975,17 @@ nsAutoCompleteController::GetResultValue
 }
 
 nsresult
 nsAutoCompleteController::GetResultValueLabelAt(int32_t aIndex,
                                                 bool aGetFinalValue,
                                                 bool aGetValue,
                                                 nsAString & _retval)
 {
-  NS_ENSURE_TRUE(aIndex >= 0 && (uint32_t) aIndex < mRowCount, NS_ERROR_ILLEGAL_VALUE);
+  NS_ENSURE_TRUE(aIndex >= 0 && static_cast<uint32_t>(aIndex) < mRowCount, NS_ERROR_ILLEGAL_VALUE);
 
   int32_t rowIndex;
   nsIAutoCompleteResult *result;
   nsresult rv = GetResultAt(aIndex, &result, &rowIndex);
   NS_ENSURE_SUCCESS(rv, rv);
 
   uint16_t searchResult;
   result->GetSearchResult(&searchResult);