1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <stdio.h>
6
7#include "base/command_line.h"
8#include "base/strings/string16.h"
9#include "base/strings/string_util.h"
10#include "base/strings/utf_string_conversions.h"
11#include "base/time/time.h"
12#include "chrome/app/chrome_command_ids.h"
13#include "chrome/browser/autocomplete/history_quick_provider.h"
14#include "chrome/browser/bookmarks/bookmark_model_factory.h"
15#include "chrome/browser/chrome_notification_types.h"
16#include "chrome/browser/history/history_service.h"
17#include "chrome/browser/history/history_service_factory.h"
18#include "chrome/browser/profiles/profile.h"
19#include "chrome/browser/search_engines/template_url_service_factory.h"
20#include "chrome/browser/ui/browser.h"
21#include "chrome/browser/ui/browser_commands.h"
22#include "chrome/browser/ui/browser_window.h"
23#include "chrome/browser/ui/location_bar/location_bar.h"
24#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
25#include "chrome/browser/ui/omnibox/omnibox_view.h"
26#include "chrome/browser/ui/tabs/tab_strip_model.h"
27#include "chrome/browser/ui/toolbar/test_toolbar_model.h"
28#include "chrome/common/chrome_paths.h"
29#include "chrome/common/chrome_switches.h"
30#include "chrome/common/url_constants.h"
31#include "chrome/test/base/in_process_browser_test.h"
32#include "chrome/test/base/interactive_test_utils.h"
33#include "chrome/test/base/ui_test_utils.h"
34#include "components/bookmarks/browser/bookmark_model.h"
35#include "components/bookmarks/browser/bookmark_utils.h"
36#include "components/bookmarks/test/bookmark_test_helpers.h"
37#include "components/omnibox/autocomplete_input.h"
38#include "components/omnibox/autocomplete_match.h"
39#include "components/search_engines/template_url.h"
40#include "components/search_engines/template_url_service.h"
41#include "content/public/browser/notification_service.h"
42#include "content/public/browser/web_contents.h"
43#include "net/dns/mock_host_resolver.h"
44#include "ui/base/clipboard/clipboard.h"
45#include "ui/base/clipboard/scoped_clipboard_writer.h"
46#include "ui/events/event_constants.h"
47#include "ui/events/keycodes/keyboard_codes.h"
48#include "ui/gfx/point.h"
49
50using base::ASCIIToUTF16;
51using base::UTF16ToUTF8;
52using base::Time;
53using base::TimeDelta;
54
55namespace {
56
57const char kSearchKeyword[] = "foo";
58const char kSearchKeyword2[] = "footest.com";
59const ui::KeyboardCode kSearchKeywordKeys[] = {
60  ui::VKEY_F, ui::VKEY_O, ui::VKEY_O, ui::VKEY_UNKNOWN
61};
62const ui::KeyboardCode kSearchKeywordPrefixKeys[] = {
63  ui::VKEY_F, ui::VKEY_O, ui::VKEY_UNKNOWN
64};
65const ui::KeyboardCode kSearchKeywordCompletionKeys[] = {
66  ui::VKEY_O, ui::VKEY_UNKNOWN
67};
68const char kSearchURL[] = "http://www.foo.com/search?q={searchTerms}";
69const char kSearchShortName[] = "foo";
70const char kSearchText[] = "abc";
71const ui::KeyboardCode kSearchTextKeys[] = {
72  ui::VKEY_A, ui::VKEY_B, ui::VKEY_C, ui::VKEY_UNKNOWN
73};
74const char kSearchTextURL[] = "http://www.foo.com/search?q=abc";
75
76const char kInlineAutocompleteText[] = "def";
77const ui::KeyboardCode kInlineAutocompleteTextKeys[] = {
78  ui::VKEY_D, ui::VKEY_E, ui::VKEY_F, ui::VKEY_UNKNOWN
79};
80
81// Hostnames that shall be blocked by host resolver.
82const char *kBlockedHostnames[] = {
83  "foo",
84  "*.foo.com",
85  "bar",
86  "*.bar.com",
87  "abc",
88  "*.abc.com",
89  "def",
90  "*.def.com",
91  "*.site.com",
92  "history",
93  "z"
94};
95
96const struct TestHistoryEntry {
97  const char* url;
98  const char* title;
99  int visit_count;
100  int typed_count;
101  bool starred;
102} kHistoryEntries[] = {
103  {"http://www.bar.com/1", "Page 1", 10, 10, false },
104  {"http://www.bar.com/2", "Page 2", 9, 9, false },
105  {"http://www.bar.com/3", "Page 3", 8, 8, false },
106  {"http://www.bar.com/4", "Page 4", 7, 7, false },
107  {"http://www.bar.com/5", "Page 5", 6, 6, false },
108  {"http://www.bar.com/6", "Page 6", 5, 5, false },
109  {"http://www.bar.com/7", "Page 7", 4, 4, false },
110  {"http://www.bar.com/8", "Page 8", 3, 3, false },
111  {"http://www.bar.com/9", "Page 9", 2, 2, false },
112  {"http://www.site.com/path/1", "Site 1", 4, 4, false },
113  {"http://www.site.com/path/2", "Site 2", 3, 3, false },
114  {"http://www.site.com/path/3", "Site 3", 2, 2, false },
115
116  // To trigger inline autocomplete.
117  {"http://www.def.com", "Page def", 10000, 10000, true },
118
119  // Used in particular for the desired TLD test.  This makes it test
120  // the interesting case when there's an intranet host with the same
121  // name as the .com.
122  {"http://bar/", "Bar", 1, 0, false },
123};
124
125// Stores the given text to clipboard.
126void SetClipboardText(const base::string16& text) {
127  ui::ScopedClipboardWriter writer(ui::CLIPBOARD_TYPE_COPY_PASTE);
128  writer.WriteText(text);
129}
130
131#if defined(OS_MACOSX)
132const int kCtrlOrCmdMask = ui::EF_COMMAND_DOWN;
133#else
134const int kCtrlOrCmdMask = ui::EF_CONTROL_DOWN;
135#endif
136
137}  // namespace
138
139class OmniboxViewTest : public InProcessBrowserTest,
140                        public content::NotificationObserver {
141 protected:
142  virtual void SetUpOnMainThread() OVERRIDE {
143    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
144    ASSERT_NO_FATAL_FAILURE(SetupComponents());
145    chrome::FocusLocationBar(browser());
146    ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
147  }
148
149  static void GetOmniboxViewForBrowser(
150      const Browser* browser,
151      OmniboxView** omnibox_view) {
152    BrowserWindow* window = browser->window();
153    ASSERT_TRUE(window);
154    LocationBar* location_bar = window->GetLocationBar();
155    ASSERT_TRUE(location_bar);
156    *omnibox_view = location_bar->GetOmniboxView();
157    ASSERT_TRUE(*omnibox_view);
158  }
159
160  void GetOmniboxView(OmniboxView** omnibox_view) {
161    GetOmniboxViewForBrowser(browser(), omnibox_view);
162  }
163
164  static void SendKeyForBrowser(const Browser* browser,
165                                ui::KeyboardCode key,
166                                int modifiers) {
167    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(
168        browser, key,
169        (modifiers & ui::EF_CONTROL_DOWN) != 0,
170        (modifiers & ui::EF_SHIFT_DOWN) != 0,
171        (modifiers & ui::EF_ALT_DOWN) != 0,
172        (modifiers & ui::EF_COMMAND_DOWN) != 0));
173  }
174
175  void SendKey(ui::KeyboardCode key, int modifiers) {
176    SendKeyForBrowser(browser(), key, modifiers);
177  }
178
179  void SendKeySequence(const ui::KeyboardCode* keys) {
180    for (; *keys != ui::VKEY_UNKNOWN; ++keys)
181      ASSERT_NO_FATAL_FAILURE(SendKey(*keys, 0));
182  }
183
184  bool SendKeyAndWait(const Browser* browser,
185                      ui::KeyboardCode key,
186                      int modifiers,
187                      int type,
188                      const content::NotificationSource& source)
189                          WARN_UNUSED_RESULT {
190    return ui_test_utils::SendKeyPressAndWait(
191        browser, key,
192        (modifiers & ui::EF_CONTROL_DOWN) != 0,
193        (modifiers & ui::EF_SHIFT_DOWN) != 0,
194        (modifiers & ui::EF_ALT_DOWN) != 0,
195        (modifiers & ui::EF_COMMAND_DOWN) != 0,
196        type, source);
197  }
198
199  void WaitForTabOpenOrCloseForBrowser(const Browser* browser,
200                                       int expected_tab_count) {
201    int tab_count = browser->tab_strip_model()->count();
202    if (tab_count == expected_tab_count)
203      return;
204
205    content::NotificationRegistrar registrar;
206    registrar.Add(this,
207        (tab_count < expected_tab_count) ?
208            static_cast<int>(chrome::NOTIFICATION_TAB_PARENTED) :
209            static_cast<int>(content::NOTIFICATION_WEB_CONTENTS_DESTROYED),
210        content::NotificationService::AllSources());
211
212    while (!HasFailure() &&
213           browser->tab_strip_model()->count() != expected_tab_count) {
214      content::RunMessageLoop();
215    }
216
217    ASSERT_EQ(expected_tab_count, browser->tab_strip_model()->count());
218  }
219
220  void WaitForTabOpenOrClose(int expected_tab_count) {
221    WaitForTabOpenOrCloseForBrowser(browser(), expected_tab_count);
222  }
223
224  void WaitForAutocompleteControllerDone() {
225    OmniboxView* omnibox_view = NULL;
226    ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
227
228    AutocompleteController* controller =
229        omnibox_view->model()->autocomplete_controller();
230    ASSERT_TRUE(controller);
231
232    if (controller->done())
233      return;
234
235    content::NotificationRegistrar registrar;
236    registrar.Add(this,
237                  chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY,
238                  content::Source<AutocompleteController>(controller));
239
240    while (!HasFailure() && !controller->done())
241      content::RunMessageLoop();
242
243    ASSERT_TRUE(controller->done());
244  }
245
246  void SetupSearchEngine() {
247    Profile* profile = browser()->profile();
248    TemplateURLService* model =
249        TemplateURLServiceFactory::GetForProfile(profile);
250    ASSERT_TRUE(model);
251
252    ui_test_utils::WaitForTemplateURLServiceToLoad(model);
253
254    ASSERT_TRUE(model->loaded());
255
256    TemplateURLData data;
257    data.short_name = ASCIIToUTF16(kSearchShortName);
258    data.SetKeyword(ASCIIToUTF16(kSearchKeyword));
259    data.SetURL(kSearchURL);
260    TemplateURL* template_url = new TemplateURL(data);
261    model->Add(template_url);
262    model->SetUserSelectedDefaultSearchProvider(template_url);
263
264    data.SetKeyword(ASCIIToUTF16(kSearchKeyword2));
265    model->Add(new TemplateURL(data));
266
267    // Remove built-in template urls, like google.com, bing.com etc., as they
268    // may appear as autocomplete suggests and interfere with our tests.
269    TemplateURLService::TemplateURLVector urls = model->GetTemplateURLs();
270    for (TemplateURLService::TemplateURLVector::const_iterator i = urls.begin();
271         i != urls.end();
272         ++i) {
273      if ((*i)->prepopulate_id() != 0)
274        model->Remove(*i);
275    }
276  }
277
278  void AddHistoryEntry(const TestHistoryEntry& entry, const Time& time) {
279    Profile* profile = browser()->profile();
280    HistoryService* history_service = HistoryServiceFactory::GetForProfile(
281        profile, Profile::EXPLICIT_ACCESS);
282    ASSERT_TRUE(history_service);
283
284    if (!history_service->BackendLoaded()) {
285      content::NotificationRegistrar registrar;
286      registrar.Add(this, chrome::NOTIFICATION_HISTORY_LOADED,
287                    content::Source<Profile>(profile));
288      content::RunMessageLoop();
289    }
290
291    BookmarkModel* bookmark_model =
292        BookmarkModelFactory::GetForProfile(profile);
293    ASSERT_TRUE(bookmark_model);
294    test::WaitForBookmarkModelToLoad(bookmark_model);
295
296    GURL url(entry.url);
297    // Add everything in order of time. We don't want to have a time that
298    // is "right now" or it will nondeterministically appear in the results.
299    history_service->AddPageWithDetails(url, base::UTF8ToUTF16(entry.title),
300                                        entry.visit_count,
301                                        entry.typed_count, time, false,
302                                        history::SOURCE_BROWSED);
303    if (entry.starred)
304      bookmarks::AddIfNotBookmarked(bookmark_model, url, base::string16());
305    // Wait at least for the AddPageWithDetails() call to finish.
306    {
307      content::NotificationRegistrar registrar;
308      registrar.Add(this, chrome::NOTIFICATION_HISTORY_URLS_MODIFIED,
309                    content::Source<Profile>(profile));
310      content::RunMessageLoop();
311      // We don't want to return until all observers have processed this
312      // notification, because some (e.g. the in-memory history database) may do
313      // something important.  Since we don't know where in the observer list we
314      // stand, just spin the message loop once more to allow the current
315      // callstack to complete.
316      content::RunAllPendingInMessageLoop();
317    }
318  }
319
320  void SetupHistory() {
321    // Add enough history pages containing |kSearchText| to trigger
322    // open history page url in autocomplete result.
323    for (size_t i = 0; i < arraysize(kHistoryEntries); i++) {
324      // Add everything in order of time. We don't want to have a time that
325      // is "right now" or it will nondeterministically appear in the results.
326      Time t = Time::Now() - TimeDelta::FromHours(i + 1);
327      ASSERT_NO_FATAL_FAILURE(AddHistoryEntry(kHistoryEntries[i], t));
328    }
329  }
330
331  void SetupHostResolver() {
332    for (size_t i = 0; i < arraysize(kBlockedHostnames); ++i)
333      host_resolver()->AddSimulatedFailure(kBlockedHostnames[i]);
334  }
335
336  void SetupComponents() {
337    ASSERT_NO_FATAL_FAILURE(SetupHostResolver());
338    ASSERT_NO_FATAL_FAILURE(SetupSearchEngine());
339    ASSERT_NO_FATAL_FAILURE(SetupHistory());
340  }
341
342  virtual void Observe(int type,
343                       const content::NotificationSource& source,
344                       const content::NotificationDetails& details) OVERRIDE {
345    switch (type) {
346      case content::NOTIFICATION_WEB_CONTENTS_DESTROYED:
347      case chrome::NOTIFICATION_TAB_PARENTED:
348      case chrome::NOTIFICATION_AUTOCOMPLETE_CONTROLLER_RESULT_READY:
349      case chrome::NOTIFICATION_HISTORY_LOADED:
350      case chrome::NOTIFICATION_HISTORY_URLS_MODIFIED:
351        break;
352      default:
353        FAIL() << "Unexpected notification type";
354    }
355    base::MessageLoop::current()->Quit();
356  }
357};
358
359// Test if ctrl-* accelerators are workable in omnibox.
360// See http://crbug.com/19193: omnibox blocks ctrl-* commands
361//
362// Flaky on interactive tests (dbg), http://crbug.com/69433
363IN_PROC_BROWSER_TEST_F(OmniboxViewTest, DISABLED_BrowserAccelerators) {
364  OmniboxView* omnibox_view = NULL;
365  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
366
367  int tab_count = browser()->tab_strip_model()->count();
368
369  // Create a new Tab.
370  chrome::NewTab(browser());
371  ASSERT_NO_FATAL_FAILURE(WaitForTabOpenOrClose(tab_count + 1));
372
373  // Select the first Tab.
374  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_1, kCtrlOrCmdMask));
375  ASSERT_EQ(0, browser()->tab_strip_model()->active_index());
376
377  chrome::FocusLocationBar(browser());
378
379  // Select the second Tab.
380  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_2, kCtrlOrCmdMask));
381  ASSERT_EQ(1, browser()->tab_strip_model()->active_index());
382
383  chrome::FocusLocationBar(browser());
384
385  // Try ctrl-w to close a Tab.
386  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_W, kCtrlOrCmdMask));
387  ASSERT_NO_FATAL_FAILURE(WaitForTabOpenOrClose(tab_count));
388
389  // Try ctrl-l to focus location bar.
390  omnibox_view->SetUserText(ASCIIToUTF16("Hello world"));
391  EXPECT_FALSE(omnibox_view->IsSelectAll());
392  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_L, kCtrlOrCmdMask));
393  EXPECT_TRUE(omnibox_view->IsSelectAll());
394
395  // Try editing the location bar text.
396  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RIGHT, 0));
397  EXPECT_FALSE(omnibox_view->IsSelectAll());
398  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_S, 0));
399  EXPECT_EQ(ASCIIToUTF16("Hello worlds"), omnibox_view->GetText());
400
401  // Try ctrl-x to cut text.
402#if defined(OS_MACOSX)
403  // Mac uses alt-left/right to select a word.
404  ASSERT_NO_FATAL_FAILURE(
405      SendKey(ui::VKEY_LEFT, ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN));
406#else
407  ASSERT_NO_FATAL_FAILURE(
408      SendKey(ui::VKEY_LEFT, ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN));
409#endif
410  EXPECT_FALSE(omnibox_view->IsSelectAll());
411  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_X, kCtrlOrCmdMask));
412  EXPECT_EQ(ASCIIToUTF16("Hello "), omnibox_view->GetText());
413
414#if !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
415  // Try alt-f4 to close the browser.
416  ASSERT_TRUE(SendKeyAndWait(
417      browser(), ui::VKEY_F4, ui::EF_ALT_DOWN,
418      chrome::NOTIFICATION_BROWSER_CLOSED,
419      content::Source<Browser>(browser())));
420#endif
421}
422
423// Flakily fails and times out on Win only.  http://crbug.com/69941
424// Fails on Linux.  http://crbug.com/408634
425#if defined(OS_WIN) || defined(OS_LINUX)
426#define MAYBE_PopupAccelerators DISABLED_PopupAccelerators
427#else
428#define MAYBE_PopupAccelerators PopupAccelerators
429#endif
430
431IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_PopupAccelerators) {
432  // Create a popup.
433  Browser* popup = CreateBrowserForPopup(browser()->profile());
434  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(popup));
435  OmniboxView* omnibox_view = NULL;
436  ASSERT_NO_FATAL_FAILURE(
437      GetOmniboxViewForBrowser(popup, &omnibox_view));
438  chrome::FocusLocationBar(popup);
439  EXPECT_TRUE(omnibox_view->IsSelectAll());
440
441#if !defined(OS_MACOSX)
442  // Try ctrl-w to close the popup.
443  // This piece of code doesn't work on Mac, because the Browser object won't
444  // be destroyed before finishing the current message loop iteration, thus
445  // No BROWSER_CLOSED notification will be sent.
446  ASSERT_TRUE(SendKeyAndWait(
447      popup, ui::VKEY_W, ui::EF_CONTROL_DOWN,
448      chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(popup)));
449
450  // Create another popup.
451  popup = CreateBrowserForPopup(browser()->profile());
452  ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(popup));
453  ASSERT_NO_FATAL_FAILURE(
454      GetOmniboxViewForBrowser(popup, &omnibox_view));
455#endif
456
457  // Set the edit text to "Hello world".
458  omnibox_view->SetUserText(ASCIIToUTF16("Hello world"));
459  chrome::FocusLocationBar(popup);
460  EXPECT_TRUE(omnibox_view->IsSelectAll());
461
462  // Try editing the location bar text -- should be disallowed.
463  ASSERT_NO_FATAL_FAILURE(SendKeyForBrowser(popup, ui::VKEY_S, 0));
464  EXPECT_EQ(ASCIIToUTF16("Hello world"), omnibox_view->GetText());
465  EXPECT_TRUE(omnibox_view->IsSelectAll());
466
467  ASSERT_NO_FATAL_FAILURE(
468      SendKeyForBrowser(popup, ui::VKEY_X, kCtrlOrCmdMask));
469  EXPECT_EQ(ASCIIToUTF16("Hello world"), omnibox_view->GetText());
470  EXPECT_TRUE(omnibox_view->IsSelectAll());
471
472#if !defined(OS_CHROMEOS) && !defined(OS_MACOSX)
473  // Try alt-f4 to close the popup.
474  ASSERT_TRUE(SendKeyAndWait(
475      popup, ui::VKEY_F4, ui::EF_ALT_DOWN,
476      chrome::NOTIFICATION_BROWSER_CLOSED, content::Source<Browser>(popup)));
477#endif
478}
479
480// http://crbug.com/133341
481#if defined(OS_LINUX)
482#define MAYBE_BackspaceInKeywordMode DISABLED_BackspaceInKeywordMode
483#else
484#define MAYBE_BackspaceInKeywordMode BackspaceInKeywordMode
485#endif
486
487IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_BackspaceInKeywordMode) {
488  OmniboxView* omnibox_view = NULL;
489  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
490
491  // Trigger keyword hint mode.
492  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
493  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
494  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
495
496  // Trigger keyword mode.
497  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
498  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
499  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
500
501  // Backspace without search text should bring back keyword hint mode.
502  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
503  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
504  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
505
506  // Trigger keyword mode again.
507  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
508  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
509  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
510
511  // Input something as search text.
512  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
513
514  // Should stay in keyword mode while deleting search text by pressing
515  // backspace.
516  for (size_t i = 0; i < arraysize(kSearchText) - 1; ++i) {
517    ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
518    ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
519    ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
520  }
521
522  // Input something as search text.
523  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
524
525  // Move cursor to the beginning of the search text.
526#if defined(OS_MACOSX)
527  // Home doesn't work on Mac trybot.
528  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_A, ui::EF_CONTROL_DOWN));
529#else
530  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_HOME, 0));
531#endif
532  // Backspace at the beginning of the search text shall turn off
533  // the keyword mode.
534  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
535  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
536  ASSERT_EQ(base::string16(), omnibox_view->model()->keyword());
537  ASSERT_EQ(std::string(kSearchKeyword) + kSearchText,
538            UTF16ToUTF8(omnibox_view->GetText()));
539}
540
541// http://crbug.com/158913
542#if defined(OS_CHROMEOS) || defined(OS_WIN)
543#define MAYBE_Escape DISABLED_Escape
544#else
545#define MAYBE_Escape Escape
546#endif
547
548IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_Escape) {
549  ui_test_utils::NavigateToURL(browser(), GURL(chrome::kChromeUIHistoryURL));
550  chrome::FocusLocationBar(browser());
551
552  OmniboxView* omnibox_view = NULL;
553  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
554
555  base::string16 old_text = omnibox_view->GetText();
556  EXPECT_FALSE(old_text.empty());
557  EXPECT_TRUE(omnibox_view->IsSelectAll());
558
559  // Delete all text in omnibox.
560  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
561  EXPECT_TRUE(omnibox_view->GetText().empty());
562
563  // Escape shall revert the text in omnibox.
564  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_ESCAPE, 0));
565  EXPECT_EQ(old_text, omnibox_view->GetText());
566  EXPECT_TRUE(omnibox_view->IsSelectAll());
567}
568#undef MAYBE_ESCAPE
569
570IN_PROC_BROWSER_TEST_F(OmniboxViewTest, DesiredTLD) {
571  OmniboxView* omnibox_view = NULL;
572  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
573  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
574  ASSERT_TRUE(popup_model);
575
576  // Test ctrl-Enter.
577  const ui::KeyboardCode kKeys[] = {
578    ui::VKEY_B, ui::VKEY_A, ui::VKEY_R, ui::VKEY_UNKNOWN
579  };
580  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kKeys));
581  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
582  ASSERT_TRUE(popup_model->IsOpen());
583  // ctrl-Enter triggers desired_tld feature, thus www.bar.com shall be
584  // opened.
585  ASSERT_TRUE(SendKeyAndWait(browser(), ui::VKEY_RETURN, ui::EF_CONTROL_DOWN,
586      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
587      content::Source<content::NavigationController>(
588          &browser()->tab_strip_model()->GetActiveWebContents()->
589              GetController())));
590
591  GURL url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
592  EXPECT_EQ("www.bar.com", url.host());
593  EXPECT_EQ("/", url.path());
594}
595
596IN_PROC_BROWSER_TEST_F(OmniboxViewTest, DesiredTLDWithTemporaryText) {
597  OmniboxView* omnibox_view = NULL;
598  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
599  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
600  ASSERT_TRUE(popup_model);
601
602  Profile* profile = browser()->profile();
603  TemplateURLService* template_url_service =
604      TemplateURLServiceFactory::GetForProfile(profile);
605
606  // Add a non-substituting keyword. This ensures the popup will have a
607  // non-verbatim entry with "ab" as a prefix. This way, by arrowing down, we
608  // can set "abc" as temporary text in the omnibox.
609  TemplateURLData data;
610  data.short_name = ASCIIToUTF16("abc");
611  data.SetKeyword(ASCIIToUTF16(kSearchText));
612  data.SetURL("http://abc.com/");
613  template_url_service->Add(new TemplateURL(data));
614
615  // Send "ab", so that an "abc" entry appears in the popup.
616  const ui::KeyboardCode kSearchTextPrefixKeys[] = {
617    ui::VKEY_A, ui::VKEY_B, ui::VKEY_UNKNOWN
618  };
619  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextPrefixKeys));
620  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
621  ASSERT_TRUE(popup_model->IsOpen());
622
623  // Arrow down to the "abc" entry in the popup.
624  size_t size = popup_model->result().size();
625  while (popup_model->selected_line() < size - 1) {
626    ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_DOWN, 0));
627    if (omnibox_view->GetText() == ASCIIToUTF16("abc"))
628      break;
629  }
630  ASSERT_EQ(ASCIIToUTF16("abc"), omnibox_view->GetText());
631
632  // Hitting ctrl-enter should navigate based on the current text rather than
633  // the original input, i.e. to www.abc.com instead of www.ab.com.
634  ASSERT_TRUE(SendKeyAndWait(
635      browser(), ui::VKEY_RETURN, ui::EF_CONTROL_DOWN,
636      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
637      content::Source<content::NavigationController>(
638          &browser()->tab_strip_model()->GetActiveWebContents()->
639              GetController())));
640
641  GURL url(browser()->tab_strip_model()->GetActiveWebContents()->GetURL());
642  EXPECT_EQ("www.abc.com", url.host());
643  EXPECT_EQ("/", url.path());
644}
645
646IN_PROC_BROWSER_TEST_F(OmniboxViewTest, AltEnter) {
647  OmniboxView* omnibox_view = NULL;
648  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
649
650  omnibox_view->SetUserText(ASCIIToUTF16(chrome::kChromeUIHistoryURL));
651  int tab_count = browser()->tab_strip_model()->count();
652  // alt-Enter opens a new tab.
653  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_RETURN, ui::EF_ALT_DOWN));
654  ASSERT_NO_FATAL_FAILURE(WaitForTabOpenOrClose(tab_count + 1));
655}
656
657// http://crbug.com/133354, http://crbug.com/146953
658IN_PROC_BROWSER_TEST_F(OmniboxViewTest, DISABLED_EnterToSearch) {
659  OmniboxView* omnibox_view = NULL;
660  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
661  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
662  ASSERT_TRUE(popup_model);
663
664  // Test Enter to search.
665  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
666  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
667  ASSERT_TRUE(popup_model->IsOpen());
668
669  // Check if the default match result is Search Primary Provider.
670  ASSERT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
671            popup_model->result().default_match()->type);
672
673  // Open the default match.
674  ASSERT_TRUE(SendKeyAndWait(browser(), ui::VKEY_RETURN, 0,
675      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
676      content::Source<content::NavigationController>(
677          &browser()->tab_strip_model()->GetActiveWebContents()->
678              GetController())));
679  GURL url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
680  EXPECT_EQ(kSearchTextURL, url.spec());
681
682  // Test that entering a single character then Enter performs a search.
683  const ui::KeyboardCode kSearchSingleCharKeys[] = {
684    ui::VKEY_Z, ui::VKEY_UNKNOWN
685  };
686  chrome::FocusLocationBar(browser());
687  EXPECT_TRUE(omnibox_view->IsSelectAll());
688  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchSingleCharKeys));
689  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
690  ASSERT_TRUE(popup_model->IsOpen());
691  EXPECT_EQ("z", UTF16ToUTF8(omnibox_view->GetText()));
692
693  // Check if the default match result is Search Primary Provider.
694  ASSERT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
695            popup_model->result().default_match()->type);
696
697  // Open the default match.
698  ASSERT_TRUE(SendKeyAndWait(browser(), ui::VKEY_RETURN, 0,
699      content::NOTIFICATION_NAV_ENTRY_COMMITTED,
700      content::Source<content::NavigationController>(
701          &browser()->tab_strip_model()->GetActiveWebContents()->
702              GetController())));
703  url = browser()->tab_strip_model()->GetActiveWebContents()->GetURL();
704  EXPECT_EQ("http://www.foo.com/search?q=z", url.spec());
705}
706
707IN_PROC_BROWSER_TEST_F(OmniboxViewTest, EscapeToDefaultMatch) {
708  OmniboxView* omnibox_view = NULL;
709  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
710  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
711  ASSERT_TRUE(popup_model);
712
713  // Input something to trigger inline autocomplete.
714  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kInlineAutocompleteTextKeys));
715  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
716  ASSERT_TRUE(popup_model->IsOpen());
717
718  base::string16 old_text = omnibox_view->GetText();
719
720  // Make sure inline autocomplete is triggerred.
721  EXPECT_GT(old_text.length(), arraysize(kInlineAutocompleteText) - 1);
722
723  size_t old_selected_line = popup_model->selected_line();
724  EXPECT_EQ(0U, old_selected_line);
725
726  // Move to another line with different text.
727  size_t size = popup_model->result().size();
728  while (popup_model->selected_line() < size - 1) {
729    ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_DOWN, 0));
730    ASSERT_NE(old_selected_line, popup_model->selected_line());
731    if (old_text != omnibox_view->GetText())
732      break;
733  }
734
735  EXPECT_NE(old_text, omnibox_view->GetText());
736
737  // Escape shall revert back to the default match item.
738  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_ESCAPE, 0));
739  EXPECT_EQ(old_text, omnibox_view->GetText());
740  EXPECT_EQ(old_selected_line, popup_model->selected_line());
741}
742
743// Flaky on Windows: http://crbug.com/146619
744#if defined(OS_WIN)
745#define MAYBE_BasicTextOperations DISABLED_BasicTextOperations
746#else
747#define MAYBE_BasicTextOperations BasicTextOperations
748#endif
749
750IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_BasicTextOperations) {
751  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
752  chrome::FocusLocationBar(browser());
753
754  OmniboxView* omnibox_view = NULL;
755  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
756
757  base::string16 old_text = omnibox_view->GetText();
758  EXPECT_EQ(base::UTF8ToUTF16(url::kAboutBlankURL), old_text);
759  EXPECT_TRUE(omnibox_view->IsSelectAll());
760
761  size_t start, end;
762  omnibox_view->GetSelectionBounds(&start, &end);
763#if defined(OS_WIN) || defined(OS_LINUX)
764  // Views textfields select-all in reverse to show the leading text.
765  std::swap(start, end);
766#endif
767  EXPECT_EQ(0U, start);
768  EXPECT_EQ(old_text.size(), end);
769
770  // Move the cursor to the end.
771#if defined(OS_MACOSX)
772  // End doesn't work on Mac trybot.
773  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_E, ui::EF_CONTROL_DOWN));
774#else
775  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_END, 0));
776#endif
777  EXPECT_FALSE(omnibox_view->IsSelectAll());
778
779  // Make sure the cursor is placed correctly.
780  omnibox_view->GetSelectionBounds(&start, &end);
781  EXPECT_EQ(old_text.size(), start);
782  EXPECT_EQ(old_text.size(), end);
783
784  // Insert one character at the end. Make sure we won't insert
785  // anything after the special ZWS mark used in gtk implementation.
786  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_A, 0));
787  EXPECT_EQ(old_text + base::char16('a'), omnibox_view->GetText());
788
789  // Delete one character from the end. Make sure we won't delete the special
790  // ZWS mark used in gtk implementation.
791  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
792  EXPECT_EQ(old_text, omnibox_view->GetText());
793
794  omnibox_view->SelectAll(true);
795  EXPECT_TRUE(omnibox_view->IsSelectAll());
796  omnibox_view->GetSelectionBounds(&start, &end);
797#if defined(OS_WIN) || defined(OS_LINUX)
798  // Views textfields select-all in reverse to show the leading text.
799  std::swap(start, end);
800#endif
801  EXPECT_EQ(0U, start);
802  EXPECT_EQ(old_text.size(), end);
803
804  // Delete the content
805  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_DELETE, 0));
806  EXPECT_TRUE(omnibox_view->IsSelectAll());
807  omnibox_view->GetSelectionBounds(&start, &end);
808  EXPECT_EQ(0U, start);
809  EXPECT_EQ(0U, end);
810  EXPECT_TRUE(omnibox_view->GetText().empty());
811
812  // Check if RevertAll() can set text and cursor correctly.
813  omnibox_view->RevertAll();
814  EXPECT_FALSE(omnibox_view->IsSelectAll());
815  EXPECT_EQ(old_text, omnibox_view->GetText());
816  omnibox_view->GetSelectionBounds(&start, &end);
817  EXPECT_EQ(old_text.size(), start);
818  EXPECT_EQ(old_text.size(), end);
819}
820
821IN_PROC_BROWSER_TEST_F(OmniboxViewTest, AcceptKeywordBySpace) {
822  OmniboxView* omnibox_view = NULL;
823  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
824
825  base::string16 search_keyword(ASCIIToUTF16(kSearchKeyword));
826
827  // Trigger keyword hint mode.
828  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
829  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
830  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
831  ASSERT_EQ(search_keyword, omnibox_view->GetText());
832
833  // Trigger keyword mode by space.
834  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
835  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
836  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
837  ASSERT_TRUE(omnibox_view->GetText().empty());
838
839  // Revert to keyword hint mode.
840  omnibox_view->model()->ClearKeyword(base::string16());
841  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
842  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
843  ASSERT_EQ(search_keyword, omnibox_view->GetText());
844
845  // Keyword should also be accepted by typing an ideographic space.
846  omnibox_view->OnBeforePossibleChange();
847  omnibox_view->SetWindowTextAndCaretPos(search_keyword +
848      base::WideToUTF16(L"\x3000"), search_keyword.length() + 1, false, false);
849  omnibox_view->OnAfterPossibleChange();
850  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
851  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
852  ASSERT_TRUE(omnibox_view->GetText().empty());
853
854  // Revert to keyword hint mode.
855  omnibox_view->model()->ClearKeyword(base::string16());
856  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
857  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
858  ASSERT_EQ(search_keyword, omnibox_view->GetText());
859
860  // Keyword shouldn't be accepted by pressing space with a trailing
861  // whitespace.
862  omnibox_view->SetWindowTextAndCaretPos(search_keyword + base::char16(' '),
863      search_keyword.length() + 1, false, false);
864  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
865  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
866  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
867  ASSERT_EQ(search_keyword + ASCIIToUTF16("  "), omnibox_view->GetText());
868
869  // Keyword shouldn't be accepted by deleting the trailing space.
870  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
871  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
872  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
873  ASSERT_EQ(search_keyword + base::char16(' '), omnibox_view->GetText());
874
875  // Keyword shouldn't be accepted by pressing space before a trailing space.
876  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
877  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
878  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
879  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
880  ASSERT_EQ(search_keyword + ASCIIToUTF16("  "), omnibox_view->GetText());
881
882  // Keyword should be accepted by pressing space in the middle of context and
883  // just after the keyword.
884  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
885  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_A, 0));
886  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
887  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
888  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
889  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
890  ASSERT_EQ(ASCIIToUTF16("a "), omnibox_view->GetText());
891  size_t start, end;
892  omnibox_view->GetSelectionBounds(&start, &end);
893  EXPECT_EQ(0U, start);
894  EXPECT_EQ(0U, end);
895
896  // Keyword shouldn't be accepted by pasting "foo bar".
897  omnibox_view->SetUserText(base::string16());
898  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
899  ASSERT_TRUE(omnibox_view->model()->keyword().empty());
900
901  omnibox_view->OnBeforePossibleChange();
902  omnibox_view->model()->OnPaste();
903  omnibox_view->SetWindowTextAndCaretPos(search_keyword +
904      ASCIIToUTF16(" bar"), search_keyword.length() + 4, false, false);
905  omnibox_view->OnAfterPossibleChange();
906  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
907  ASSERT_TRUE(omnibox_view->model()->keyword().empty());
908  ASSERT_EQ(search_keyword + ASCIIToUTF16(" bar"), omnibox_view->GetText());
909
910  // Keyword shouldn't be accepted for case like: "foo b|ar" -> "foo b |ar".
911  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
912  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
913  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
914  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
915  ASSERT_TRUE(omnibox_view->model()->keyword().empty());
916  ASSERT_EQ(search_keyword + ASCIIToUTF16(" b ar"), omnibox_view->GetText());
917
918  // Keyword could be accepted by pressing space with a selected range at the
919  // end of text.
920  omnibox_view->OnBeforePossibleChange();
921  omnibox_view->OnInlineAutocompleteTextMaybeChanged(
922      search_keyword + ASCIIToUTF16("  "), search_keyword.length());
923  omnibox_view->OnAfterPossibleChange();
924  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
925  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
926  ASSERT_EQ(search_keyword + ASCIIToUTF16("  "), omnibox_view->GetText());
927
928  omnibox_view->GetSelectionBounds(&start, &end);
929  ASSERT_NE(start, end);
930  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
931  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
932  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
933  ASSERT_EQ(base::string16(), omnibox_view->GetText());
934
935  // Space should accept keyword even when inline autocomplete is available.
936  omnibox_view->SetUserText(base::string16());
937  const TestHistoryEntry kHistoryFoobar = {
938    "http://www.foobar.com", "Page foobar", 100, 100, true
939  };
940
941  // Add a history entry to trigger inline autocomplete when typing "foo".
942  ASSERT_NO_FATAL_FAILURE(
943      AddHistoryEntry(kHistoryFoobar, Time::Now() - TimeDelta::FromHours(1)));
944
945  // Type "fo" to trigger inline autocomplete.
946  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordPrefixKeys));
947  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
948  ASSERT_TRUE(omnibox_view->model()->popup_model()->IsOpen());
949  ASSERT_NE(search_keyword, omnibox_view->GetText());
950
951  // Keyword hint shouldn't be visible.
952  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
953  ASSERT_TRUE(omnibox_view->model()->keyword().empty());
954
955  // Add the "o".  Inline autocompletion should still happen, but now we
956  // should also get a keyword hint because we've typed a keyword exactly.
957  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordCompletionKeys));
958  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
959  ASSERT_TRUE(omnibox_view->model()->popup_model()->IsOpen());
960  ASSERT_NE(search_keyword, omnibox_view->GetText());
961  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
962  ASSERT_FALSE(omnibox_view->model()->keyword().empty());
963
964  // Trigger keyword mode by space.
965  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
966  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
967  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
968  ASSERT_TRUE(omnibox_view->GetText().empty());
969
970  // Space in the middle of a temporary text, which separates the text into
971  // keyword and replacement portions, should trigger keyword mode.
972  omnibox_view->SetUserText(base::string16());
973  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
974  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
975  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
976  ASSERT_TRUE(popup_model->IsOpen());
977  ASSERT_EQ(ASCIIToUTF16("foobar.com"), omnibox_view->GetText());
978  omnibox_view->model()->OnUpOrDownKeyPressed(1);
979  omnibox_view->model()->OnUpOrDownKeyPressed(-1);
980  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
981  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
982  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
983  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
984  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
985  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
986  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, 0));
987  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
988  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
989  ASSERT_EQ(search_keyword, omnibox_view->model()->keyword());
990  ASSERT_EQ(ASCIIToUTF16("bar.com"), omnibox_view->GetText());
991
992  // Space after temporary text that looks like a keyword, when the original
993  // input does not look like a keyword, should trigger keyword mode.
994  omnibox_view->SetUserText(base::string16());
995  const TestHistoryEntry kHistoryFoo = {
996    "http://footest.com", "Page footest", 1000, 1000, true
997  };
998
999  // Add a history entry to trigger HQP matching with text == keyword when
1000  // typing "fo te".
1001  ASSERT_NO_FATAL_FAILURE(
1002      AddHistoryEntry(kHistoryFoo, Time::Now() - TimeDelta::FromMinutes(10)));
1003
1004  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_F, 0));
1005  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_O, 0));
1006  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
1007  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_T, 0));
1008  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_E, 0));
1009  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1010  ASSERT_TRUE(popup_model->IsOpen());
1011  base::string16 search_keyword2(ASCIIToUTF16(kSearchKeyword2));
1012  while ((omnibox_view->GetText() != search_keyword2) &&
1013         (popup_model->selected_line() < popup_model->result().size() - 1))
1014    omnibox_view->model()->OnUpOrDownKeyPressed(1);
1015  ASSERT_EQ(search_keyword2, omnibox_view->GetText());
1016  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_SPACE, 0));
1017  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1018  ASSERT_EQ(search_keyword2, omnibox_view->model()->keyword());
1019  ASSERT_TRUE(omnibox_view->GetText().empty());
1020}
1021
1022IN_PROC_BROWSER_TEST_F(OmniboxViewTest, NonSubstitutingKeywordTest) {
1023  OmniboxView* omnibox_view = NULL;
1024  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1025  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1026  ASSERT_TRUE(popup_model);
1027
1028  Profile* profile = browser()->profile();
1029  TemplateURLService* template_url_service =
1030      TemplateURLServiceFactory::GetForProfile(profile);
1031
1032  // Add a non-default substituting keyword.
1033  TemplateURLData data;
1034  data.short_name = ASCIIToUTF16("Search abc");
1035  data.SetKeyword(ASCIIToUTF16(kSearchText));
1036  data.SetURL("http://abc.com/{searchTerms}");
1037  TemplateURL* template_url = new TemplateURL(data);
1038  template_url_service->Add(template_url);
1039
1040  omnibox_view->SetUserText(base::string16());
1041
1042  // Non-default substituting keyword shouldn't be matched by default.
1043  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
1044  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1045  ASSERT_TRUE(popup_model->IsOpen());
1046
1047  // Check if the default match result is Search Primary Provider.
1048  ASSERT_EQ(AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED,
1049            popup_model->result().default_match()->type);
1050  ASSERT_EQ(kSearchTextURL,
1051            popup_model->result().default_match()->destination_url.spec());
1052
1053  omnibox_view->SetUserText(base::string16());
1054  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1055  ASSERT_FALSE(popup_model->IsOpen());
1056
1057  // Try a non-substituting keyword.
1058  template_url_service->Remove(template_url);
1059  data.short_name = ASCIIToUTF16("abc");
1060  data.SetURL("http://abc.com/");
1061  template_url_service->Add(new TemplateURL(data));
1062
1063  // We always allow exact matches for non-substituting keywords.
1064  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
1065  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1066  ASSERT_TRUE(popup_model->IsOpen());
1067  ASSERT_EQ(AutocompleteMatchType::HISTORY_KEYWORD,
1068            popup_model->result().default_match()->type);
1069  ASSERT_EQ("http://abc.com/",
1070            popup_model->result().default_match()->destination_url.spec());
1071}
1072
1073IN_PROC_BROWSER_TEST_F(OmniboxViewTest, DeleteItem) {
1074  // Disable the search provider, to make sure the popup contains only history
1075  // items.
1076  TemplateURLService* model =
1077      TemplateURLServiceFactory::GetForProfile(browser()->profile());
1078  model->SetUserSelectedDefaultSearchProvider(NULL);
1079
1080  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
1081  chrome::FocusLocationBar(browser());
1082
1083  OmniboxView* omnibox_view = NULL;
1084  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1085
1086  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1087  ASSERT_TRUE(popup_model);
1088
1089  base::string16 old_text = omnibox_view->GetText();
1090
1091  // Input something that can match history items.
1092  omnibox_view->SetUserText(ASCIIToUTF16("site.com/p"));
1093  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1094  ASSERT_TRUE(popup_model->IsOpen());
1095
1096  // Delete the inline autocomplete part.
1097  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_DELETE, 0));
1098  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1099  ASSERT_TRUE(popup_model->IsOpen());
1100  ASSERT_GE(popup_model->result().size(), 3U);
1101
1102  base::string16 user_text = omnibox_view->GetText();
1103  ASSERT_EQ(ASCIIToUTF16("site.com/p"), user_text);
1104  omnibox_view->SelectAll(true);
1105  ASSERT_TRUE(omnibox_view->IsSelectAll());
1106
1107  // Move down.
1108  size_t default_line = popup_model->selected_line();
1109  omnibox_view->model()->OnUpOrDownKeyPressed(1);
1110  ASSERT_EQ(default_line + 1, popup_model->selected_line());
1111  base::string16 selected_text =
1112      popup_model->result().match_at(default_line + 1).fill_into_edit;
1113  // Temporary text is shown.
1114  ASSERT_EQ(selected_text, omnibox_view->GetText());
1115  ASSERT_FALSE(omnibox_view->IsSelectAll());
1116
1117  // Delete the item.
1118  popup_model->TryDeletingCurrentItem();
1119  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1120  // The selected line shouldn't be changed, because we have more than two
1121  // items.
1122  ASSERT_EQ(default_line + 1, popup_model->selected_line());
1123  // Make sure the item is really deleted.
1124  ASSERT_NE(selected_text,
1125            popup_model->result().match_at(default_line + 1).fill_into_edit);
1126  selected_text =
1127      popup_model->result().match_at(default_line + 1).fill_into_edit;
1128  // New temporary text is shown.
1129  ASSERT_EQ(selected_text, omnibox_view->GetText());
1130
1131  // Revert to the default match.
1132  ASSERT_TRUE(omnibox_view->model()->OnEscapeKeyPressed());
1133  ASSERT_EQ(default_line, popup_model->selected_line());
1134  ASSERT_EQ(user_text, omnibox_view->GetText());
1135  ASSERT_TRUE(omnibox_view->IsSelectAll());
1136
1137  // Move down and up to select the default match as temporary text.
1138  omnibox_view->model()->OnUpOrDownKeyPressed(1);
1139  ASSERT_EQ(default_line + 1, popup_model->selected_line());
1140  omnibox_view->model()->OnUpOrDownKeyPressed(-1);
1141  ASSERT_EQ(default_line, popup_model->selected_line());
1142
1143  selected_text = popup_model->result().match_at(default_line).fill_into_edit;
1144  // New temporary text is shown.
1145  ASSERT_EQ(selected_text, omnibox_view->GetText());
1146  ASSERT_FALSE(omnibox_view->IsSelectAll());
1147
1148#if 0
1149  // TODO(mrossetti): http://crbug.com/82335
1150  // Delete the default item.
1151  popup_model->TryDeletingCurrentItem();
1152  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1153  // The selected line shouldn't be changed, but the default item should have
1154  // been changed.
1155  ASSERT_EQ(default_line, popup_model->selected_line());
1156  // Make sure the item is really deleted.
1157  EXPECT_NE(selected_text,
1158            popup_model->result().match_at(default_line).fill_into_edit);
1159  selected_text =
1160      popup_model->result().match_at(default_line).fill_into_edit;
1161  // New temporary text is shown.
1162  ASSERT_EQ(selected_text, omnibox_view->GetText());
1163#endif
1164
1165  // As the current selected item is the new default item, pressing Escape key
1166  // should revert all directly.
1167  ASSERT_TRUE(omnibox_view->model()->OnEscapeKeyPressed());
1168  ASSERT_EQ(old_text, omnibox_view->GetText());
1169  ASSERT_TRUE(omnibox_view->IsSelectAll());
1170}
1171
1172// http://crbug.com/133344
1173#if defined(OS_LINUX)
1174#define MAYBE_TabAcceptKeyword DISABLED_TabAcceptKeyword
1175#else
1176#define MAYBE_TabAcceptKeyword TabAcceptKeyword
1177#endif
1178
1179IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_TabAcceptKeyword) {
1180  OmniboxView* omnibox_view = NULL;
1181  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1182
1183  base::string16 text = ASCIIToUTF16(kSearchKeyword);
1184
1185  // Trigger keyword hint mode.
1186  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
1187  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
1188  ASSERT_EQ(text, omnibox_view->model()->keyword());
1189  ASSERT_EQ(text, omnibox_view->GetText());
1190
1191  // Trigger keyword mode by tab.
1192  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1193  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1194  ASSERT_EQ(text, omnibox_view->model()->keyword());
1195  ASSERT_TRUE(omnibox_view->GetText().empty());
1196
1197  // Revert to keyword hint mode.
1198  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1199  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
1200  ASSERT_EQ(text, omnibox_view->model()->keyword());
1201  ASSERT_EQ(text, omnibox_view->GetText());
1202
1203  // The location bar should still have focus.
1204  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1205
1206  // Trigger keyword mode by tab.
1207  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1208  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1209  ASSERT_EQ(text, omnibox_view->model()->keyword());
1210  ASSERT_TRUE(omnibox_view->GetText().empty());
1211
1212  // Revert to keyword hint mode with SHIFT+TAB.
1213#if defined(OS_MACOSX)
1214  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACKTAB, 0));
1215#else
1216  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN));
1217#endif
1218  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
1219  ASSERT_EQ(text, omnibox_view->model()->keyword());
1220  ASSERT_EQ(text, omnibox_view->GetText());
1221  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1222}
1223
1224#if !defined(OS_MACOSX)
1225// Mac intentionally does not support this behavior.
1226
1227// http://crbug.com/133360
1228#if defined(OS_LINUX)
1229#define MAYBE_TabTraverseResultsTest DISABLED_TabTraverseResultsTest
1230#else
1231#define MAYBE_TabTraverseResultsTest TabTraverseResultsTest
1232#endif
1233
1234IN_PROC_BROWSER_TEST_F(OmniboxViewTest, MAYBE_TabTraverseResultsTest) {
1235  OmniboxView* omnibox_view = NULL;
1236  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1237  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1238  ASSERT_TRUE(popup_model);
1239
1240  // Input something to trigger results.
1241  const ui::KeyboardCode kKeys[] = {
1242    ui::VKEY_B, ui::VKEY_A, ui::VKEY_R, ui::VKEY_UNKNOWN
1243  };
1244  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kKeys));
1245  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1246  ASSERT_TRUE(popup_model->IsOpen());
1247
1248  size_t old_selected_line = popup_model->selected_line();
1249  EXPECT_EQ(0U, old_selected_line);
1250
1251  // Move down the results.
1252  for (size_t size = popup_model->result().size();
1253       popup_model->selected_line() < size - 1;
1254       old_selected_line = popup_model->selected_line()) {
1255    ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1256    ASSERT_LT(old_selected_line, popup_model->selected_line());
1257  }
1258
1259  // Don't move past the end.
1260  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1261  ASSERT_EQ(old_selected_line, popup_model->selected_line());
1262  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1263
1264  // Move back up the results.
1265  for (; popup_model->selected_line() > 0U;
1266       old_selected_line = popup_model->selected_line()) {
1267    ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN));
1268    ASSERT_GT(old_selected_line, popup_model->selected_line());
1269  }
1270
1271  // Don't move past the beginning.
1272  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN));
1273  ASSERT_EQ(0U, popup_model->selected_line());
1274  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1275
1276  const TestHistoryEntry kHistoryFoo = {
1277    "http://foo/", "Page foo", 1, 1, false
1278  };
1279
1280  // Add a history entry so "foo" gets multiple matches.
1281  ASSERT_NO_FATAL_FAILURE(
1282      AddHistoryEntry(kHistoryFoo, Time::Now() - TimeDelta::FromHours(1)));
1283
1284  // Load results.
1285  ASSERT_NO_FATAL_FAILURE(omnibox_view->SelectAll(false));
1286  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
1287  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1288
1289  // Trigger keyword mode by tab.
1290  base::string16 text = ASCIIToUTF16(kSearchKeyword);
1291  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1292  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1293  ASSERT_EQ(text, omnibox_view->model()->keyword());
1294  ASSERT_TRUE(omnibox_view->GetText().empty());
1295
1296  // The location bar should still have focus.
1297  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1298
1299  // Pressing tab again should move to the next result and clear keyword
1300  // mode.
1301  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1302  ASSERT_EQ(1U, omnibox_view->model()->popup_model()->selected_line());
1303  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1304  ASSERT_NE(text, omnibox_view->model()->keyword());
1305
1306  // The location bar should still have focus.
1307  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1308
1309  // Moving back up should not show keyword mode.
1310  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN));
1311  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
1312  ASSERT_EQ(text, omnibox_view->model()->keyword());
1313
1314  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1315}
1316#endif
1317
1318
1319// http://crbug.com/133347
1320#if defined(OS_LINUX)
1321#define MAYBE_PersistKeywordModeOnTabSwitch DISABLED_PersistKeywordModeOnTabSwitch
1322#else
1323#define MAYBE_PersistKeywordModeOnTabSwitch PersistKeywordModeOnTabSwitch
1324#endif
1325
1326IN_PROC_BROWSER_TEST_F(OmniboxViewTest,
1327                       MAYBE_PersistKeywordModeOnTabSwitch) {
1328  OmniboxView* omnibox_view = NULL;
1329  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1330
1331  // Trigger keyword hint mode.
1332  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchKeywordKeys));
1333  ASSERT_TRUE(omnibox_view->model()->is_keyword_hint());
1334  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
1335
1336  // Trigger keyword mode.
1337  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_TAB, 0));
1338  ASSERT_FALSE(omnibox_view->model()->is_keyword_hint());
1339  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
1340
1341  // Input something as search text.
1342  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kSearchTextKeys));
1343
1344  // Create a new tab.
1345  chrome::NewTab(browser());
1346
1347  // Switch back to the first tab.
1348  browser()->tab_strip_model()->ActivateTabAt(0, true);
1349
1350  // Make sure we're still in keyword mode.
1351  ASSERT_EQ(kSearchKeyword, UTF16ToUTF8(omnibox_view->model()->keyword()));
1352}
1353
1354// http://crbug.com/133355
1355#if defined(OS_LINUX)
1356#define MAYBE_CtrlKeyPressedWithInlineAutocompleteTest DISABLED_CtrlKeyPressedWithInlineAutocompleteTest
1357#else
1358#define MAYBE_CtrlKeyPressedWithInlineAutocompleteTest CtrlKeyPressedWithInlineAutocompleteTest
1359#endif
1360
1361IN_PROC_BROWSER_TEST_F(OmniboxViewTest,
1362                       MAYBE_CtrlKeyPressedWithInlineAutocompleteTest) {
1363  OmniboxView* omnibox_view = NULL;
1364  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1365  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1366  ASSERT_TRUE(popup_model);
1367
1368  // Input something to trigger inline autocomplete.
1369  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kInlineAutocompleteTextKeys));
1370  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1371  ASSERT_TRUE(popup_model->IsOpen());
1372
1373  base::string16 old_text = omnibox_view->GetText();
1374
1375  // Make sure inline autocomplete is triggerred.
1376  EXPECT_GT(old_text.length(), arraysize(kInlineAutocompleteText) - 1);
1377
1378  // Press ctrl key.
1379  omnibox_view->model()->OnControlKeyChanged(true);
1380
1381  // Inline autocomplete should still be there.
1382  EXPECT_EQ(old_text, omnibox_view->GetText());
1383}
1384
1385#if defined(TOOLKIT_VIEWS)
1386IN_PROC_BROWSER_TEST_F(OmniboxViewTest, UndoRedo) {
1387  ui_test_utils::NavigateToURL(browser(), GURL(url::kAboutBlankURL));
1388  chrome::FocusLocationBar(browser());
1389
1390  OmniboxView* omnibox_view = NULL;
1391  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1392
1393  base::string16 old_text = omnibox_view->GetText();
1394  EXPECT_EQ(base::UTF8ToUTF16(url::kAboutBlankURL), old_text);
1395  EXPECT_TRUE(omnibox_view->IsSelectAll());
1396
1397  // Delete the text, then undo.
1398  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1399  EXPECT_TRUE(omnibox_view->GetText().empty());
1400  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN));
1401  EXPECT_EQ(old_text, omnibox_view->GetText());
1402
1403  // Redo should delete the text again.
1404  ASSERT_NO_FATAL_FAILURE(
1405      SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN));
1406  EXPECT_TRUE(omnibox_view->GetText().empty());
1407
1408  // Looks like the undo manager doesn't support restoring selection.
1409  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN));
1410  EXPECT_FALSE(omnibox_view->IsSelectAll());
1411
1412  // The cursor should be at the end.
1413  size_t start, end;
1414  omnibox_view->GetSelectionBounds(&start, &end);
1415  EXPECT_EQ(old_text.size(), start);
1416  EXPECT_EQ(old_text.size(), end);
1417
1418  // Delete three characters; "about:bl" should not trigger inline autocomplete.
1419  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1420  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1421  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1422  EXPECT_EQ(old_text.substr(0, old_text.size() - 3), omnibox_view->GetText());
1423
1424  // Undo delete.
1425  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN));
1426  EXPECT_EQ(old_text, omnibox_view->GetText());
1427
1428  // Redo delete.
1429  ASSERT_NO_FATAL_FAILURE(
1430      SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN));
1431  EXPECT_EQ(old_text.substr(0, old_text.size() - 3), omnibox_view->GetText());
1432
1433  // Delete everything.
1434  omnibox_view->SelectAll(true);
1435  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1436  EXPECT_TRUE(omnibox_view->GetText().empty());
1437
1438  // Undo delete everything.
1439  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN));
1440  EXPECT_EQ(old_text.substr(0, old_text.size() - 3), omnibox_view->GetText());
1441
1442  // Undo delete two characters.
1443  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_Z, ui::EF_CONTROL_DOWN));
1444  EXPECT_EQ(old_text, omnibox_view->GetText());
1445}
1446
1447IN_PROC_BROWSER_TEST_F(OmniboxViewTest, BackspaceDeleteHalfWidthKatakana) {
1448  OmniboxView* omnibox_view = NULL;
1449  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1450  // Insert text: ダ
1451  omnibox_view->SetUserText(base::UTF8ToUTF16("\357\276\200\357\276\236"));
1452
1453  // Move the cursor to the end.
1454  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_END, 0));
1455
1456  // Backspace should delete one character.
1457  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_BACK, 0));
1458  EXPECT_EQ(base::UTF8ToUTF16("\357\276\200"), omnibox_view->GetText());
1459}
1460#endif  // defined(TOOLKIT_VIEWS)
1461
1462// Flaky test. crbug.com/356850
1463IN_PROC_BROWSER_TEST_F(OmniboxViewTest,
1464                       DISABLED_DoesNotUpdateAutocompleteOnBlur) {
1465  OmniboxView* omnibox_view = NULL;
1466  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1467  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1468  ASSERT_TRUE(popup_model);
1469
1470  // Input something to trigger inline autocomplete.
1471  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kInlineAutocompleteTextKeys));
1472  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1473  ASSERT_TRUE(popup_model->IsOpen());
1474  size_t start, end;
1475  omnibox_view->GetSelectionBounds(&start, &end);
1476  EXPECT_TRUE(start != end);
1477  base::string16 old_autocomplete_text =
1478      omnibox_view->model()->autocomplete_controller()->input_.text();
1479
1480  // Unfocus the omnibox. This should clear the text field selection and
1481  // close the popup, but should not run autocomplete.
1482  // Note: GTK preserves the selection when the omnibox is unfocused.
1483  ui_test_utils::ClickOnView(browser(), VIEW_ID_TAB_CONTAINER);
1484  ASSERT_FALSE(popup_model->IsOpen());
1485  omnibox_view->GetSelectionBounds(&start, &end);
1486  EXPECT_TRUE(start == end);
1487
1488  EXPECT_EQ(old_autocomplete_text,
1489      omnibox_view->model()->autocomplete_controller()->input_.text());
1490}
1491
1492IN_PROC_BROWSER_TEST_F(OmniboxViewTest, Paste) {
1493  OmniboxView* omnibox_view = NULL;
1494  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1495  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1496  ASSERT_TRUE(popup_model);
1497  EXPECT_FALSE(popup_model->IsOpen());
1498
1499  // Paste should yield the expected text and open the popup.
1500  SetClipboardText(ASCIIToUTF16(kSearchText));
1501  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_V, kCtrlOrCmdMask));
1502  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1503  EXPECT_EQ(ASCIIToUTF16(kSearchText), omnibox_view->GetText());
1504  EXPECT_TRUE(popup_model->IsOpen());
1505
1506  // Close the popup and select all.
1507  omnibox_view->CloseOmniboxPopup();
1508  omnibox_view->SelectAll(false);
1509  EXPECT_FALSE(popup_model->IsOpen());
1510
1511  // Pasting the same text again over itself should re-open the popup.
1512  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_V, kCtrlOrCmdMask));
1513  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1514  EXPECT_EQ(ASCIIToUTF16(kSearchText), omnibox_view->GetText());
1515  EXPECT_TRUE(popup_model->IsOpen());
1516  omnibox_view->CloseOmniboxPopup();
1517  EXPECT_FALSE(popup_model->IsOpen());
1518
1519  // Pasting amid text should yield the expected text and re-open the popup.
1520  omnibox_view->SetWindowTextAndCaretPos(ASCIIToUTF16("abcd"), 2, false, false);
1521  SetClipboardText(ASCIIToUTF16("123"));
1522  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_V, kCtrlOrCmdMask));
1523  EXPECT_EQ(ASCIIToUTF16("ab123cd"), omnibox_view->GetText());
1524  EXPECT_TRUE(popup_model->IsOpen());
1525
1526  // Ctrl/Cmd+Alt+V should not paste.
1527  ASSERT_NO_FATAL_FAILURE(
1528      SendKey(ui::VKEY_V, kCtrlOrCmdMask | ui::EF_ALT_DOWN));
1529  EXPECT_EQ(ASCIIToUTF16("ab123cd"), omnibox_view->GetText());
1530  // TODO(msw): Test that AltGr+V does not paste.
1531}
1532
1533IN_PROC_BROWSER_TEST_F(OmniboxViewTest, CopyURLToClipboard) {
1534  // Set permanent text thus making sure that omnibox treats 'google.com'
1535  // as URL (not as ordinary user input).
1536  TestToolbarModel* test_toolbar_model = new TestToolbarModel;
1537  scoped_ptr<ToolbarModel> toolbar_model(test_toolbar_model);
1538  test_toolbar_model->set_text(ASCIIToUTF16("http://www.google.com/"));
1539  browser()->swap_toolbar_models(&toolbar_model);
1540  OmniboxView* omnibox_view = NULL;
1541  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1542  OmniboxEditModel* edit_model = omnibox_view->model();
1543  ASSERT_NE(static_cast<OmniboxEditModel*>(NULL), edit_model);
1544  edit_model->UpdatePermanentText();
1545
1546  const char* target_url = "http://www.google.com/calendar";
1547  omnibox_view->SetUserText(ASCIIToUTF16(target_url));
1548
1549  // Location bar must have focus.
1550  chrome::FocusLocationBar(browser());
1551  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1552
1553  // Select full URL and copy it to clipboard. General text and html should
1554  // be available.
1555  omnibox_view->SelectAll(true);
1556  EXPECT_TRUE(omnibox_view->IsSelectAll());
1557  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
1558  clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
1559  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_COPY));
1560  EXPECT_EQ(ASCIIToUTF16(target_url), omnibox_view->GetText());
1561  EXPECT_TRUE(clipboard->IsFormatAvailable(
1562      ui::Clipboard::GetPlainTextFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1563
1564  // Make sure HTML format isn't written. See
1565  // BookmarkNodeData::WriteToClipboard() for details.
1566  EXPECT_FALSE(clipboard->IsFormatAvailable(
1567      ui::Clipboard::GetHtmlFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1568
1569  // These platforms should read bookmark format.
1570#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_MACOSX)
1571  base::string16 title;
1572  std::string url;
1573  clipboard->ReadBookmark(&title, &url);
1574  EXPECT_EQ(target_url, url);
1575  EXPECT_EQ(ASCIIToUTF16(target_url), title);
1576#endif
1577}
1578
1579IN_PROC_BROWSER_TEST_F(OmniboxViewTest, CutURLToClipboard) {
1580  // Set permanent text thus making sure that omnibox treats 'google.com'
1581  // as URL (not as ordinary user input).
1582  TestToolbarModel* test_toolbar_model = new TestToolbarModel;
1583  scoped_ptr<ToolbarModel> toolbar_model(test_toolbar_model);
1584  test_toolbar_model->set_text(ASCIIToUTF16("http://www.google.com/"));
1585  browser()->swap_toolbar_models(&toolbar_model);
1586  OmniboxView* omnibox_view = NULL;
1587  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1588  OmniboxEditModel* edit_model = omnibox_view->model();
1589  ASSERT_NE(static_cast<OmniboxEditModel*>(NULL), edit_model);
1590  edit_model->UpdatePermanentText();
1591
1592  const char* target_url = "http://www.google.com/calendar";
1593  omnibox_view->SetUserText(ASCIIToUTF16(target_url));
1594
1595  // Location bar must have focus.
1596  chrome::FocusLocationBar(browser());
1597  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1598
1599  // Select full URL and cut it. General text and html should be available
1600  // in the clipboard.
1601  omnibox_view->SelectAll(true);
1602  EXPECT_TRUE(omnibox_view->IsSelectAll());
1603  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
1604  clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
1605  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_CUT));
1606  EXPECT_EQ(base::string16(), omnibox_view->GetText());
1607  EXPECT_TRUE(clipboard->IsFormatAvailable(
1608      ui::Clipboard::GetPlainTextFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1609
1610  // Make sure HTML format isn't written. See
1611  // BookmarkNodeData::WriteToClipboard() for details.
1612  EXPECT_FALSE(clipboard->IsFormatAvailable(
1613      ui::Clipboard::GetHtmlFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1614
1615  // These platforms should read bookmark format.
1616#if defined(OS_WIN) || defined(OS_CHROMEOS) || defined(OS_MACOSX)
1617  base::string16 title;
1618  std::string url;
1619  clipboard->ReadBookmark(&title, &url);
1620  EXPECT_EQ(target_url, url);
1621  EXPECT_EQ(ASCIIToUTF16(target_url), title);
1622#endif
1623}
1624
1625IN_PROC_BROWSER_TEST_F(OmniboxViewTest, CopyTextToClipboard) {
1626  OmniboxView* omnibox_view = NULL;
1627  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1628  const char* target_text = "foo";
1629  omnibox_view->SetUserText(ASCIIToUTF16(target_text));
1630
1631  // Location bar must have focus.
1632  chrome::FocusLocationBar(browser());
1633  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1634
1635  // Select full text and copy it to the clipboard.
1636  omnibox_view->SelectAll(true);
1637  EXPECT_TRUE(omnibox_view->IsSelectAll());
1638  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
1639  clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
1640  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_COPY));
1641  EXPECT_TRUE(clipboard->IsFormatAvailable(
1642      ui::Clipboard::GetPlainTextFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1643  EXPECT_FALSE(clipboard->IsFormatAvailable(
1644      ui::Clipboard::GetHtmlFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1645  EXPECT_EQ(ASCIIToUTF16(target_text), omnibox_view->GetText());
1646}
1647
1648IN_PROC_BROWSER_TEST_F(OmniboxViewTest, CutTextToClipboard) {
1649  OmniboxView* omnibox_view = NULL;
1650  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1651  const char* target_text = "foo";
1652  omnibox_view->SetUserText(ASCIIToUTF16(target_text));
1653
1654  // Location bar must have focus.
1655  chrome::FocusLocationBar(browser());
1656  ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1657
1658  // Select full text and cut it to the clipboard.
1659  omnibox_view->SelectAll(true);
1660  EXPECT_TRUE(omnibox_view->IsSelectAll());
1661  ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
1662  clipboard->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
1663  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_CUT));
1664  EXPECT_TRUE(clipboard->IsFormatAvailable(
1665      ui::Clipboard::GetPlainTextFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1666  EXPECT_FALSE(clipboard->IsFormatAvailable(
1667      ui::Clipboard::GetHtmlFormatType(), ui::CLIPBOARD_TYPE_COPY_PASTE));
1668  EXPECT_EQ(base::string16(), omnibox_view->GetText());
1669}
1670
1671IN_PROC_BROWSER_TEST_F(OmniboxViewTest, EditSearchEngines) {
1672  // Disable settings-in-a-window to simplify test.
1673  base::CommandLine::ForCurrentProcess()->AppendSwitch(
1674      ::switches::kDisableSettingsWindow);
1675  OmniboxView* omnibox_view = NULL;
1676  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1677  EXPECT_TRUE(chrome::ExecuteCommand(browser(), IDC_EDIT_SEARCH_ENGINES));
1678  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1679  const std::string target_url =
1680      std::string(chrome::kChromeUISettingsURL) + chrome::kSearchEnginesSubPage;
1681  EXPECT_EQ(ASCIIToUTF16(target_url), omnibox_view->GetText());
1682  EXPECT_FALSE(omnibox_view->model()->popup_model()->IsOpen());
1683}
1684
1685IN_PROC_BROWSER_TEST_F(OmniboxViewTest, BeginningShownAfterBlur) {
1686  OmniboxView* omnibox_view = NULL;
1687  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1688
1689  omnibox_view->OnBeforePossibleChange();
1690  omnibox_view->SetWindowTextAndCaretPos(ASCIIToUTF16("data:text/plain,test"),
1691      5U, false, false);
1692  omnibox_view->OnAfterPossibleChange();
1693  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1694  size_t start, end;
1695  omnibox_view->GetSelectionBounds(&start, &end);
1696  EXPECT_EQ(5U, start);
1697  EXPECT_EQ(5U, end);
1698
1699  ui_test_utils::FocusView(browser(), VIEW_ID_TAB_CONTAINER);
1700  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1701
1702  omnibox_view->GetSelectionBounds(&start, &end);
1703  EXPECT_EQ(0U, start);
1704  EXPECT_EQ(0U, end);
1705}
1706
1707IN_PROC_BROWSER_TEST_F(OmniboxViewTest, CtrlArrowAfterArrowSuggestions) {
1708  OmniboxView* omnibox_view = NULL;
1709  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1710  OmniboxPopupModel* popup_model = omnibox_view->model()->popup_model();
1711  ASSERT_TRUE(popup_model);
1712
1713  // Input something to trigger results.
1714  const ui::KeyboardCode kKeys[] = {
1715    ui::VKEY_B, ui::VKEY_A, ui::VKEY_R, ui::VKEY_UNKNOWN
1716  };
1717  ASSERT_NO_FATAL_FAILURE(SendKeySequence(kKeys));
1718  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1719  ASSERT_TRUE(popup_model->IsOpen());
1720
1721  ASSERT_EQ(ASCIIToUTF16("bar.com/1"), omnibox_view->GetText());
1722
1723  // Arrow down on a suggestion, and omnibox text should be the suggestion.
1724  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_DOWN, 0));
1725  ASSERT_NO_FATAL_FAILURE(WaitForAutocompleteControllerDone());
1726  ASSERT_EQ(ASCIIToUTF16("www.bar.com/2"), omnibox_view->GetText());
1727
1728  // Highlight the last 2 words and the omnibox text should not change.
1729  // Simulating Ctrl-shift-left only once does not seem to highlight anything
1730  // on Linux.
1731#if defined(OS_MACOSX)
1732  // Mac uses alt-left/right to select a word.
1733  const int modifiers = ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN;
1734#else
1735  const int modifiers = ui::EF_SHIFT_DOWN | ui::EF_CONTROL_DOWN;
1736#endif
1737  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, modifiers));
1738  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_LEFT, modifiers));
1739  ASSERT_EQ(ASCIIToUTF16("www.bar.com/2"), omnibox_view->GetText());
1740}
1741
1742IN_PROC_BROWSER_TEST_F(OmniboxViewTest,
1743                       PersistSearchReplacementAcrossTabSwitch) {
1744  EXPECT_TRUE(browser()->toolbar_model()->url_replacement_enabled());
1745  browser()->toolbar_model()->set_url_replacement_enabled(false);
1746
1747  // Create a new tab.
1748  chrome::NewTab(browser());
1749  EXPECT_TRUE(browser()->toolbar_model()->url_replacement_enabled());
1750
1751  // Switch back to the first tab.
1752  browser()->tab_strip_model()->ActivateTabAt(0, true);
1753  EXPECT_FALSE(browser()->toolbar_model()->url_replacement_enabled());
1754}
1755
1756IN_PROC_BROWSER_TEST_F(OmniboxViewTest,
1757                       DontUpdateURLWhileSearchTermReplacementIsDisabled) {
1758  OmniboxView* omnibox_view = NULL;
1759  ASSERT_NO_FATAL_FAILURE(GetOmniboxView(&omnibox_view));
1760  TestToolbarModel* test_toolbar_model = new TestToolbarModel;
1761  scoped_ptr<ToolbarModel> toolbar_model(test_toolbar_model);
1762  browser()->swap_toolbar_models(&toolbar_model);
1763
1764  base::string16 url_a(ASCIIToUTF16("http://www.a.com/"));
1765  base::string16 url_b(ASCIIToUTF16("http://www.b.com/"));
1766  base::string16 url_c(ASCIIToUTF16("http://www.c.com/"));
1767  chrome::FocusLocationBar(browser());
1768  test_toolbar_model->set_text(url_a);
1769  omnibox_view->Update();
1770  EXPECT_EQ(url_a, omnibox_view->GetText());
1771
1772  // Disable URL replacement and update.  Because the omnibox has focus, the
1773  // visible text shouldn't change; see comments in
1774  // OmniboxEditModel::UpdatePermanentText().
1775  browser()->toolbar_model()->set_url_replacement_enabled(false);
1776  test_toolbar_model->set_text(url_b);
1777  omnibox_view->Update();
1778  EXPECT_EQ(url_a, omnibox_view->GetText());
1779
1780  // Re-enable URL replacement and ensure updating changes the text.
1781  browser()->toolbar_model()->set_url_replacement_enabled(true);
1782  // We have to change the toolbar model text here, or Update() will do nothing.
1783  // This is because the previous update already updated the permanent text.
1784  test_toolbar_model->set_text(url_c);
1785  omnibox_view->Update();
1786  EXPECT_EQ(url_c, omnibox_view->GetText());
1787
1788  // The same test, but using RevertAll() to reset search term replacement.
1789  test_toolbar_model->set_text(url_a);
1790  omnibox_view->Update();
1791  EXPECT_EQ(url_a, omnibox_view->GetText());
1792  browser()->toolbar_model()->set_url_replacement_enabled(false);
1793  test_toolbar_model->set_text(url_b);
1794  omnibox_view->Update();
1795  EXPECT_EQ(url_a, omnibox_view->GetText());
1796  omnibox_view->RevertAll();
1797  EXPECT_EQ(url_b, omnibox_view->GetText());
1798  test_toolbar_model->set_text(url_c);
1799  omnibox_view->Update();
1800  EXPECT_EQ(url_c, omnibox_view->GetText());
1801}
1802
1803IN_PROC_BROWSER_TEST_F(OmniboxViewTest, EscDisablesSearchTermReplacement) {
1804  browser()->toolbar_model()->set_url_replacement_enabled(true);
1805  chrome::FocusLocationBar(browser());
1806  ASSERT_NO_FATAL_FAILURE(SendKey(ui::VKEY_ESCAPE, 0));
1807  EXPECT_FALSE(browser()->toolbar_model()->url_replacement_enabled());
1808}
1809