omnibox_view_views_browsertest.cc revision 0de6073388f4e2780db8536178b129cd8f6ab386
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// Use of this source code is governed by a BSD-style license that can be
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// found in the LICENSE file.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "chrome/browser/ui/views/omnibox/omnibox_view_views.h"
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "chrome/browser/ui/browser.h"
8ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com#include "chrome/browser/ui/browser_commands.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "chrome/browser/ui/browser_window.h"
10d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org#include "chrome/browser/ui/omnibox/location_bar.h"
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "chrome/browser/ui/omnibox/omnibox_popup_model.h"
12c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com#include "chrome/browser/ui/view_ids.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "chrome/browser/ui/views/frame/browser_view.h"
14f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com#include "chrome/browser/ui/views/location_bar/location_bar_view.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "chrome/test/base/in_process_browser_test.h"
160456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com#include "chrome/test/base/interactive_test_utils.h"
170456e0b7b85060e9b9597ce414c4c2b19aff4f58robertphillips@google.com#include "grit/generated_resources.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/aura/test/event_generator.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/aura/window.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/aura/window_tree_host.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/base/clipboard/clipboard.h"
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/base/clipboard/scoped_clipboard_writer.h"
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/base/test/ui_controls.h"
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "ui/events/event_processor.h"
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
262b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.comclass OmniboxViewViewsTest : public InProcessBrowserTest {
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com protected:
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxViewViewsTest() {}
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  static void GetOmniboxViewForBrowser(const Browser* browser,
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                       OmniboxView** omnibox_view) {
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    BrowserWindow* window = browser->window();
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(window);
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    LocationBar* location_bar = window->GetLocationBar();
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(location_bar);
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *omnibox_view = location_bar->GetOmniboxView();
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(*omnibox_view);
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Move the mouse to the center of the browser window and left-click.
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void ClickBrowserWindowCenter() {
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        BrowserView::GetBrowserViewForBrowser(
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            browser())->GetBoundsInScreen().CenterPoint()));
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(ui_controls::LEFT,
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                                   ui_controls::DOWN));
4754924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com    ASSERT_TRUE(
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        ui_test_utils::SendMouseEventsSync(ui_controls::LEFT, ui_controls::UP));
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
512b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com  // Press and release the mouse at the specified locations.  If
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // |release_offset| differs from |press_offset|, the mouse will be moved
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // between the press and release.
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void Click(ui_controls::MouseButton button,
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com             const gfx::Point& press_location,
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com             const gfx::Point& release_location) {
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(press_location));
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(button, ui_controls::DOWN));
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (press_location != release_location)
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(release_location));
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(button, ui_controls::UP));
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Tap the center of the browser window.
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void TapBrowserWindowCenter() {
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gfx::Point center = BrowserView::GetBrowserViewForBrowser(
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        browser())->GetBoundsInScreen().CenterPoint();
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    aura::test::EventGenerator generator(browser()->window()->
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        GetNativeWindow()->GetRootWindow());
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    generator.GestureTapAt(center);
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Touch down and release at the specified locations.
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void Tap(const gfx::Point& press_location,
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com           const gfx::Point& release_location) {
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ui::EventProcessor* dispatcher =
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        browser()->window()->GetNativeWindow()->GetHost()->event_processor();
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ui::TouchEvent press(ui::ET_TOUCH_PRESSED, press_location,
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         5, base::TimeDelta::FromMilliseconds(0));
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&press);
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_FALSE(details.dispatcher_destroyed);
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ui::TouchEvent release(ui::ET_TOUCH_RELEASED, release_location,
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                           5, base::TimeDelta::FromMilliseconds(50));
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    details = dispatcher->OnEventFromSource(&release);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_FALSE(details.dispatcher_destroyed);
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com private:
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // InProcessBrowserTest:
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  virtual void SetUpOnMainThread() OVERRIDE {
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser()));
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    chrome::FocusLocationBar(browser());
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  DISALLOW_COPY_AND_ASSIGN(OmniboxViewViewsTest);
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, PasteAndGoDoesNotLeavePopupOpen) {
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxView* view = NULL;
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &view));
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxViewViews* omnibox_view_views = static_cast<OmniboxViewViews*>(view);
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Put an URL on the clipboard.
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  {
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ui::ScopedClipboardWriter clipboard_writer(
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        ui::Clipboard::GetForCurrentThread(), ui::CLIPBOARD_TYPE_COPY_PASTE);
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    clipboard_writer.WriteURL(base::ASCIIToUTF16("http://www.example.com/"));
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1140c00f21fee3f5cfa3aa7e5d46ff94cb8cf340451tomhudson@google.com  // Paste and go.
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view_views->ExecuteCommand(IDS_PASTE_AND_GO, ui::EF_NONE);
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // The popup should not be open.
1187c2f27d788fff9dbf66a6d52753e47f786a313c0reed@google.com  EXPECT_FALSE(view->model()->popup_model()->IsOpen());
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnClick) {
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxView* omnibox_view = NULL;
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view));
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view->SetUserText(base::ASCIIToUTF16("http://www.google.com/"));
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Take the focus away from the omnibox.
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter());
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Clicking in the omnibox should take focus and select all text.
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const gfx::Rect omnibox_bounds = BrowserView::GetBrowserViewForBrowser(
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        browser())->GetViewByID(VIEW_ID_OMNIBOX)->GetBoundsInScreen();
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const gfx::Point click_location = omnibox_bounds.CenterPoint();
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT,
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                click_location, click_location));
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(omnibox_view->IsSelectAll());
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Clicking in another view should clear focus and the selection.
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter());
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Clicking in the omnibox again should take focus and select all text again.
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT,
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                click_location, click_location));
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(omnibox_view->IsSelectAll());
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Clicking another omnibox spot should keep focus but clear the selection.
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view->SelectAll(false);
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const gfx::Point click2_location = omnibox_bounds.origin() +
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      gfx::Vector2d(omnibox_bounds.width() / 4, omnibox_bounds.height() / 4);
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT,
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                click2_location, click2_location));
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Take the focus away and click in the omnibox again, but drag a bit before
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // releasing.  We should focus the omnibox but not select all of its text.
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter());
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT,
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                click_location, click2_location));
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Middle-clicking should not be handled by the omnibox.
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter());
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Click(ui_controls::MIDDLE,
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                click_location, click_location));
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnTap) {
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxView* omnibox_view = NULL;
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view));
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view->SetUserText(base::ASCIIToUTF16("http://www.google.com/"));
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Take the focus away from the omnibox.
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter());
1838d430185e08d2067584837a76b7193b803fee7a0tomhudson@google.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Tapping in the omnibox should take focus and select all text.
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const gfx::Rect omnibox_bounds = BrowserView::GetBrowserViewForBrowser(
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      browser())->GetViewByID(VIEW_ID_OMNIBOX)->GetBoundsInScreen();
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  const gfx::Point tap_location = omnibox_bounds.CenterPoint();
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap_location));
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(omnibox_view->IsSelectAll());
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Tapping in another view should clear focus and the selection.
195d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter());
19691f319c5dc4493384f0a52aaeef3dcc311ef6ed0rileya@google.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
197f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Tapping in the omnibox again should take focus and select all text again.
200d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap_location));
201d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
202d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  EXPECT_TRUE(omnibox_view->IsSelectAll());
203d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org
20403c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com  // Tapping another omnibox spot should keep focus and selection.
20503c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com  omnibox_view->SelectAll(false);
20603c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com  const gfx::Point tap2_location = omnibox_bounds.origin() +
20703c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com      gfx::Vector2d(omnibox_bounds.width() / 4, omnibox_bounds.height() / 4);
20803c1c359b336ad20d23ab07004cdafafd14c90a5rileya@google.com  ASSERT_NO_FATAL_FAILURE(Tap(tap2_location, tap2_location));
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // We don't test if the all text is selected because it depends on whether or
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // not there was text under the tap, which appears to be flaky.
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Take the focus away and tap in the omnibox again, but drag a bit before
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // releasing.  We should focus the omnibox but not select all of its text.
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter());
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap2_location));
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
219f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com}
220f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
221f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.comIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnTabToFocus) {
222f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  OmniboxView* omnibox_view = NULL;
223f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view));
224f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  ui_test_utils::NavigateToURL(browser(), GURL("http://www.google.com/"));
225f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  // RevertAll after navigation to invalidate the selection range saved on blur.
226f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  omnibox_view->RevertAll();
227f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
228f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  EXPECT_FALSE(omnibox_view->IsSelectAll());
229f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
2302be9e8b407624fa696854b78b407b97a01dbb703reed@google.com  // Pressing tab to focus the omnibox should select all text.
231f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  while (!ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)) {
232b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org    ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_TAB,
233b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org                                                false, false, false, false));
234b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org  }
235b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org  EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX));
236b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org  EXPECT_TRUE(omnibox_view->IsSelectAll());
237b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org}
238b6e161937bc890f0aa12ac5e27415d4d260ea6e0junov@chromium.org
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, CloseOmniboxPopupOnTextDrag) {
2405119bdb952025a30f115b9c6a187173956e55097reed@android.com  OmniboxView* omnibox_view = NULL;
241f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com  ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view));
242c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  OmniboxViewViews* omnibox_view_views =
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      static_cast<OmniboxViewViews*>(omnibox_view);
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Populate suggestions for the omnibox popup.
246c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  AutocompleteController* autocomplete_controller =
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      omnibox_view->model()->popup_model()->autocomplete_controller();
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  AutocompleteResult& results = autocomplete_controller->result_;
24954924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.com  ACMatches matches;
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  AutocompleteMatch match;
251c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  match.destination_url = GURL("http://autocomplete-result/");
2528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  match.allowed_to_be_default_match = true;
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  match.type = AutocompleteMatchType::HISTORY_TITLE;
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  match.relevance = 500;
255c73dd5c6880739f26216f198c757028fd28df1a4djsollen@google.com  matches.push_back(match);
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  match.destination_url = GURL("http://autocomplete-result2/");
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  matches.push_back(match);
25859ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com  results.AppendMatches(matches);
25959ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com  results.SortAndCull(AutocompleteInput(), browser()->profile());
26059ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com
26159ccef695cef28a74ab2ea13d5a6c9017af45402reed@google.com  // The omnibox popup should open with suggestions displayed.
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view->model()->popup_model()->OnResultChanged();
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(omnibox_view->model()->popup_model()->IsOpen());
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // The omnibox text should be selected.
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_TRUE(omnibox_view->IsSelectAll());
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // Simulate a mouse click before dragging the mouse.
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  gfx::Point point(omnibox_view_views->x(), omnibox_view_views->y());
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, point, point,
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  omnibox_view_views->OnMousePressed(pressed);
273d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  EXPECT_TRUE(omnibox_view->model()->popup_model()->IsOpen());
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
275d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  // Simulate a mouse drag of the omnibox text, and the omnibox should close.
276d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  ui::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, point, point,
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                         ui::EF_LEFT_MOUSE_BUTTON, 0);
278d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org  omnibox_view_views->OnMouseDragged(dragged);
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  EXPECT_FALSE(omnibox_view->model()->popup_model()->IsOpen());
281d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org}
282d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.org
283d3ae77965e94e0efda496f5461cbec4533cb5b16vandebo@chromium.orgIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, BackgroundIsOpaque) {
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // The omnibox text should be rendered on an opaque background. Otherwise, we
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // can't use subpixel rendering.
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  BrowserWindowTesting* window = browser()->window()->GetBrowserWindowTesting();
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  ASSERT_TRUE(window);
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  OmniboxViewViews* view = window->GetLocationBarView()->omnibox_view();
2898f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com  ASSERT_TRUE(view);
2908f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com  EXPECT_FALSE(view->GetRenderText()->background_is_transparent());
2918f073382bb6a9b3998a74e6b58654476b77b4c86reed@android.com}
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com