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