1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/views/omnibox/omnibox_view_views.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h" 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/browser_window.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/omnibox/location_bar.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/omnibox/omnibox_popup_model.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/view_ids.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chrome/browser/ui/views/frame/browser_view.h" 150de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)#include "chrome/browser/ui/views/location_bar/location_bar_view.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/test/base/interactive_test_utils.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "grit/generated_resources.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/aura/test/event_generator.h" 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/aura/window.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/aura/window_tree_host.h" 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/base/clipboard/clipboard.h" 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/base/clipboard/scoped_clipboard_writer.h" 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/base/ime/text_input_focus_manager.h" 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/base/test/ui_controls.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/events/event_processor.h" 2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/events/event_utils.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_test_api.h" 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class OmniboxViewViewsTest : public InProcessBrowserTest { 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OmniboxViewViewsTest() {} 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) static void GetOmniboxViewForBrowser(const Browser* browser, 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OmniboxView** omnibox_view) { 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserWindow* window = browser->window(); 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(window); 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) LocationBar* location_bar = window->GetLocationBar(); 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(location_bar); 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *omnibox_view = location_bar->GetOmniboxView(); 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(*omnibox_view); 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Move the mouse to the center of the browser window and left-click. 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void ClickBrowserWindowCenter() { 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseMoveSync( 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) BrowserView::GetBrowserViewForBrowser( 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) browser())->GetBoundsInScreen().CenterPoint())); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(ui_controls::LEFT, 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_controls::DOWN)); 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE( 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ui_test_utils::SendMouseEventsSync(ui_controls::LEFT, ui_controls::UP)); 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Press and release the mouse at the specified locations. If 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |release_offset| differs from |press_offset|, the mouse will be moved 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // between the press and release. 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Click(ui_controls::MouseButton button, 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& press_location, 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& release_location) { 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(press_location)); 6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(button, ui_controls::DOWN)); 6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (press_location != release_location) 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseMoveSync(release_location)); 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::SendMouseEventsSync(button, ui_controls::UP)); 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tap the center of the browser window. 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void TapBrowserWindowCenter() { 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Point center = BrowserView::GetBrowserViewForBrowser( 73f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser())->GetBoundsInScreen().CenterPoint(); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) aura::test::EventGenerator generator(browser()->window()-> 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetNativeWindow()->GetRootWindow()); 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) generator.GestureTapAt(center); 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Touch down and release at the specified locations. 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Tap(const gfx::Point& press_location, 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& release_location) { 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ui::EventProcessor* dispatcher = 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) browser()->window()->GetNativeWindow()->GetHost()->event_processor(); 84f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) base::TimeDelta timestamp = ui::EventTimeForNow(); 8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::TouchEvent press( 8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::ET_TOUCH_PRESSED, press_location, 5, timestamp); 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EventDispatchDetails details = dispatcher->OnEventFromSource(&press); 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (press_location != release_location) { 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(10); 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::TouchEvent move( 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::ET_TOUCH_MOVED, release_location, 5, timestamp); 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) details = dispatcher->OnEventFromSource(&move); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) timestamp += base::TimeDelta::FromMilliseconds(50); 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::TouchEvent release( 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::ET_TOUCH_RELEASED, release_location, 5, timestamp); 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) details = dispatcher->OnEventFromSource(&release); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(details.dispatcher_destroyed); 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // InProcessBrowserTest: 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE { 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::BringBrowserWindowToFront(browser())); 10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) chrome::FocusLocationBar(browser()); 11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(OmniboxViewViewsTest); 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, PasteAndGoDoesNotLeavePopupOpen) { 1170de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) OmniboxView* view = NULL; 1180de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &view)); 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OmniboxViewViews* omnibox_view_views = static_cast<OmniboxViewViews*>(view); 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Put an URL on the clipboard. 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) { 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::ScopedClipboardWriter clipboard_writer( 1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::Clipboard::GetForCurrentThread(), ui::CLIPBOARD_TYPE_COPY_PASTE); 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) clipboard_writer.WriteURL(base::ASCIIToUTF16("http://www.example.com/")); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Paste and go. 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox_view_views->ExecuteCommand(IDS_PASTE_AND_GO, ui::EF_NONE); 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // The popup should not be open. 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(view->model()->popup_model()->IsOpen()); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnClick) { 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) OmniboxView* omnibox_view = NULL; 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view)); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox_view->SetUserText(base::ASCIIToUTF16("http://www.google.com/")); 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Take the focus away from the omnibox. 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter()); 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Clicking in the omnibox should take focus and select all text. 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Rect omnibox_bounds = BrowserView::GetBrowserViewForBrowser( 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser())->GetViewByID(VIEW_ID_OMNIBOX)->GetBoundsInScreen(); 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point click_location = omnibox_bounds.CenterPoint(); 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT, 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) click_location, click_location)); 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(omnibox_view->IsSelectAll()); 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Clicking in another view should clear focus and the selection. 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter()); 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Clicking in the omnibox again should take focus and select all text again. 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT, 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) click_location, click_location)); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(omnibox_view->IsSelectAll()); 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Clicking another omnibox spot should keep focus but clear the selection. 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) omnibox_view->SelectAll(false); 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point click2_location = omnibox_bounds.origin() + 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2d(omnibox_bounds.width() / 4, omnibox_bounds.height() / 4); 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT, 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) click2_location, click2_location)); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Take the focus away and click in the omnibox again, but drag a bit before 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // releasing. We should focus the omnibox but not select all of its text. 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter()); 177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Click(ui_controls::LEFT, 178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) click_location, click2_location)); 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Middle-clicking should not be handled by the omnibox. 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(ClickBrowserWindowCenter()); 184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Click(ui_controls::MIDDLE, 185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) click_location, click_location)); 186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnTap) { 191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) OmniboxView* omnibox_view = NULL; 192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view)); 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) omnibox_view->SetUserText(base::ASCIIToUTF16("http://www.google.com/")); 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Take the focus away from the omnibox. 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter()); 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 199f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tapping in the omnibox should take focus and select all text. 201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Rect omnibox_bounds = BrowserView::GetBrowserViewForBrowser( 202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) browser())->GetViewByID(VIEW_ID_OMNIBOX)->GetBoundsInScreen(); 203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point tap_location = omnibox_bounds.CenterPoint(); 204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap_location)); 205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(omnibox_view->IsSelectAll()); 207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tapping in another view should clear focus and the selection. 209f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter()); 210f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tapping in the omnibox again should take focus and select all text again. 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap_location)); 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(omnibox_view->IsSelectAll()); 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Tapping another omnibox spot should keep focus and selection. 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) omnibox_view->SelectAll(false); 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point tap2_location = omnibox_bounds.origin() + 221f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Vector2d(omnibox_bounds.width() / 4, omnibox_bounds.height() / 4); 222f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Tap(tap2_location, tap2_location)); 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // We don't test if the all text is selected because it depends on whether or 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // not there was text under the tap, which appears to be flaky. 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Take the focus away and tap in the omnibox again, but drag a bit before 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // releasing. We should focus the omnibox but not select all of its text. 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(TapBrowserWindowCenter()); 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_NO_FATAL_FAILURE(Tap(tap_location, tap2_location)); 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 232f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_FALSE(omnibox_view->IsSelectAll()); 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 235a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochIN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, SelectAllOnTabToFocus) { 236a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch OmniboxView* omnibox_view = NULL; 237a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view)); 238a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ui_test_utils::NavigateToURL(browser(), GURL("http://www.google.com/")); 239a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // RevertAll after navigation to invalidate the selection range saved on blur. 240a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch omnibox_view->RevertAll(); 241a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 242a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_FALSE(omnibox_view->IsSelectAll()); 243a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 244a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Pressing tab to focus the omnibox should select all text. 245a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (!ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)) { 246a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ASSERT_TRUE(ui_test_utils::SendKeyPressSync(browser(), ui::VKEY_TAB, 247a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch false, false, false, false)); 248a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 249a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(ui_test_utils::IsViewFocused(browser(), VIEW_ID_OMNIBOX)); 250a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_TRUE(omnibox_view->IsSelectAll()); 251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch} 2520de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2530de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, CloseOmniboxPopupOnTextDrag) { 2540de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) OmniboxView* omnibox_view = NULL; 2550de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &omnibox_view)); 2560de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) OmniboxViewViews* omnibox_view_views = 2570de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) static_cast<OmniboxViewViews*>(omnibox_view); 2580de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2590de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Populate suggestions for the omnibox popup. 2600de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) AutocompleteController* autocomplete_controller = 2610de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) omnibox_view->model()->popup_model()->autocomplete_controller(); 2620de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) AutocompleteResult& results = autocomplete_controller->result_; 2630de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ACMatches matches; 2640de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) AutocompleteMatch match; 2650de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) match.destination_url = GURL("http://autocomplete-result/"); 2660de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) match.allowed_to_be_default_match = true; 2670de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) match.type = AutocompleteMatchType::HISTORY_TITLE; 2680de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) match.relevance = 500; 2690de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) matches.push_back(match); 2700de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) match.destination_url = GURL("http://autocomplete-result2/"); 2710de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) matches.push_back(match); 2720de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) results.AppendMatches(matches); 2730de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) results.SortAndCull(AutocompleteInput(), browser()->profile()); 2740de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2750de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // The omnibox popup should open with suggestions displayed. 2760de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) omnibox_view->model()->popup_model()->OnResultChanged(); 2770de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) EXPECT_TRUE(omnibox_view->model()->popup_model()->IsOpen()); 2780de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2790de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // The omnibox text should be selected. 2800de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) EXPECT_TRUE(omnibox_view->IsSelectAll()); 2810de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Simulate a mouse click before dragging the mouse. 2830de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) gfx::Point point(omnibox_view_views->x(), omnibox_view_views->y()); 2840de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ui::MouseEvent pressed(ui::ET_MOUSE_PRESSED, point, point, 2850de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 2860de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) omnibox_view_views->OnMousePressed(pressed); 2870de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) EXPECT_TRUE(omnibox_view->model()->popup_model()->IsOpen()); 2880de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2890de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // Simulate a mouse drag of the omnibox text, and the omnibox should close. 2900de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ui::MouseEvent dragged(ui::ET_MOUSE_DRAGGED, point, point, 2910de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 0); 2920de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) omnibox_view_views->OnMouseDragged(dragged); 2930de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2940de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) EXPECT_FALSE(omnibox_view->model()->popup_model()->IsOpen()); 2950de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 2960de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) 2970de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, BackgroundIsOpaque) { 2980de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // The omnibox text should be rendered on an opaque background. Otherwise, we 2990de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) // can't use subpixel rendering. 3000de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) BrowserWindowTesting* window = browser()->window()->GetBrowserWindowTesting(); 3010de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ASSERT_TRUE(window); 3020de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) OmniboxViewViews* view = window->GetLocationBarView()->omnibox_view(); 3030de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) ASSERT_TRUE(view); 3040de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) EXPECT_FALSE(view->GetRenderText()->background_is_transparent()); 3050de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles)} 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests if executing a command hides touch editing handles. 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DeactivateTouchEditingOnExecuteCommand) { 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing); 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OmniboxView* view = NULL; 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &view)); 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OmniboxViewViews* omnibox_view_views = static_cast<OmniboxViewViews*>(view); 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) views::TextfieldTestApi textfield_test_api(omnibox_view_views); 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Put a URL on the clipboard. It is written to the clipboard upon destruction 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // of the writer. 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::ScopedClipboardWriter clipboard_writer( 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::Clipboard::GetForCurrentThread(), 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui::CLIPBOARD_TYPE_COPY_PASTE); 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) clipboard_writer.WriteURL(base::ASCIIToUTF16("http://www.example.com/")); 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Tap to activate touch editing. 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) gfx::Point omnibox_center = 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) omnibox_view_views->GetBoundsInScreen().CenterPoint(); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Tap(omnibox_center, omnibox_center); 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(textfield_test_api.touch_selection_controller()); 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Execute a command and check if it deactivate touch editing. Paste & Go is 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // chosen since it is specific to Omnibox and its execution wouldn't be 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // delgated to the base Textfield class. 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) omnibox_view_views->ExecuteCommand(IDS_PASTE_AND_GO, ui::EF_NONE); 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(textfield_test_api.touch_selection_controller()); 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(OmniboxViewViewsTest, FocusedTextInputClient) { 340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::CommandLine* cmd_line = base::CommandLine::ForCurrentProcess(); 341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmd_line->AppendSwitch(switches::kEnableTextInputFocusManager); 342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(yukishiino): The following call to FocusLocationBar is not necessary 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // if the flag is enabled by default. Remove the call once the transition to 345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TextInputFocusManager completes. 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chrome::FocusLocationBar(browser()); 347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OmniboxView* view = NULL; 348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ASSERT_NO_FATAL_FAILURE(GetOmniboxViewForBrowser(browser(), &view)); 349f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) OmniboxViewViews* omnibox_view_views = static_cast<OmniboxViewViews*>(view); 350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::TextInputFocusManager* text_input_focus_manager = 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ui::TextInputFocusManager::GetInstance(); 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_EQ(omnibox_view_views->GetTextInputClient(), 353f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) text_input_focus_manager->GetFocusedTextInputClient()); 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 355