Home | History | Annotate | Download | only in omnibox
      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 }
   1796