1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/format_macros.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h"
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h"
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_edit_view.h"
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete_popup_model.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h"
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/tabs/tab_strip_model.h"
154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/ui/browser.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/browser_window.h"
1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/omnibox/location_bar.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/ui_test_utils.h"
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h"
22ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Autocomplete test is flaky on ChromeOS.
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// http://crbug.com/52928
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_CHROMEOS)
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_Autocomplete FLAKY_Autocomplete
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#else
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#define MAYBE_Autocomplete Autocomplete
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenstring16 AutocompleteResultAsString(const AutocompleteResult& result) {
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::string output(base::StringPrintf("{%" PRIuS "} ", result.size()));
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (size_t i = 0; i < result.size(); ++i) {
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AutocompleteMatch match = result.match_at(i);
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string provider_name = match.provider->name();
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    output.append(base::StringPrintf("[\"%s\" by \"%s\"] ",
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     UTF16ToUTF8(match.contents).c_str(),
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     provider_name.c_str()));
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return UTF8ToUTF16(output);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteBrowserTest : public InProcessBrowserTest {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LocationBar* GetLocationBar() const {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return browser()->window()->GetLocationBar();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteController* GetAutocompleteController() const {
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return GetLocationBar()->location_entry()->model()->popup_model()->
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        autocomplete_controller();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
62513209b27ff55e2841eac0e4120199c23acce758Ben MurdochIN_PROC_BROWSER_TEST_F(AutocompleteBrowserTest, Basic) {
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LocationBar* location_bar = GetLocationBar();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(location_bar->GetInputString().empty());
6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(phajdan.jr): check state of IsSelectAll when it's consistent across
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // platforms.
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_bar->FocusLocation(true);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(location_bar->GetInputString().empty());
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(location_bar->location_entry()->IsSelectAll());
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  location_bar->location_entry()->SetUserText(ASCIIToUTF16("chrome"));
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(location_bar->GetInputString().empty());
8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(ASCIIToUTF16("chrome"), location_bar->location_entry()->GetText());
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(location_bar->location_entry()->IsSelectAll());
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_bar->location_entry()->RevertAll();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
8621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(location_bar->GetInputString().empty());
8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(location_bar->location_entry()->IsSelectAll());
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  location_bar->location_entry()->SetUserText(ASCIIToUTF16("chrome"));
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  location_bar->Revert();
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  EXPECT_TRUE(location_bar->GetInputString().empty());
9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(location_bar->location_entry()->IsSelectAll());
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1003345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(AutocompleteBrowserTest, MAYBE_Autocomplete) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The results depend on the history backend being loaded. Make sure it is
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // loaded so that the autocomplete results are consistent.
103731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ui_test_utils::WaitForHistoryToLoad(browser());
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LocationBar* location_bar = GetLocationBar();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteController* autocomplete_controller = GetAutocompleteController();
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    autocomplete_controller->Start(
110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        ASCIIToUTF16("chrome"), string16(), true, false, true,
111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen        AutocompleteInput::SYNCHRONOUS_MATCHES);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(autocomplete_controller->done());
11421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
11521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->location_entry()->GetText().empty());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(location_bar->location_entry()->IsSelectAll());
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const AutocompleteResult& result = autocomplete_controller->result();
118ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // We get two matches because we have a provider for extension apps and the
119ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Chrome Web Store is a built-in Extension app. For this test, we only care
120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // about the other match existing.
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ASSERT_GE(result.size(), 1U) << AutocompleteResultAsString(result);
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    AutocompleteMatch match = result.match_at(0);
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(AutocompleteMatch::SEARCH_WHAT_YOU_TYPED, match.type);
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(match.deletable);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  {
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    location_bar->Revert();
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              location_bar->location_entry()->GetText());
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_FALSE(location_bar->location_entry()->IsSelectAll());
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const AutocompleteResult& result = autocomplete_controller->result();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_TRUE(result.empty()) << AutocompleteResultAsString(result);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochIN_PROC_BROWSER_TEST_F(AutocompleteBrowserTest, TabAwayRevertSelect) {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // http://code.google.com/p/chromium/issues/detail?id=38385
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure that tabbing away from an empty omnibar causes a revert
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and select all.
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  LocationBar* location_bar = GetLocationBar();
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  location_bar->location_entry()->SetUserText(string16());
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  browser()->AddSelectedTabWithURL(GURL(chrome::kAboutBlankURL),
148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                   PageTransition::START_PAGE);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ui_test_utils::WaitForNavigation(
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &browser()->GetSelectedTabContents()->controller());
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  browser()->CloseTab();
15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch            location_bar->location_entry()->GetText());
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(location_bar->location_entry()->IsSelectAll());
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
1583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1593345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickIN_PROC_BROWSER_TEST_F(AutocompleteBrowserTest, FocusSearch) {
1603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  LocationBar* location_bar = GetLocationBar();
1613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Focus search when omnibox is blank
1633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
16421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(UTF8ToUTF16(chrome::kAboutBlankURL),
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick              location_bar->location_entry()->GetText());
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->FocusSearch();
16921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?"), location_bar->location_entry()->GetText());
1713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t selection_start, selection_end;
1733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->location_entry()->GetSelectionBounds(&selection_start,
1743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                       &selection_end);
1753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_start);
1763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_end);
1773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Focus search when omnibox is _not_ alread in forced query mode.
1803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    location_bar->location_entry()->SetUserText(ASCIIToUTF16("foo"));
18221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("foo"), location_bar->location_entry()->GetText());
1843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->FocusSearch();
18621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?"), location_bar->location_entry()->GetText());
1883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t selection_start, selection_end;
1903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->location_entry()->GetSelectionBounds(&selection_start,
1913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                       &selection_end);
1923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_start);
1933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_end);
1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
1953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
1963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Focus search when omnibox _is_ already in forced query mode, but no query
1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // has been typed.
1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    location_bar->location_entry()->SetUserText(ASCIIToUTF16("?"));
20021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?"), location_bar->location_entry()->GetText());
2023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->FocusSearch();
20421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?"), location_bar->location_entry()->GetText());
2063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t selection_start, selection_end;
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->location_entry()->GetSelectionBounds(&selection_start,
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                       &selection_end);
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_start);
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, selection_end);
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Focus search when omnibox _is_ already in forced query mode, and some query
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // has been typed.
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    location_bar->location_entry()->SetUserText(ASCIIToUTF16("?foo"));
21821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?foo"), location_bar->location_entry()->GetText());
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->FocusSearch();
22221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("?foo"), location_bar->location_entry()->GetText());
2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t selection_start, selection_end;
2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->location_entry()->GetSelectionBounds(&selection_start,
2273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                       &selection_end);
2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(1U, std::min(selection_start, selection_end));
2293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(4U, std::max(selection_start, selection_end));
2303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Focus search when omnibox is in forced query mode with leading whitespace.
2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  {
23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    location_bar->location_entry()->SetUserText(ASCIIToUTF16("   ?foo"));
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("   ?foo"),
23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              location_bar->location_entry()->GetText());
2383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->FocusSearch();
24021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen    EXPECT_TRUE(location_bar->GetInputString().empty());
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    EXPECT_EQ(ASCIIToUTF16("   ?foo"),
24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen              location_bar->location_entry()->GetText());
2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    size_t selection_start, selection_end;
2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    location_bar->location_entry()->GetSelectionBounds(&selection_start,
2463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                                       &selection_end);
2473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(4U, std::min(selection_start, selection_end));
2483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    EXPECT_EQ(7U, std::max(selection_start, selection_end));
2493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
2503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
251