15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <set> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h" 135e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/clipboard.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/clipboard/scoped_clipboard_writer.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/dragdrop/drag_drop_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ime/text_input_client.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/ui_base_switches.h" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_switches_util.h" 22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/render_text.h" 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/strings/grit/ui_strings.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_controller.h" 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_model.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/controls/textfield/textfield_test_api.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/focus/focus_manager.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/ime/mock_input_method.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/test_views_delegate.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#if defined(OS_WIN) 373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/win/windows_version.h" 383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/events/linux/text_edit_key_bindings_delegate_auralinux.h" 4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(USE_X11) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/event_utils.h" 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF8ToUTF16; 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::WideToUTF16; 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define EXPECT_STR_EQ(ascii, utf16) EXPECT_EQ(ASCIIToUTF16(ascii), utf16) 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 kHebrewLetterSamekh = 0x05E1; 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// A Textfield wrapper to intercept OnKey[Pressed|Released]() ressults. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestTextfield : public views::Textfield { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TestTextfield() 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : Textfield(), 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_handled_(false), 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_received_(false), 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch weak_ptr_factory_(this) {} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnKeyPressed(const ui::KeyEvent& e) OVERRIDE { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_received_ = true; 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Since OnKeyPressed() might destroy |this|, get a weak pointer and 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // verify it isn't null before writing the bool value to key_handled_. 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtr<TestTextfield> textfield(weak_ptr_factory_.GetWeakPtr()); 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool key = views::Textfield::OnKeyPressed(e); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!textfield) 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return key; 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch key_handled_ = key; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_handled_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnKeyReleased(const ui::KeyEvent& e) OVERRIDE { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_received_ = true; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_handled_ = views::Textfield::OnKeyReleased(e); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return key_handled_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool key_handled() const { return key_handled_; } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool key_received() const { return key_received_; } 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void clear() { key_received_ = key_handled_ = false; } 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool key_handled_; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool key_received_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::WeakPtrFactory<TestTextfield> weak_ptr_factory_; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestTextfield); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Convenience to make constructing a GestureEvent simpler. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GestureEventForTest : public ui::GestureEvent { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest(int x, int y, ui::GestureEventDetails details) 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : GestureEvent(x, y, 0, base::TimeDelta(), details) {} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(GestureEventForTest); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// This controller will happily destroy the target textfield passed on 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// construction when a key event is triggered. 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass TextfieldDestroyerController : public views::TextfieldController { 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit TextfieldDestroyerController(views::Textfield* target) 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : target_(target) { 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch target_->set_controller(this); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch views::Textfield* target() { return target_.get(); } 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // views::TextfieldController: 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual bool HandleKeyEvent(views::Textfield* sender, 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const ui::KeyEvent& key_event) OVERRIDE { 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch target_.reset(); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<views::Textfield> target_; 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}; 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 GetClipboardText(ui::ClipboardType type) { 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text; 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::Clipboard::GetForCurrentThread()->ReadText(type, &text); 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return text; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void SetClipboardText(ui::ClipboardType type, const std::string& text) { 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::ScopedClipboardWriter(type).WriteText(ASCIIToUTF16(text)); 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class TextfieldTest : public ViewsTestBase, public TextfieldController { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TextfieldTest() 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : widget_(NULL), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_(NULL), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_(NULL), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_(NULL), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_before_user_action_(0), 157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch on_after_user_action_(0), 158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch copied_to_clipboard_(ui::CLIPBOARD_TYPE_LAST) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ::testing::Test: 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() { 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewsTestBase::SetUp(); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (widget_) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Close(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ViewsTestBase::TearDown(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ClipboardType GetAndResetCopiedToClipboard() { 173c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ClipboardType clipboard_type = copied_to_clipboard_; 174c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch copied_to_clipboard_ = ui::CLIPBOARD_TYPE_LAST; 175c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return clipboard_type; 176c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 177c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TextfieldController: 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ContentsChanged(Textfield* sender, 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& new_contents) OVERRIDE { 18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Paste calls TextfieldController::ContentsChanged() explicitly even if the 18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // paste action did not change the content. So |new_contents| may match 18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |last_contents_|. For more info, see http://crbug.com/79002 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_contents_ = new_contents; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnBeforeUserAction(Textfield* sender) OVERRIDE { 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++on_before_user_action_; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnAfterUserAction(Textfield* sender) OVERRIDE { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++on_after_user_action_; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void OnAfterCutOrCopy(ui::ClipboardType clipboard_type) OVERRIDE { 196c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch copied_to_clipboard_ = clipboard_type; 197c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 198c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InitTextfield() { 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfields(1); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InitTextfields(int count) { 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(textfield_); 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_ = new TestTextfield(); 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->set_controller(this); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_ = new Widget(); 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.bounds = gfx::Rect(100, 100, 100, 100); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->Init(params); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* container = new View(); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->SetContentsView(container); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->AddChildView(textfield_); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetBoundsRect(params.bounds); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->set_id(1); 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_api_.reset(new TextfieldTestApi(textfield_)); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 1; i < count; i++) { 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Textfield* textfield = new Textfield(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) container->AddChildView(textfield); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield->set_id(i + 1); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) model_ = test_api_->model(); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->ClearEditHistory(); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_ = new MockInputMethod(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->ReplaceInputMethod(input_method_); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Activate the widget and focus the textfield for input handling. 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) widget_->Activate(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->RequestFocus(); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MenuModel* GetContextMenuModel() { 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_api_->UpdateContextMenu(); 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return test_api_->context_menu_contents(); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendKeyEvent(ui::KeyboardCode key_code, 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) bool alt, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool shift, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool control, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool caps_lock) { 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) int flags = (alt ? ui::EF_ALT_DOWN : 0) | 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (shift ? ui::EF_SHIFT_DOWN : 0) | 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (control ? ui::EF_CONTROL_DOWN : 0) | 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) (caps_lock ? ui::EF_CAPS_LOCK_DOWN : 0); 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(ui::ET_KEY_PRESSED, key_code, flags); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->DispatchKeyEvent(event); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendKeyEvent(ui::KeyboardCode key_code, bool shift, bool control) { 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(key_code, false, shift, control, false); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SendKeyEvent(ui::KeyboardCode key_code) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(key_code, false, false); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SendKeyEvent(base::char16 ch) { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ch < 0x80) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::KeyboardCode code = 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ch == ' ' ? ui::VKEY_SPACE : 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<ui::KeyboardCode>(ui::VKEY_A + ch - 'a'); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(code); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::KeyEvent event(ch, ui::VKEY_UNKNOWN, ui::EF_NONE); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->DispatchKeyEvent(event); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) View* GetFocusedView() { 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return widget_->GetFocusManager()->GetFocusedView(); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetCursorPositionX(int cursor_pos) { 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return test_api_->GetRenderText()->GetCursorBounds( 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD), false).x(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the current cursor bounds. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetCursorBounds() { 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return test_api_->GetRenderText()->GetUpdatedCursorBounds(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the cursor bounds of |sel|. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetCursorBounds(const gfx::SelectionModel& sel) { 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return test_api_->GetRenderText()->GetCursorBounds(sel, true); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect GetDisplayRect() { 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return test_api_->GetRenderText()->display_rect(); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Mouse click on the point whose x-axis is |bound|'s x plus |x_offset| and 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // y-axis is in the middle of |bound|'s vertical range. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void MouseClick(const gfx::Rect bound, int x_offset) { 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point point(bound.x() + x_offset, bound.y() + bound.height() / 2); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point, 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, point, point, 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is to avoid double/triple click. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NonClientMouseClick() { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_NON_CLIENT, 3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_NON_CLIENT, 3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Simulates a complete tap. 3226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) void Tap(const gfx::Point& point) { 3236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GestureEventForTest begin( 3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_BEGIN)); 3256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->OnGestureEvent(&begin); 3266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GestureEventForTest tap_down( 3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_TAP_DOWN)); 3296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->OnGestureEvent(&tap_down); 3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GestureEventForTest show_press( 3321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci point.x(), 3331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci point.y(), 3341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::GestureEventDetails(ui::ET_GESTURE_SHOW_PRESS)); 3356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->OnGestureEvent(&show_press); 3366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP); 3381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tap_details.set_tap_count(1); 3391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest tap(point.x(), point.y(), tap_details); 3406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->OnGestureEvent(&tap); 3416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) GestureEventForTest end( 3431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci point.x(), point.y(), ui::GestureEventDetails(ui::ET_GESTURE_END)); 3446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->OnGestureEvent(&end); 3456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 3466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void VerifyTextfieldContextMenuContents(bool textfield_has_selection, 348424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool can_undo, 349424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) ui::MenuModel* menu) { 350424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(can_undo, menu->IsEnabledAt(0 /* UNDO */)); 351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(menu->IsEnabledAt(1 /* Separator */)); 352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(2 /* CUT */)); 353424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(3 /* COPY */)); 3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_NE(GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE).empty(), 3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) menu->IsEnabledAt(4 /* PASTE */)); 356424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(5 /* DELETE */)); 357424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(menu->IsEnabledAt(6 /* Separator */)); 358424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) EXPECT_TRUE(menu->IsEnabledAt(7 /* SELECT ALL */)); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We need widget to populate wrapper class. 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Widget* widget_; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTextfield* textfield_; 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TextfieldTestApi> test_api_; 3665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TextfieldModel* model_; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The string from Controller::ContentsChanged callback. 3695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 last_contents_; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For testing input method related behaviors. 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockInputMethod* input_method_; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates how many times OnBeforeUserAction() is called. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_before_user_action_; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Indicates how many times OnAfterUserAction() is called. 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int on_after_user_action_; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ui::ClipboardType copied_to_clipboard_; 382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TextfieldTest); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, ModelChangesTest) { 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TextfieldController::ContentsChanged() shouldn't be called when changing 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // text programmatically. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_contents_.clear(); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("this is")); 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("this is", model_->text()); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("this is", textfield_->text()); 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_contents_.empty()); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->AppendText(ASCIIToUTF16(" a test")); 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("this is a test", model_->text()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("this is a test", textfield_->text()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_contents_.empty()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::string16(), textfield_->GetSelectedText()); 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectAll(false); 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("this is a test", textfield_->GetSelectedText()); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_contents_.empty()); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, KeyTest) { 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 41190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Event flags: key, alt, shift, ctrl, caps-lock. 41290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_T, false, true, false, false); 41390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_E, false, false, false, false); 41490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_X, false, true, false, true); 41590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_T, false, false, false, true); 41690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_1, false, true, false, false); 41790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_1, false, false, false, false); 41890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_1, false, true, false, true); 41990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_1, false, false, false, true); 42090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("TexT!1!1", textfield_->text()); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, ControlAndSelectTest) { 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a test string in a textfield. 4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("one two three")); 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME, false /* shift */, false /* control */); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, false); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, false); 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, false); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one", textfield_->GetSelectedText()); 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test word select. 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, true); 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two", textfield_->GetSelectedText()); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, true); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three", textfield_->GetSelectedText()); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, true, true); 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two ", textfield_->GetSelectedText()); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, true, true); 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one ", textfield_->GetSelectedText()); 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Replace the selected text. 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, true, false); 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_E, true, false); 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_R, true, false); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_O, true, false); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_SPACE, false, false); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ZERO two three", textfield_->text()); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END, true, false); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("two three", textfield_->GetSelectedText()); 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME, true, false); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ZERO ", textfield_->GetSelectedText()); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, InsertionDeletionTest) { 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a test string in a textfield. 4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 4617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (size_t i = 0; i < 10; i++) 4627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SendKeyEvent(static_cast<ui::KeyboardCode>(ui::VKEY_A + i)); 4637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_STR_EQ("abcdefghij", textfield_->text()); 4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Test the delete and backspace keys. 46658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(5)); 4677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < 3; i++) 4687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SendKeyEvent(ui::VKEY_BACK); 4697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_STR_EQ("abfghij", textfield_->text()); 4707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for (int i = 0; i < 3; i++) 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE); 4727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_STR_EQ("abij", textfield_->text()); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select all and replace with "k". 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectAll(false); 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_K); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("k", textfield_->text()); 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the previous word from cursor. 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("one two three four")); 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 48290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_BACK, false, false, true, false); 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three ", textfield_->text()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Delete to a line break on Linux and ChromeOS, to a word break on Windows. 48690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, false, true, false); 48790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_BACK, false, true, true, false); 4885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("three ", textfield_->text()); 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_STR_EQ("one three ", textfield_->text()); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the next word from cursor. 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("one two three four")); 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 49790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE, false, false, true, false); 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" two three four", textfield_->text()); 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Delete to a line break on Linux and ChromeOS, to a word break on Windows. 50190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, false, false, true, false); 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE, false, true, true, false); 5035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" two", textfield_->text()); 5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#else 506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_STR_EQ(" two four", textfield_->text()); 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, PasswordTest) { 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType()); 51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(textfield_->enabled()); 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsFocusable()); 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_contents_.clear(); 51890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("password")); 51990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure text() and the callback returns the actual text instead of "*". 52090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("password", textfield_->text()); 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(last_contents_.empty()); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->SelectAll(false); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "foo"); 52490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 52590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Cut and copy should be disabled. 5265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_CUT)); 5275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_CUT, 0); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_X, false, true); 5295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_COPY)); 5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_COPY, 0); 53190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_C, false, true); 53290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, false, true); 5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("foo", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 53490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("password", textfield_->text()); 5357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // [Shift]+[Delete] should just delete without copying text to the clipboard. 5367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch textfield_->SelectAll(false); 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SendKeyEvent(ui::VKEY_DELETE, true, false); 53890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 53990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Paste should work normally. 5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE)); 5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_PASTE, 0); 54290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_V, false, true); 54390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, true, false); 5445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("foo", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 54590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("foofoofoo", textfield_->text()); 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TextInputType) { 5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Defaults to TEXT 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, textfield_->GetTextInputType()); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // And can be set. 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_URL); 5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_URL, textfield_->GetTextInputType()); 5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); 5585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType()); 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Readonly textfields have type NONE 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(true); 5625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, textfield_->GetTextInputType()); 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(false); 5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType()); 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // As do disabled textfields 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetEnabled(false); 5695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, textfield_->GetTextInputType()); 5705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetEnabled(true); 5725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType()); 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(TextfieldTest, OnKeyPress) { 5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 578effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Character keys are handled by the input method. 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 584effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Arrow keys and home/end are handled by the textfield. 585effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_LEFT); 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_handled()); 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 590effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_RIGHT); 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 592effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(textfield_->key_handled()); 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_HOME); 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 597effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(textfield_->key_handled()); 598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) textfield_->clear(); 599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 600effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_END); 601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 602effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_TRUE(textfield_->key_handled()); 603c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) textfield_->clear(); 604c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 605effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // F24, up/down key won't be handled. 606effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_F24); 607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) textfield_->clear(); 610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 611effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_UP); 612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) textfield_->clear(); 615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 616effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch SendKeyEvent(ui::VKEY_DOWN); 617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 618c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 619c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) textfield_->clear(); 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 62246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Tests that default key bindings are handled even with a delegate installed. 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_F(TextfieldTest, OnKeyPressBinding) { 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InitTextfield(); 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 62646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 62746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Install a TextEditKeyBindingsDelegateAuraLinux that does nothing. 62846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) class TestDelegate : public ui::TextEditKeyBindingsDelegateAuraLinux { 62946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public: 63046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestDelegate() {} 63146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual ~TestDelegate() {} 63246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) virtual bool MatchEvent( 63446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const ui::Event& event, 63546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<ui::TextEditCommandAuraLinux>* commands) OVERRIDE { 63646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 63746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 63846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 63946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private: 64046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestDelegate); 64146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) }; 64246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) TestDelegate delegate; 64446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::SetTextEditKeyBindingsDelegate(&delegate); 64546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 64646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 64746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, false); 64846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 64946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) textfield_->clear(); 65046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 65146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Undo/Redo command keys are handled by the textfield. 65246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 65346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 65446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(textfield_->key_handled()); 65546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(textfield_->text().empty()); 65646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) textfield_->clear(); 65746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 65846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SendKeyEvent(ui::VKEY_Z, true, true); 65946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 66046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_TRUE(textfield_->key_handled()); 66146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 66246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) textfield_->clear(); 66346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 66446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 66546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui::SetTextEditKeyBindingsDelegate(NULL); 66646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif 66746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 66846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, CursorMovement) { 6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test with trailing whitespace. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("one two hre ")); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the cursor at the end. 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Left should move the cursor just before the last word. 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, true); 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_T); 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two thre ", textfield_->text()); 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two thre ", last_contents_); 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Right should move the cursor to the end of the last word. 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, false, true); 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_E); 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three ", textfield_->text()); 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three ", last_contents_); 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Right again should move the cursor to the end. 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, false, true); 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_BACK); 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three", textfield_->text()); 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two three", last_contents_); 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test with leading whitespace. 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16(" ne two")); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Send the cursor at the beginning. 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Right, then Ctrl+Left should move the cursor to the beginning of the 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // first word. 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, false, true); 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, true); 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_O); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" one two", textfield_->text()); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" one two", last_contents_); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Left to move the cursor to the beginning of the first word. 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, true); 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ctrl+Left again should move the cursor back to the very beginning. 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, true); 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE); 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two", textfield_->text()); 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("one two", last_contents_); 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, FocusTraversalTest) { 7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfields(3); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->RequestFocus(); 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetFocusedView()->id()); 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(false); 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, GetFocusedView()->id()); 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(false); 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetFocusedView()->id()); 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cycle back to the first textfield. 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(false); 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetFocusedView()->id()); 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(true); 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetFocusedView()->id()); 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(true); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, GetFocusedView()->id()); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(true); 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetFocusedView()->id()); 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cycle back to the last textfield. 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(true); 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetFocusedView()->id()); 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Request focus should still work. 7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->RequestFocus(); 7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetFocusedView()->id()); 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Test if clicking on textfield view sets the focus. 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) widget_->GetFocusManager()->AdvanceFocus(true); 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetFocusedView()->id()); 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetFocusedView()->id()); 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, ContextMenuDisplayTest) { 7565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 75758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(textfield_->context_menu_controller()); 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) ui::Clipboard::GetForCurrentThread()->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE); 7605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ClearEditHistory(); 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(GetContextMenuModel()); 762424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VerifyTextfieldContextMenuContents(false, false, GetContextMenuModel()); 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectAll(false); 765424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VerifyTextfieldContextMenuContents(true, false, GetContextMenuModel()); 766424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 767424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SendKeyEvent(ui::VKEY_T); 768424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VerifyTextfieldContextMenuContents(false, true, GetContextMenuModel()); 769424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 770424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) textfield_->SelectAll(false); 771424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); 772424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 773424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Exercise the "paste enabled?" check in the verifier. 7745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); 775424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel()); 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DoubleAndTripleClickTest) { 7795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), 7825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(), 7845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent double_click( 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(), 7875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK, 7885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test for double click. 7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->GetSelectedText().empty()); 7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(double_click); 7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test for triple click. 7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello world", textfield_->GetSelectedText()); 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 803ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch // Another click should reset back to double click. 8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 806ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragToSelect) { 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kStart = GetCursorPositionX(5); 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int kEnd = 500; 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point start_point(kStart, 0); 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point end_point(kEnd, 0); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, start_point, start_point, 8175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click_b(ui::ET_MOUSE_PRESSED, end_point, end_point, 8195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent drag_left(ui::ET_MOUSE_DRAGGED, gfx::Point(), gfx::Point(), 8215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 0); 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent drag_right(ui::ET_MOUSE_DRAGGED, end_point, end_point, 8235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 0); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, end_point, end_point, 8255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 8265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click_a); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->GetSelectedText().empty()); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that dragging left selects the beginning of the string. 8295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag_left); 8305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text_left = textfield_->GetSelectedText(); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello", text_left); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that dragging right selects the rest of the string. 8335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag_right); 8345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 text_right = textfield_->GetSelectedText(); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" world", text_right); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that releasing in the same location does not alter the selection. 8375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(text_right, textfield_->GetSelectedText()); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that dragging from beyond the text length works too. 8405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click_b); 8415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag_left); 8425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText()); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 8475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragAndDrop_AcceptDrop) { 8485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 8525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string(ASCIIToUTF16("string ")); 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data.SetString(string); 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int formats = 0; 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<OSExchangeData::CustomFormat> custom_formats; 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that disabled textfields do not accept drops. 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetEnabled(false); 8595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->GetDropFormats(&formats, &custom_formats)); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, formats); 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(custom_formats.empty()); 8625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->CanDrop(data)); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetEnabled(true); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that read-only textfields do not accept drops. 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(true); 8675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->GetDropFormats(&formats, &custom_formats)); 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, formats); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(custom_formats.empty()); 8705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->CanDrop(data)); 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(false); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that enabled and editable textfields do accept drops. 8745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats)); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::OSExchangeData::STRING, formats); 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(custom_formats.empty()); 8775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanDrop(data)); 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drop_point(GetCursorPositionX(6), 0); 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DropTargetEvent drop(data, drop_point, drop_point, 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE); 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE, 8825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnDragUpdated(drop)); 8835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, textfield_->OnPerformDrop(drop)); 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello string world", textfield_->text()); 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that textfields do not accept non-OSExchangeData::STRING types. 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData bad_data; 8882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bad_data.SetFilename(base::FilePath(FILE_PATH_LITERAL("x"))); 88990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ui::OSExchangeData::CustomFormat fmt = ui::Clipboard::GetBitmapFormatType(); 8905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_data.SetPickledData(fmt, Pickle()); 8912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bad_data.SetFileContents(base::FilePath(L"x"), "x"); 8925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bad_data.SetHtml(base::string16(ASCIIToUTF16("x")), GURL("x.org")); 8932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::OSExchangeData::DownloadFileInfo download(base::FilePath(), NULL); 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bad_data.SetDownloadFileInfo(download); 8955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->CanDrop(bad_data)); 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragAndDrop_InitiateDrag) { 9005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello string world")); 9025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure the textfield will provide selected text for drag data. 9045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string; 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 90658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const gfx::Range kStringRange(6, 12); 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectRange(kStringRange); 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point kStringPoint(GetCursorPositionX(9), 0); 9095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->WriteDragDataForView(NULL, kStringPoint, &data); 9105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.GetString(&string)); 9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(textfield_->GetSelectedText(), string); 9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that disabled textfields do not support drag operations. 9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetEnabled(false); 9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(NULL, kStringPoint)); 9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetEnabled(true); 9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that textfields without selections do not support drag operations. 9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->ClearSelection(); 9205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, 9215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(NULL, kStringPoint)); 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectRange(kStringRange); 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that password textfields do not support drag operations. 9245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); 9255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(NULL, kStringPoint)); 9275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT); 9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that textfields only initiate drag operations inside the selection. 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, kStringPoint, kStringPoint, 9305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 9325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press_event); 9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_NONE, 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(NULL, gfx::Point())); 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->CanStartDragForView(NULL, gfx::Point(), 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point())); 9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(NULL, kStringPoint)); 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint, 9405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point())); 9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ensure that textfields support local moves. 9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, 9435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetDragOperationsForView(textfield_, kStringPoint)); 9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragAndDrop_ToTheRight) { 9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string; 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int formats = 0; 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operations = 0; 9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<OSExchangeData::CustomFormat> custom_formats; 9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start dragging "ello". 95758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(1, 5)); 9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(GetCursorPositionX(3), 0); 9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point, 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click_a); 9625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(), 9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point())); 9645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) operations = textfield_->GetDragOperationsForView(textfield_, 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) click_a.location()); 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operations); 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->WriteDragDataForView(NULL, click_a.location(), &data); 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.GetString(&string)); 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(textfield_->GetSelectedText(), string); 9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats)); 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::OSExchangeData::STRING, formats); 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(custom_formats.empty()); 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drop "ello" after "w". 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point kDropPoint(GetCursorPositionX(7), 0); 9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanDrop(data)); 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DropTargetEvent drop_a(data, kDropPoint, kDropPoint, operations); 9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a)); 9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a)); 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h welloorld", textfield_->text()); 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnDragDone(); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undo/Redo the drag&drop change. 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello world", textfield_->text()); 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 9895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello world", textfield_->text()); 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h welloorld", textfield_->text()); 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h welloorld", textfield_->text()); 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) { 10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 10025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 string; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int formats = 0; 10065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int operations = 0; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::set<OSExchangeData::CustomFormat> custom_formats; 10085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start dragging " worl". 101058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(5, 10)); 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(GetCursorPositionX(7), 0); 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point, 10135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click_a); 10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(), 10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point())); 10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) operations = textfield_->GetDragOperationsForView(textfield_, 10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) click_a.location()); 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY, 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operations); 10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->WriteDragDataForView(NULL, click_a.location(), &data); 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(data.GetString(&string)); 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(textfield_->GetSelectedText(), string); 10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats)); 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::OSExchangeData::STRING, formats); 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(custom_formats.empty()); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drop " worl" after "h". 10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanDrop(data)); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drop_point(GetCursorPositionX(1), 0); 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DropTargetEvent drop_a(data, drop_point, drop_point, operations); 10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a)); 10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a)); 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h worlellod", textfield_->text()); 10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnDragDone(); 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undo/Redo the drag&drop change. 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello world", textfield_->text()); 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("hello world", textfield_->text()); 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h worlellod", textfield_->text()); 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("h worlellod", textfield_->text()); 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, DragAndDrop_Canceled) { 10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start dragging "worl". 105758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(6, 10)); 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(GetCursorPositionX(8), 0); 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point, 10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(click); 10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::OSExchangeData data; 10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->WriteDragDataForView(NULL, click.location(), &data); 10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanDrop(data)); 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Drag the text over somewhere valid, outside the current selection. 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drop_point(GetCursorPositionX(2), 0); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DropTargetEvent drop(data, drop_point, drop_point, 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DragDropTypes::DRAG_MOVE); 10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop)); 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // "Cancel" the drag, via move and release over the selection, and OnDragDone. 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point drag_point(GetCursorPositionX(9), 0); 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, drag_point, drag_point, 10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 0); 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, drag_point, drag_point, 10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag); 10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnDragDone(); 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text()); 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, ReadOnlyTest) { 10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 108490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("read only")); 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(true); 108690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(textfield_->enabled()); 10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsFocusable()); 108890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, textfield_->GetCursorPosition()); 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 109290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(9U, textfield_->GetCursorPosition()); 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, false); 109590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(8U, textfield_->GetCursorPosition()); 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, true); 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5U, textfield_->GetCursorPosition()); 109890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, true, true); 109990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ(0U, textfield_->GetCursorPosition()); 110090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("read ", textfield_->GetSelectedText()); 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectAll(false); 110290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("read only", textfield_->GetSelectedText()); 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 110490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Cut should be disabled. 11055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); 11065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_CUT)); 11075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_CUT, 0); 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_X, false, true); 11097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SendKeyEvent(ui::VKEY_DELETE, true, false); 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("Test", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 111190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("read only", textfield_->text()); 111290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 111390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Paste should be disabled. 11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE)); 11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_PASTE, 0); 111690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_V, false, true); 111790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, true, false); 111890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("read only", textfield_->text()); 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Copy should work normally. 11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); 11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_COPY)); 11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_COPY, 0); 11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_C, false, true); 11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 11285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test"); 112990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, false, true); 11305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetText should work even in read only mode. 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16(" four five six ")); 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" four five six ", textfield_->text()); 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SelectAll(false); 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText()); 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Text field is unmodifiable and selection shouldn't change. 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE); 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText()); 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_BACK); 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText()); 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_T); 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText()); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TextInputClientTest) { 11495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 11505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextInputClient* client = textfield_->GetTextInputClient(); 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client); 11525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, client->GetTextInputType()); 11535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("0123456789")); 115558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) gfx::Range range; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->GetTextRange(&range)); 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0U, range.start()); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(10U, range.end()); 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(client->SetSelectionRange(gfx::Range(1, 4))); 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->GetSelectionRange(&range)); 116258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Range(1, 4), range); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::string16 substring; 1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(client->GetTextFromRange(range, &substring)); 1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_STR_EQ("123", substring); 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->DeleteRange(range)); 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("0456789", textfield_->text()); 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::CompositionText composition; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) composition.text = UTF8ToUTF16("321"); 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set composition through input method. 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->Clear(); 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->SetCompositionTextForNextKey(composition); 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_before_user_action_ = on_after_user_action_ = 0; 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->HasCompositionText()); 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->GetCompositionTextRange(&range)); 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("0321456789", textfield_->text()); 118558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Range(1, 4), range); 1186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, on_before_user_action_); 1187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, on_after_user_action_); 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->SetResultTextForNextKey(UTF8ToUTF16("123")); 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_before_user_action_ = on_after_user_action_ = 0; 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 11935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(textfield_->key_handled()); 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client->HasCompositionText()); 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(input_method_->cancel_composition_called()); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("0123456789", textfield_->text()); 1198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, on_before_user_action_); 1199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch EXPECT_EQ(1, on_after_user_action_); 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->Clear(); 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->SetCompositionTextForNextKey(composition); 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(client->HasCompositionText()); 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("0123321456789", textfield_->text()); 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) on_before_user_action_ = on_after_user_action_ = 0; 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->clear(); 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT); 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client->HasCompositionText()); 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(input_method_->cancel_composition_called()); 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_received()); 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->key_handled()); 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("0123321456789", textfield_->text()); 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(8U, textfield_->GetCursorPosition()); 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, on_before_user_action_); 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, on_after_user_action_); 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) textfield_->clear(); 1221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("0123456789")); 122258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(client->SetSelectionRange(gfx::Range(5, 5))); 1223b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) client->ExtendSelectionAndDelete(4, 2); 1224b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) EXPECT_STR_EQ("0789", textfield_->text()); 1225b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 12262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On{Before,After}UserAction should be called by whatever user action 12272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // triggers clearing or setting a selection if appropriate. 12282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) on_before_user_action_ = on_after_user_action_ = 0; 12292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->clear(); 12302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->ClearSelection(); 12312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SelectAll(false); 12322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, on_before_user_action_); 12332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, on_after_user_action_); 12342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->Clear(); 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(true); 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(input_method_->text_input_type_changed()); 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(textfield_->GetTextInputClient()); 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetReadOnly(false); 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) input_method_->Clear(); 12425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD); 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(input_method_->text_input_type_changed()); 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(textfield_->GetTextInputClient()); 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, UndoRedoTest) { 12485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AppendText 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->AppendText(ASCIIToUTF16("b")); 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_contents_.clear(); // AppendText doesn't call ContentsChanged. 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SetText 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_C); 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undo'ing append moves the cursor to the end for now. 12725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // A no-op SetText won't add a new edit; see TextfieldModel::SetText. 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("abc")); 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("123")); 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("123")); 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("123", textfield_->text()); 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END, false, false); 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_4, false, false); 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("1234", textfield_->text()); 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_contents_.clear(); 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("123", textfield_->text()); 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the insert edit "c" and set edit "123" are merged to single edit, 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so text becomes "ab" after undo. 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("123", textfield_->text()); 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("1234", textfield_->text()); 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Undoing to the same text shouldn't call ContentsChanged. 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); // select all 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A); 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_B); 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_C); 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("1234", textfield_->text()); 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete/Backspace 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_BACK); 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE); 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("b", textfield_->text()); 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_DELETE); 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("b", textfield_->text()); 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Z, false, true); 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("b", textfield_->text()); 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 13375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_Y, false, true); 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 13392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 13405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, CutCopyPaste) { 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 134390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 134490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure IDS_APP_CUT cuts. 134590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("123")); 13462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SelectAll(false); 13475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_CUT)); 13485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_CUT, 0); 13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 135090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 1351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 135290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 135390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure [Ctrl]+[x] cuts and [Ctrl]+[Alt][x] does nothing. 135490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("456")); 135590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SelectAll(false); 135690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_X, true, false, true, false); 13575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 135890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("456", textfield_->text()); 1359c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 136090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_X, false, true); 13615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("456", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 136290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("", textfield_->text()); 1363c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 136490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 13657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Ensure [Shift]+[Delete] cuts. 13667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch textfield_->SetText(ASCIIToUTF16("123")); 13677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch textfield_->SelectAll(false); 13687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch SendKeyEvent(ui::VKEY_DELETE, true, false); 13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 13707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch EXPECT_STR_EQ("", textfield_->text()); 1371c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 13727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 137390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure IDS_APP_COPY copies. 137490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("789")); 137590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SelectAll(false); 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_COPY)); 13775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_COPY, 0); 13785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("789", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 1379c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 138090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 138190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure [Ctrl]+[c] copies and [Ctrl]+[Alt][c] does nothing. 138290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("012")); 138390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SelectAll(false); 138490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_C, true, false, true, false); 13855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("789", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 1386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 13872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendKeyEvent(ui::VKEY_C, false, true); 13885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("012", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 1389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 13902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 139190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure [Ctrl]+[Insert] copies. 139290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("345")); 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SelectAll(false); 13942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, false, true); 13955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("345", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 139690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("345", textfield_->text()); 1397c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_COPY_PASTE, GetAndResetCopiedToClipboard()); 139890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 139990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Ensure IDS_APP_PASTE, [Ctrl]+[V], and [Shift]+[Insert] pastes; 140090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // also ensure that [Ctrl]+[Alt]+[V] does nothing. 14015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "abc"); 14025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetText(base::string16()); 14035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE)); 14045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->ExecuteCommand(IDS_APP_PASTE, 0); 140590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("abc", textfield_->text()); 140690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_V, false, true); 140790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("abcabc", textfield_->text()); 14082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, true, false); 140990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("abcabcabc", textfield_->text()); 141090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SendKeyEvent(ui::VKEY_V, true, false, true, false); 141190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("abcabcabc", textfield_->text()); 141290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 14132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Ensure [Ctrl]+[Shift]+[Insert] is a no-op. 14142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SelectAll(false); 14152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT, true, true); 14165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("abc", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE)); 141790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_STR_EQ("abcabcabc", textfield_->text()); 1418c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 14192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 14202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, OvertypeMode) { 14225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 14232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Overtype mode should be disabled (no-op [Insert]). 14242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("2")); 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_INSERT); 14272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendKeyEvent(ui::VKEY_1, false, false); 14282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_STR_EQ("12", textfield_->text()); 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TextCursorDisplayTest) { 14325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR-RTL string in LTR context. 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = GetCursorBounds().x(); 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prev_x = x; 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('b'); 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(prev_x, x); 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E1); 14465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text()); 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E2); 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text()); 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear text. 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('\n'); 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RTL-LTR string in LTR context. 14605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E1); 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text()); 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetDisplayRect().x(), x); 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E2); 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text()); 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 1472558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text()); 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(prev_x, x); 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('b'); 1478558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text()); 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_LT(prev_x, x); 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TextCursorDisplayInRTLTest) { 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(""); 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR-RTL string in RTL context. 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("a", textfield_->text()); 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x = GetCursorBounds().x(); 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GetDisplayRect().right() - 1, x); 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int prev_x = x; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('b'); 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_STR_EQ("ab", textfield_->text()); 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E1); 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text()); 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(prev_x, x); 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E2); 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text()); 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(prev_x, x); 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 15125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('\n'); 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RTL-LTR string in RTL context. 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E1); 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text()); 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(0x05E2); 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text()); 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_GT(prev_x, x); 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 1527558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text()); 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) prev_x = x; 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('b'); 1533558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text()); 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) x = GetCursorBounds().x(); 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(prev_x, x); 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset locale. 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(locale); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, HitInsideTextAreaTest) { 15425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2")); 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<gfx::Rect> cursor_bounds; 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Save each cursor bound. 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::SelectionModel sel(0, gfx::CURSOR_FORWARD); 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_bounds.push_back(GetCursorBounds(sel)); 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(1, gfx::CURSOR_BACKWARD); 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bound = GetCursorBounds(sel); 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(1, gfx::CURSOR_FORWARD); 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound.x(), GetCursorBounds(sel).x()); 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_bounds.push_back(bound); 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Check that a cursor at the end of the Latin portion of the text is at the 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // same position as a cursor placed at the end of the RTL Hebrew portion. 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(2, gfx::CURSOR_BACKWARD); 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(sel); 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(4, gfx::CURSOR_BACKWARD); 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound.x(), GetCursorBounds(sel).x()); 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_bounds.push_back(bound); 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(3, gfx::CURSOR_BACKWARD); 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(sel); 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(3, gfx::CURSOR_FORWARD); 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound.x(), GetCursorBounds(sel).x()); 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_bounds.push_back(bound); 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(2, gfx::CURSOR_FORWARD); 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(sel); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sel = gfx::SelectionModel(4, gfx::CURSOR_FORWARD); 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound.x(), GetCursorBounds(sel).x()); 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_bounds.push_back(bound); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expected cursor position when clicking left and right of each character. 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t cursor_pos_expected[] = {0, 1, 1, 2, 4, 3, 3, 2}; 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < static_cast<int>(cursor_bounds.size() - 1); ++i) { 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int half_width = (cursor_bounds[i + 1].x() - cursor_bounds[i].x()) / 2; 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(cursor_bounds[i], half_width / 2); 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cursor_pos_expected[index++], textfield_->GetCursorPosition()); 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // To avoid trigger double click. Not using sleep() since it takes longer 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // for the test to run if using sleep(). 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientMouseClick(); 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(cursor_bounds[i + 1], - (half_width / 2)); 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(cursor_pos_expected[index++], textfield_->GetCursorPosition()); 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientMouseClick(); 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, HitOutsideTextAreaTest) { 15975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR-RTL string in LTR context. 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2")); 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bound = GetCursorBounds(); 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, -10); 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, 10); 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientMouseClick(); 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RTL-LTR string in LTR context. 1615558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch textfield_->SetText(WideToUTF16(L"\x05E1\x5E2" L"ab")); 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, 10); 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, -10); 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, HitOutsideTextAreaInRTLTest) { 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(""); 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // RTL-LTR string in RTL context. 1635558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch textfield_->SetText(WideToUTF16(L"\x05E1\x5E2" L"ab")); 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bound = GetCursorBounds(); 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, 10); 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, -10); 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NonClientMouseClick(); 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // LTR-RTL string in RTL context. 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2")); 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_HOME); 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, -10); 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_END); 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bound = GetCursorBounds(); 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MouseClick(bound, 10); 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bound, GetCursorBounds()); 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset locale. 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(locale); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, OverflowTest) { 16655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 str; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 500; ++i) 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(kHebrewLetterSamekh); 1671a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds())); 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test mouse pointing. 1674a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MouseClick(GetCursorBounds(), -1); 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(500U, textfield_->GetCursorPosition()); 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear text. 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('\n'); 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 500; ++i) 16825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(kHebrewLetterSamekh); 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 1684a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds())); 16855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1686a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MouseClick(GetCursorBounds(), -1); 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(501U, textfield_->GetCursorPosition()); 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, OverflowInRTLTest) { 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string locale = l10n_util::GetApplicationLocale(""); 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale("he"); 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 str; 16975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 500; ++i) 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(kHebrewLetterSamekh); 1700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds())); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MouseClick(GetCursorBounds(), 1); 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(501U, textfield_->GetCursorPosition()); 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear text. 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('\n'); 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 500; ++i) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent(kHebrewLetterSamekh); 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendKeyEvent('a'); 1712a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds())); 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1714a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) MouseClick(GetCursorBounds(), 1); 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(500U, textfield_->GetCursorPosition()); 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Reset locale. 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::SetICUDefaultLocale(locale); 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, GetCompositionCharacterBoundsTest) { 17225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::CompositionText composition; 17246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) composition.text = UTF8ToUTF16("abc123"); 17256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const uint32 char_count = static_cast<uint32>(composition.text.length()); 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextInputClient* client = textfield_->GetTextInputClient(); 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Compare the composition character bounds with surrounding cursor bounds. 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (uint32 i = 0; i < char_count; ++i) { 17306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) composition.selection = gfx::Range(i); 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) client->SetCompositionText(composition); 17326e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Point cursor_origin = GetCursorBounds().origin(); 17336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) views::View::ConvertPointToScreen(textfield_, &cursor_origin); 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) composition.selection = gfx::Range(i + 1); 17366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) client->SetCompositionText(composition); 17376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Point next_cursor_bottom_left = GetCursorBounds().bottom_left(); 17386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) views::View::ConvertPointToScreen(textfield_, &next_cursor_bottom_left); 17396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 17406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Rect character; 17416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(client->GetCompositionCharacterBounds(i, &character)); 17426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(character.origin(), cursor_origin) << " i=" << i; 17436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_EQ(character.bottom_right(), next_cursor_bottom_left) << " i=" << i; 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return false if the index is out of range. 17476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Rect rect; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count, &rect)); 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count + 1, &rect)); 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count + 100, &rect)); 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, GetCompositionCharacterBounds_ComplexText) { 17545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 1755a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 17565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::char16 kUtf16Chars[] = { 1757a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // U+0020 SPACE 1758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0x0020, 1759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // U+1F408 (CAT) as surrogate pair 1760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0xd83d, 0xdc08, 1761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // U+5642 as Ideographic Variation Sequences 1762a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0x5642, 0xDB40, 0xDD00, 1763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // U+260E (BLACK TELEPHONE) as Emoji Variation Sequences 1764a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0x260E, 0xFE0F, 1765a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // U+0020 SPACE 1766a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0x0020, 1767a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 1768a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const size_t kUtf16CharsCount = arraysize(kUtf16Chars); 1769a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::CompositionText composition; 1771a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) composition.text.assign(kUtf16Chars, kUtf16Chars + kUtf16CharsCount); 1772a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::TextInputClient* client = textfield_->GetTextInputClient(); 1773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) client->SetCompositionText(composition); 1774a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1775a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Make sure GetCompositionCharacterBounds never fails for index. 1776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect rects[kUtf16CharsCount]; 1777a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) gfx::Rect prev_cursor = GetCursorBounds(); 1778a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (uint32 i = 0; i < kUtf16CharsCount; ++i) 1779a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EXPECT_TRUE(client->GetCompositionCharacterBounds(i, &rects[i])); 1780a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1781a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Here we might expect the following results but it actually depends on how 1782a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Uniscribe or HarfBuzz treats them with given font. 1783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // - rects[1] == rects[2] 1784a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // - rects[3] == rects[4] == rects[5] 1785a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // - rects[6] == rects[7] 1786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 1787a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1788a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// The word we select by double clicking should remain selected regardless of 1789a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// where we drag the mouse afterwards without releasing the left button. 17905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, KeepInitiallySelectedWord) { 17915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 1792a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1793a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("abc def ghi")); 1794a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 179558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(5, 5)); 1796a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const gfx::Rect middle_cursor = GetCursorBounds(); 179758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(0, 0)); 1798a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const gfx::Point beginning = GetCursorBounds().origin(); 1799a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1800a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Double click, but do not release the left button. 1801a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) MouseClick(middle_cursor, 0); 1802a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const gfx::Point middle(middle_cursor.x(), 1803a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) middle_cursor.y() + middle_cursor.height() / 2); 1804a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, middle, middle, 18055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 1806a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 18075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press_event); 180858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Range(4, 7), textfield_->GetSelectedRange()); 1809a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 1810a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Drag the mouse to the beginning of the textfield. 1811a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, beginning, beginning, 18125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 0); 18135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag_event); 181458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(gfx::Range(7, 0), textfield_->GetSelectedRange()); 1815a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)} 1816a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 18175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_LINUX) && !defined(OS_CHROMEOS) 18186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)// flaky: http://crbug.com/396477 18196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(TextfieldTest, DISABLED_SelectionClipboard) { 18205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 18215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("0123")); 18225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point point_1(GetCursorPositionX(1), 0); 18235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point point_2(GetCursorPositionX(2), 0); 18245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point point_3(GetCursorPositionX(3), 0); 18255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point point_4(GetCursorPositionX(4), 0); 18265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Text selected by the mouse should be placed on the selection clipboard. 18285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent press(ui::ET_MOUSE_PRESSED, point_1, point_1, 18295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 18305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press); 18315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, point_3, point_3, 18325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 18335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseDragged(drag); 18345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent release(ui::ET_MOUSE_RELEASED, point_3, point_3, 18355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 18365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release); 18375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(1, 3), textfield_->GetSelectedRange()); 18385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("12", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 18395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Select-all should update the selection clipboard. 18415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendKeyEvent(ui::VKEY_A, false, true); 18425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(0, 4), textfield_->GetSelectedRange()); 18435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1844c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 18455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shift-click selection modifications should update the clipboard. 18475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NonClientMouseClick(); 18485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent press_2(ui::ET_MOUSE_PRESSED, point_2, point_2, 18495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 18505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) press_2.set_flags(press_2.flags() | ui::EF_SHIFT_DOWN); 18515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(USE_X11) 18525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ui::UpdateX11EventForFlags(&press_2); 18535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif 18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press_2); 18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent release_2(ui::ET_MOUSE_RELEASED, point_2, point_2, 18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 18575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release_2); 18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(0, 2), textfield_->GetSelectedRange()); 18595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("01", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1860c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 18615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Shift-Left/Right should update the selection clipboard. 18635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, false); 18645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("012", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1865c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 18665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, true, false); 18675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("01", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1868c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 18695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendKeyEvent(ui::VKEY_RIGHT, true, true); 18705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1871c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 18725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Moving the cursor without a selection should not change the clipboard. 18745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SendKeyEvent(ui::VKEY_LEFT, false, false); 18755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(0, 0), textfield_->GetSelectedRange()); 18765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1877c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 18785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Middle clicking should paste at the mouse (not cursor) location. 18805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent middle(ui::ET_MOUSE_PRESSED, point_4, point_4, 18815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_MIDDLE_MOUSE_BUTTON, ui::EF_MIDDLE_MOUSE_BUTTON); 18825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(middle); 18835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("01230123", textfield_->text()); 18845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(0, 0), textfield_->GetSelectedRange()); 18855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 18865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Middle click pasting should adjust trailing cursors. 18885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SelectRange(gfx::Range(5, 5)); 18895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(middle); 18905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("012301230123", textfield_->text()); 18915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(9, 9), textfield_->GetSelectedRange()); 18925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Middle click pasting should adjust trailing selections. 18945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SelectRange(gfx::Range(7, 9)); 18955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(middle); 18965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123012301230123", textfield_->text()); 18975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(11, 13), textfield_->GetSelectedRange()); 18985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 18995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Middle clicking in the selection should clear the clipboard and selection. 19005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SelectRange(gfx::Range(2, 6)); 19015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(middle); 19025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("0123012301230123", textfield_->text()); 19035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(6, 6), textfield_->GetSelectedRange()); 19045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION).empty()); 19055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Double and triple clicking should update the clipboard contents. 19075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("ab cd ef")); 19085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::Point word(GetCursorPositionX(4), 0); 19095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent press_word(ui::ET_MOUSE_PRESSED, word, word, 19105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON); 19115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press_word); 19125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent release_word(ui::ET_MOUSE_RELEASED, word, word, 19135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON, 19145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 19155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release_word); 19165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED, word, word, 19175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK, 19185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::EF_LEFT_MOUSE_BUTTON); 19195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(double_click); 19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release_word); 19215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(3, 5), textfield_->GetSelectedRange()); 19225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("cd", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1923c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 19245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMousePressed(press_word); 19255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnMouseReleased(release_word); 19265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(gfx::Range(0, 8), textfield_->GetSelectedRange()); 19275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_STR_EQ("ab cd ef", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1928c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_SELECTION, GetAndResetCopiedToClipboard()); 1929c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1930c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Selecting a range of text without any user interaction should not change 1931c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // the clipboard content. 1932c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch textfield_->SelectRange(gfx::Range(0, 3)); 1933c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_STR_EQ("ab ", textfield_->GetSelectedText()); 1934c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_STR_EQ("ab cd ef", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1935c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 1936c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 1937c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SetClipboardText(ui::CLIPBOARD_TYPE_SELECTION, "other"); 1938c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch textfield_->SelectAll(false); 1939c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_STR_EQ("other", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION)); 1940c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ui::CLIPBOARD_TYPE_LAST, GetAndResetCopiedToClipboard()); 19415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 19425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 19435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 19445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Touch selection and dragging currently only works for chromeos. 19452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS) 19465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TouchSelectionAndDraggingTest) { 19475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 19482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 1949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 19505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const int x = GetCursorPositionX(2); 19512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing); 19522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Tapping on the textfield should turn on the TouchSelectionController. 19541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::GestureEventDetails tap_details(ui::ET_GESTURE_TAP); 19551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci tap_details.set_tap_count(1); 19561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest tap(x, 0, tap_details); 19575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnGestureEvent(&tap); 1958cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(test_api_->touch_selection_controller()); 19592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Un-focusing the textfield should reset the TouchSelectionController 19615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->GetFocusManager()->ClearFocus(); 1962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 19635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) textfield_->RequestFocus(); 19642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // With touch editing enabled, long press should not show context menu. 19662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Instead, select word and invoke TouchSelectionController. 19671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest long_press_1( 19681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); 19695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) textfield_->OnGestureEvent(&long_press_1); 19702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); 1971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(test_api_->touch_selection_controller()); 19725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(long_press_1.handled()); 19732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // With touch drag drop enabled, long pressing in the selected region should 19755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // start a drag and remove TouchSelectionController. 19765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_TRUE(switches::IsTouchDragDropEnabled()); 19771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest long_press_2( 19781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); 19795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) textfield_->OnGestureEvent(&long_press_2); 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); 1981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 19825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(long_press_2.handled()); 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // After disabling touch drag drop, long pressing again in the selection 19855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // region should not do anything. 19862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch( 19875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switches::kDisableTouchDragDrop); 19885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ASSERT_FALSE(switches::IsTouchDragDropEnabled()); 19891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest long_press_3( 19901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci x, 0, ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); 19915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) textfield_->OnGestureEvent(&long_press_3); 19922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_STR_EQ("hello", textfield_->GetSelectedText()); 1993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 19945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(long_press_3.handled()); 1995a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 19986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(TextfieldTest, TouchSelectionInUnfocusableTextfield) { 19996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing); 20006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) InitTextfield(); 20026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->SetText(ASCIIToUTF16("hello world")); 20036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) gfx::Point touch_point(GetCursorPositionX(2), 0); 20046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Disable textfield and tap on it. Touch text selection should not get 20066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // activated. 20076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->SetEnabled(false); 20086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Tap(touch_point); 20096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 20106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->SetEnabled(true); 20116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Make textfield unfocusable and tap on it. Touch text selection should not 20136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // get activated. 20146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->SetFocusable(false); 20156e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) Tap(touch_point); 20166e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(textfield_->HasFocus()); 20176e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(test_api_->touch_selection_controller()); 20186e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) textfield_->SetFocusable(true); 20196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 20206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 20215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Long_Press gesture in Textfield can initiate a drag and drop now. 20225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, TestLongPressInitiatesDragDrop) { 20235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 2024eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch textfield_->SetText(ASCIIToUTF16("Hello string world")); 2025eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2026eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Ensure the textfield will provide selected text for drag data. 202758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) textfield_->SelectRange(gfx::Range(6, 12)); 2028eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Point kStringPoint(GetCursorPositionX(9), 0); 2029eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2030eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Enable touch-drag-drop to make long press effective. 2031eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CommandLine::ForCurrentProcess()->AppendSwitch( 2032eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch switches::kEnableTouchDragDrop); 2033eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2034eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a long press event in the selected region should start a drag. 20351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GestureEventForTest long_press( 20361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kStringPoint.x(), 20371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci kStringPoint.y(), 20381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::GestureEventDetails(ui::ET_GESTURE_LONG_PRESS)); 20395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) textfield_->OnGestureEvent(&long_press); 20405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint, 20415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kStringPoint)); 2042eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 20433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 20445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(TextfieldTest, GetTextfieldBaseline_FontFallbackTest) { 20455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InitTextfield(); 20463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) textfield_->SetText(UTF8ToUTF16("abc")); 20473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const int old_baseline = textfield_->GetBaseline(); 20483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 20493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Set text which may fall back to a font which has taller baseline than 20500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // the default font. 20513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) textfield_->SetText(UTF8ToUTF16("\xE0\xB9\x91")); 20523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const int new_baseline = textfield_->GetBaseline(); 20533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 20540f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) // Regardless of the text, the baseline must be the same. 20550f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) EXPECT_EQ(new_baseline, old_baseline); 20563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 20573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 2058116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that a textfield view can be destroyed from OnKeyEvent() on its 2059116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// controller and it does not crash. 2060116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(TextfieldTest, DestroyingTextfieldFromOnKeyEvent) { 2061116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InitTextfield(); 2062116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2063116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // The controller assumes ownership of the textfield. 2064116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch TextfieldDestroyerController controller(textfield_); 2065116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(controller.target()); 2066116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2067116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Send a key to trigger OnKeyEvent(). 2068116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch SendKeyEvent('X'); 2069116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2070116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_FALSE(controller.target()); 2071116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 2072116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 2074