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