This source file includes following definitions.
- key_received_
- OnKeyPressed
- OnKeyReleased
- key_handled
- key_received
- clear
- set_text
- text
- GetClipboardText
- SetClipboardText
- on_after_user_action_
- SetUp
- TearDown
- ContentsChanged
- HandleKeyEvent
- OnBeforeUserAction
- OnAfterUserAction
- InitTextfield
- InitTextfields
- GetContextMenuModel
- GetTouchSelectionController
- SendKeyEvent
- SendKeyEvent
- SendKeyEvent
- SendKeyEvent
- GetFocusedView
- GetCursorPositionX
- GetCursorBounds
- GetCursorBounds
- GetDisplayRect
- MouseClick
- NonClientMouseClick
- VerifyTextfieldContextMenuContents
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
- TEST_F
#include "ui/views/controls/textfield/textfield.h"
#include <set>
#include <string>
#include <vector>
#include "base/auto_reset.h"
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/callback.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
#include "base/pickle.h"
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "grit/ui_strings.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/clipboard/clipboard.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/ui_base_switches.h"
#include "ui/base/ui_base_switches_util.h"
#include "ui/events/event.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/render_text.h"
#include "ui/views/controls/textfield/textfield_controller.h"
#include "ui/views/controls/textfield/textfield_model.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/ime/mock_input_method.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/native_widget_private.h"
#include "ui/views/widget/widget.h"
#include "url/gurl.h"
#if defined(OS_WIN)
#include "base/win/windows_version.h"
#endif
using base::ASCIIToUTF16;
using base::UTF8ToUTF16;
using base::WideToUTF16;
#define EXPECT_STR_EQ(ascii, utf16) EXPECT_EQ(ASCIIToUTF16(ascii), utf16)
namespace {
const base::char16 kHebrewLetterSamekh = 0x05E1;
class TestTextfield : public views::Textfield {
public:
TestTextfield() : Textfield(), key_handled_(false), key_received_(false) {}
virtual bool OnKeyPressed(const ui::KeyEvent& e) OVERRIDE {
key_received_ = true;
key_handled_ = views::Textfield::OnKeyPressed(e);
return key_handled_;
}
virtual bool OnKeyReleased(const ui::KeyEvent& e) OVERRIDE {
key_received_ = true;
key_handled_ = views::Textfield::OnKeyReleased(e);
return key_handled_;
}
bool key_handled() const { return key_handled_; }
bool key_received() const { return key_received_; }
void clear() { key_received_ = key_handled_ = false; }
private:
bool key_handled_;
bool key_received_;
DISALLOW_COPY_AND_ASSIGN(TestTextfield);
};
class GetTextHelper {
public:
GetTextHelper() {}
void set_text(const base::string16& text) { text_ = text; }
const base::string16& text() const { return text_; }
private:
base::string16 text_;
DISALLOW_COPY_AND_ASSIGN(GetTextHelper);
};
class GestureEventForTest : public ui::GestureEvent {
public:
GestureEventForTest(ui::EventType type, int x, int y, float delta_x,
float delta_y)
: GestureEvent(type, x, y, 0, base::TimeDelta(),
ui::GestureEventDetails(type, delta_x, delta_y), 0) {
}
private:
DISALLOW_COPY_AND_ASSIGN(GestureEventForTest);
};
base::string16 GetClipboardText(ui::ClipboardType type) {
base::string16 text;
ui::Clipboard::GetForCurrentThread()->ReadText(type, &text);
return text;
}
void SetClipboardText(ui::ClipboardType type, const std::string& text) {
ui::ScopedClipboardWriter(ui::Clipboard::GetForCurrentThread(), type)
.WriteText(ASCIIToUTF16(text));
}
}
namespace views {
class TextfieldTest : public ViewsTestBase, public TextfieldController {
public:
TextfieldTest()
: widget_(NULL),
textfield_(NULL),
model_(NULL),
input_method_(NULL),
on_before_user_action_(0),
on_after_user_action_(0) {
}
virtual void SetUp() {
ViewsTestBase::SetUp();
}
virtual void TearDown() {
if (widget_)
widget_->Close();
ViewsTestBase::TearDown();
}
virtual void ContentsChanged(Textfield* sender,
const base::string16& new_contents) OVERRIDE {
last_contents_ = new_contents;
}
virtual bool HandleKeyEvent(Textfield* sender,
const ui::KeyEvent& key_event) OVERRIDE {
return false;
}
virtual void OnBeforeUserAction(Textfield* sender) OVERRIDE {
++on_before_user_action_;
}
virtual void OnAfterUserAction(Textfield* sender) OVERRIDE {
++on_after_user_action_;
}
void InitTextfield() {
InitTextfields(1);
}
void InitTextfields(int count) {
ASSERT_FALSE(textfield_);
textfield_ = new TestTextfield();
textfield_->set_controller(this);
widget_ = new Widget();
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_POPUP);
params.bounds = gfx::Rect(100, 100, 100, 100);
widget_->Init(params);
View* container = new View();
widget_->SetContentsView(container);
container->AddChildView(textfield_);
textfield_->SetBoundsRect(params.bounds);
textfield_->set_id(1);
for (int i = 1; i < count; i++) {
Textfield* textfield = new Textfield();
container->AddChildView(textfield);
textfield->set_id(i + 1);
}
model_ = textfield_->model_.get();
model_->ClearEditHistory();
input_method_ = new MockInputMethod();
widget_->ReplaceInputMethod(input_method_);
widget_->Activate();
textfield_->RequestFocus();
}
ui::MenuModel* GetContextMenuModel() {
textfield_->UpdateContextMenu();
return textfield_->context_menu_contents_.get();
}
ui::TouchSelectionController* GetTouchSelectionController() {
return textfield_->touch_selection_controller_.get();
}
protected:
void SendKeyEvent(ui::KeyboardCode key_code,
bool alt,
bool shift,
bool control,
bool caps_lock) {
int flags = (alt ? ui::EF_ALT_DOWN : 0) |
(shift ? ui::EF_SHIFT_DOWN : 0) |
(control ? ui::EF_CONTROL_DOWN : 0) |
(caps_lock ? ui::EF_CAPS_LOCK_DOWN : 0);
ui::KeyEvent event(ui::ET_KEY_PRESSED, key_code, flags, false);
input_method_->DispatchKeyEvent(event);
}
void SendKeyEvent(ui::KeyboardCode key_code, bool shift, bool control) {
SendKeyEvent(key_code, false, shift, control, false);
}
void SendKeyEvent(ui::KeyboardCode key_code) {
SendKeyEvent(key_code, false, false);
}
void SendKeyEvent(base::char16 ch) {
if (ch < 0x80) {
ui::KeyboardCode code =
ch == ' ' ? ui::VKEY_SPACE :
static_cast<ui::KeyboardCode>(ui::VKEY_A + ch - 'a');
SendKeyEvent(code);
} else {
ui::KeyEvent event(ui::ET_KEY_PRESSED, ui::VKEY_UNKNOWN, 0, false);
event.set_character(ch);
input_method_->DispatchKeyEvent(event);
}
}
View* GetFocusedView() {
return widget_->GetFocusManager()->GetFocusedView();
}
int GetCursorPositionX(int cursor_pos) {
return textfield_->GetRenderText()->GetCursorBounds(
gfx::SelectionModel(cursor_pos, gfx::CURSOR_FORWARD), false).x();
}
gfx::Rect GetCursorBounds() {
return textfield_->GetRenderText()->GetUpdatedCursorBounds();
}
gfx::Rect GetCursorBounds(const gfx::SelectionModel& sel) {
return textfield_->GetRenderText()->GetCursorBounds(sel, true);
}
gfx::Rect GetDisplayRect() {
return textfield_->GetRenderText()->display_rect();
}
void MouseClick(const gfx::Rect bound, int x_offset) {
gfx::Point point(bound.x() + x_offset, bound.y() + bound.height() / 2);
ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, point, point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseReleased(release);
}
void NonClientMouseClick() {
ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_NON_CLIENT,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_NON_CLIENT,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseReleased(release);
}
void VerifyTextfieldContextMenuContents(bool textfield_has_selection,
bool can_undo,
ui::MenuModel* menu) {
EXPECT_EQ(can_undo, menu->IsEnabledAt(0 ));
EXPECT_TRUE(menu->IsEnabledAt(1 ));
EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(2 ));
EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(3 ));
EXPECT_NE(GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE).empty(),
menu->IsEnabledAt(4 ));
EXPECT_EQ(textfield_has_selection, menu->IsEnabledAt(5 ));
EXPECT_TRUE(menu->IsEnabledAt(6 ));
EXPECT_TRUE(menu->IsEnabledAt(7 ));
}
Widget* widget_;
TestTextfield* textfield_;
TextfieldModel* model_;
base::string16 last_contents_;
MockInputMethod* input_method_;
int on_before_user_action_;
int on_after_user_action_;
private:
DISALLOW_COPY_AND_ASSIGN(TextfieldTest);
};
TEST_F(TextfieldTest, ModelChangesTest) {
InitTextfield();
last_contents_.clear();
textfield_->SetText(ASCIIToUTF16("this is"));
EXPECT_STR_EQ("this is", model_->text());
EXPECT_STR_EQ("this is", textfield_->text());
EXPECT_TRUE(last_contents_.empty());
textfield_->AppendText(ASCIIToUTF16(" a test"));
EXPECT_STR_EQ("this is a test", model_->text());
EXPECT_STR_EQ("this is a test", textfield_->text());
EXPECT_TRUE(last_contents_.empty());
EXPECT_EQ(base::string16(), textfield_->GetSelectedText());
textfield_->SelectAll(false);
EXPECT_STR_EQ("this is a test", textfield_->GetSelectedText());
EXPECT_TRUE(last_contents_.empty());
}
TEST_F(TextfieldTest, KeyTest) {
InitTextfield();
SendKeyEvent(ui::VKEY_T, false, true, false, false);
SendKeyEvent(ui::VKEY_E, false, false, false, false);
SendKeyEvent(ui::VKEY_X, false, true, false, true);
SendKeyEvent(ui::VKEY_T, false, false, false, true);
SendKeyEvent(ui::VKEY_1, false, true, false, false);
SendKeyEvent(ui::VKEY_1, false, false, false, false);
SendKeyEvent(ui::VKEY_1, false, true, false, true);
SendKeyEvent(ui::VKEY_1, false, false, false, true);
EXPECT_STR_EQ("TexT!1!1", textfield_->text());
}
TEST_F(TextfieldTest, ControlAndSelectTest) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("one two three"));
SendKeyEvent(ui::VKEY_HOME, false , false );
SendKeyEvent(ui::VKEY_RIGHT, true, false);
SendKeyEvent(ui::VKEY_RIGHT, true, false);
SendKeyEvent(ui::VKEY_RIGHT, true, false);
EXPECT_STR_EQ("one", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_RIGHT, true, true);
EXPECT_STR_EQ("one two", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_RIGHT, true, true);
EXPECT_STR_EQ("one two three", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_LEFT, true, true);
EXPECT_STR_EQ("one two ", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_LEFT, true, true);
EXPECT_STR_EQ("one ", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_Z, true, false);
SendKeyEvent(ui::VKEY_E, true, false);
SendKeyEvent(ui::VKEY_R, true, false);
SendKeyEvent(ui::VKEY_O, true, false);
SendKeyEvent(ui::VKEY_SPACE, false, false);
EXPECT_STR_EQ("ZERO two three", textfield_->text());
SendKeyEvent(ui::VKEY_END, true, false);
EXPECT_STR_EQ("two three", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_HOME, true, false);
EXPECT_STR_EQ("ZERO ", textfield_->GetSelectedText());
}
TEST_F(TextfieldTest, InsertionDeletionTest) {
InitTextfield();
for (size_t i = 0; i < 10; i++)
SendKeyEvent(static_cast<ui::KeyboardCode>(ui::VKEY_A + i));
EXPECT_STR_EQ("abcdefghij", textfield_->text());
textfield_->SelectRange(gfx::Range(5));
for (int i = 0; i < 3; i++)
SendKeyEvent(ui::VKEY_BACK);
EXPECT_STR_EQ("abfghij", textfield_->text());
for (int i = 0; i < 3; i++)
SendKeyEvent(ui::VKEY_DELETE);
EXPECT_STR_EQ("abij", textfield_->text());
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_K);
EXPECT_STR_EQ("k", textfield_->text());
textfield_->SetText(ASCIIToUTF16("one two three four"));
SendKeyEvent(ui::VKEY_END);
SendKeyEvent(ui::VKEY_BACK, false, false, true, false);
EXPECT_STR_EQ("one two three ", textfield_->text());
SendKeyEvent(ui::VKEY_LEFT, false, false, true, false);
SendKeyEvent(ui::VKEY_BACK, false, true, true, false);
#if defined(OS_LINUX)
EXPECT_STR_EQ("three ", textfield_->text());
#else
EXPECT_STR_EQ("one three ", textfield_->text());
#endif
textfield_->SetText(ASCIIToUTF16("one two three four"));
SendKeyEvent(ui::VKEY_HOME);
SendKeyEvent(ui::VKEY_DELETE, false, false, true, false);
EXPECT_STR_EQ(" two three four", textfield_->text());
SendKeyEvent(ui::VKEY_RIGHT, false, false, true, false);
SendKeyEvent(ui::VKEY_DELETE, false, true, true, false);
#if defined(OS_LINUX)
EXPECT_STR_EQ(" two", textfield_->text());
#else
EXPECT_STR_EQ(" two four", textfield_->text());
#endif
}
TEST_F(TextfieldTest, PasswordTest) {
InitTextfield();
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
EXPECT_TRUE(textfield_->enabled());
EXPECT_TRUE(textfield_->IsFocusable());
last_contents_.clear();
textfield_->SetText(ASCIIToUTF16("password"));
EXPECT_STR_EQ("password", textfield_->text());
EXPECT_TRUE(last_contents_.empty());
model_->SelectAll(false);
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "foo");
EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_CUT));
textfield_->ExecuteCommand(IDS_APP_CUT, 0);
SendKeyEvent(ui::VKEY_X, false, true);
EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_COPY));
textfield_->ExecuteCommand(IDS_APP_COPY, 0);
SendKeyEvent(ui::VKEY_C, false, true);
SendKeyEvent(ui::VKEY_INSERT, false, true);
EXPECT_STR_EQ("foo", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("password", textfield_->text());
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_DELETE, true, false);
EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE));
textfield_->ExecuteCommand(IDS_APP_PASTE, 0);
SendKeyEvent(ui::VKEY_V, false, true);
SendKeyEvent(ui::VKEY_INSERT, true, false);
EXPECT_STR_EQ("foo", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("foofoofoo", textfield_->text());
}
TEST_F(TextfieldTest, TextInputType) {
InitTextfield();
EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, textfield_->GetTextInputType());
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_URL);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_URL, textfield_->GetTextInputType());
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
textfield_->SetReadOnly(true);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, textfield_->GetTextInputType());
textfield_->SetReadOnly(false);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
textfield_->SetEnabled(false);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_NONE, textfield_->GetTextInputType());
textfield_->SetEnabled(true);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_PASSWORD, textfield_->GetTextInputType());
}
TEST_F(TextfieldTest, OnKeyPressReturnValueTest) {
InitTextfield();
SendKeyEvent(ui::VKEY_A);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_LEFT);
EXPECT_TRUE(textfield_->key_received());
EXPECT_TRUE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_RIGHT);
EXPECT_TRUE(textfield_->key_received());
EXPECT_TRUE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_HOME);
EXPECT_TRUE(textfield_->key_received());
EXPECT_TRUE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_END);
EXPECT_TRUE(textfield_->key_received());
EXPECT_TRUE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_F24);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_UP);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
textfield_->clear();
SendKeyEvent(ui::VKEY_DOWN);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
textfield_->clear();
}
TEST_F(TextfieldTest, CursorMovement) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("one two hre "));
SendKeyEvent(ui::VKEY_END);
SendKeyEvent(ui::VKEY_LEFT, false, true);
SendKeyEvent(ui::VKEY_T);
EXPECT_STR_EQ("one two thre ", textfield_->text());
EXPECT_STR_EQ("one two thre ", last_contents_);
SendKeyEvent(ui::VKEY_RIGHT, false, true);
SendKeyEvent(ui::VKEY_E);
EXPECT_STR_EQ("one two three ", textfield_->text());
EXPECT_STR_EQ("one two three ", last_contents_);
SendKeyEvent(ui::VKEY_RIGHT, false, true);
SendKeyEvent(ui::VKEY_BACK);
EXPECT_STR_EQ("one two three", textfield_->text());
EXPECT_STR_EQ("one two three", last_contents_);
textfield_->SetText(ASCIIToUTF16(" ne two"));
SendKeyEvent(ui::VKEY_HOME);
SendKeyEvent(ui::VKEY_RIGHT, false, true);
SendKeyEvent(ui::VKEY_LEFT, false, true);
SendKeyEvent(ui::VKEY_O);
EXPECT_STR_EQ(" one two", textfield_->text());
EXPECT_STR_EQ(" one two", last_contents_);
SendKeyEvent(ui::VKEY_LEFT, false, true);
SendKeyEvent(ui::VKEY_LEFT, false, true);
SendKeyEvent(ui::VKEY_DELETE);
EXPECT_STR_EQ("one two", textfield_->text());
EXPECT_STR_EQ("one two", last_contents_);
}
TEST_F(TextfieldTest, FocusTraversalTest) {
InitTextfields(3);
textfield_->RequestFocus();
EXPECT_EQ(1, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(false);
EXPECT_EQ(2, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(false);
EXPECT_EQ(3, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(false);
EXPECT_EQ(1, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(3, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(2, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(1, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(3, GetFocusedView()->id());
textfield_->RequestFocus();
EXPECT_EQ(1, GetFocusedView()->id());
widget_->GetFocusManager()->AdvanceFocus(true);
EXPECT_EQ(3, GetFocusedView()->id());
ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click);
EXPECT_EQ(1, GetFocusedView()->id());
}
TEST_F(TextfieldTest, ContextMenuDisplayTest) {
InitTextfield();
EXPECT_TRUE(textfield_->context_menu_controller());
textfield_->SetText(ASCIIToUTF16("hello world"));
ui::Clipboard::GetForCurrentThread()->Clear(ui::CLIPBOARD_TYPE_COPY_PASTE);
textfield_->ClearEditHistory();
EXPECT_TRUE(GetContextMenuModel());
VerifyTextfieldContextMenuContents(false, false, GetContextMenuModel());
textfield_->SelectAll(false);
VerifyTextfieldContextMenuContents(true, false, GetContextMenuModel());
SendKeyEvent(ui::VKEY_T);
VerifyTextfieldContextMenuContents(false, true, GetContextMenuModel());
textfield_->SelectAll(false);
VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel());
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test");
VerifyTextfieldContextMenuContents(true, true, GetContextMenuModel());
}
TEST_F(TextfieldTest, DoubleAndTripleClickTest) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
ui::MouseEvent click(ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
ui::MouseEvent double_click(
ui::ET_MOUSE_PRESSED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click);
textfield_->OnMouseReleased(release);
EXPECT_TRUE(textfield_->GetSelectedText().empty());
textfield_->OnMousePressed(double_click);
textfield_->OnMouseReleased(release);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
textfield_->OnMousePressed(click);
textfield_->OnMouseReleased(release);
EXPECT_STR_EQ("hello world", textfield_->GetSelectedText());
textfield_->OnMousePressed(click);
textfield_->OnMouseReleased(release);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
}
TEST_F(TextfieldTest, DragToSelect) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
const int kStart = GetCursorPositionX(5);
const int kEnd = 500;
gfx::Point start_point(kStart, 0);
gfx::Point end_point(kEnd, 0);
ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, start_point, start_point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
ui::MouseEvent click_b(ui::ET_MOUSE_PRESSED, end_point, end_point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
ui::MouseEvent drag_left(ui::ET_MOUSE_DRAGGED, gfx::Point(), gfx::Point(),
ui::EF_LEFT_MOUSE_BUTTON, 0);
ui::MouseEvent drag_right(ui::ET_MOUSE_DRAGGED, end_point, end_point,
ui::EF_LEFT_MOUSE_BUTTON, 0);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, end_point, end_point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click_a);
EXPECT_TRUE(textfield_->GetSelectedText().empty());
textfield_->OnMouseDragged(drag_left);
base::string16 text_left = textfield_->GetSelectedText();
EXPECT_STR_EQ("hello", text_left);
textfield_->OnMouseDragged(drag_right);
base::string16 text_right = textfield_->GetSelectedText();
EXPECT_STR_EQ(" world", text_right);
textfield_->OnMouseReleased(release);
EXPECT_EQ(text_right, textfield_->GetSelectedText());
textfield_->OnMousePressed(click_b);
textfield_->OnMouseDragged(drag_left);
textfield_->OnMouseReleased(release);
EXPECT_EQ(textfield_->text(), textfield_->GetSelectedText());
}
#if defined(OS_WIN)
TEST_F(TextfieldTest, DragAndDrop_AcceptDrop) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
ui::OSExchangeData data;
base::string16 string(ASCIIToUTF16("string "));
data.SetString(string);
int formats = 0;
std::set<OSExchangeData::CustomFormat> custom_formats;
textfield_->SetEnabled(false);
EXPECT_FALSE(textfield_->GetDropFormats(&formats, &custom_formats));
EXPECT_EQ(0, formats);
EXPECT_TRUE(custom_formats.empty());
EXPECT_FALSE(textfield_->CanDrop(data));
textfield_->SetEnabled(true);
textfield_->SetReadOnly(true);
EXPECT_FALSE(textfield_->GetDropFormats(&formats, &custom_formats));
EXPECT_EQ(0, formats);
EXPECT_TRUE(custom_formats.empty());
EXPECT_FALSE(textfield_->CanDrop(data));
textfield_->SetReadOnly(false);
EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats));
EXPECT_EQ(ui::OSExchangeData::STRING, formats);
EXPECT_TRUE(custom_formats.empty());
EXPECT_TRUE(textfield_->CanDrop(data));
gfx::Point drop_point(GetCursorPositionX(6), 0);
ui::DropTargetEvent drop(data, drop_point, drop_point,
ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE);
EXPECT_EQ(ui::DragDropTypes::DRAG_COPY | ui::DragDropTypes::DRAG_MOVE,
textfield_->OnDragUpdated(drop));
EXPECT_EQ(ui::DragDropTypes::DRAG_COPY, textfield_->OnPerformDrop(drop));
EXPECT_STR_EQ("hello string world", textfield_->text());
ui::OSExchangeData bad_data;
bad_data.SetFilename(base::FilePath(FILE_PATH_LITERAL("x")));
ui::OSExchangeData::CustomFormat fmt = ui::Clipboard::GetBitmapFormatType();
bad_data.SetPickledData(fmt, Pickle());
bad_data.SetFileContents(base::FilePath(L"x"), "x");
bad_data.SetHtml(base::string16(ASCIIToUTF16("x")), GURL("x.org"));
ui::OSExchangeData::DownloadFileInfo download(base::FilePath(), NULL);
bad_data.SetDownloadFileInfo(download);
EXPECT_FALSE(textfield_->CanDrop(bad_data));
}
#endif
TEST_F(TextfieldTest, DragAndDrop_InitiateDrag) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello string world"));
base::string16 string;
ui::OSExchangeData data;
const gfx::Range kStringRange(6, 12);
textfield_->SelectRange(kStringRange);
const gfx::Point kStringPoint(GetCursorPositionX(9), 0);
textfield_->WriteDragDataForView(NULL, kStringPoint, &data);
EXPECT_TRUE(data.GetString(&string));
EXPECT_EQ(textfield_->GetSelectedText(), string);
textfield_->SetEnabled(false);
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, kStringPoint));
textfield_->SetEnabled(true);
textfield_->ClearSelection();
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, kStringPoint));
textfield_->SelectRange(kStringRange);
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, kStringPoint));
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_TEXT);
ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, kStringPoint, kStringPoint,
ui::EF_LEFT_MOUSE_BUTTON,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(press_event);
EXPECT_EQ(ui::DragDropTypes::DRAG_NONE,
textfield_->GetDragOperationsForView(NULL, gfx::Point()));
EXPECT_FALSE(textfield_->CanStartDragForView(NULL, gfx::Point(),
gfx::Point()));
EXPECT_EQ(ui::DragDropTypes::DRAG_COPY,
textfield_->GetDragOperationsForView(NULL, kStringPoint));
EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint,
gfx::Point()));
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY,
textfield_->GetDragOperationsForView(textfield_, kStringPoint));
}
TEST_F(TextfieldTest, DragAndDrop_ToTheRight) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
base::string16 string;
ui::OSExchangeData data;
int formats = 0;
int operations = 0;
std::set<OSExchangeData::CustomFormat> custom_formats;
textfield_->SelectRange(gfx::Range(1, 5));
gfx::Point point(GetCursorPositionX(3), 0);
ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click_a);
EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(),
gfx::Point()));
operations = textfield_->GetDragOperationsForView(textfield_,
click_a.location());
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY,
operations);
textfield_->WriteDragDataForView(NULL, click_a.location(), &data);
EXPECT_TRUE(data.GetString(&string));
EXPECT_EQ(textfield_->GetSelectedText(), string);
EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats));
EXPECT_EQ(ui::OSExchangeData::STRING, formats);
EXPECT_TRUE(custom_formats.empty());
const gfx::Point kDropPoint(GetCursorPositionX(7), 0);
EXPECT_TRUE(textfield_->CanDrop(data));
ui::DropTargetEvent drop_a(data, kDropPoint, kDropPoint, operations);
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a));
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a));
EXPECT_STR_EQ("h welloorld", textfield_->text());
textfield_->OnDragDone();
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("hello world", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("hello world", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("h welloorld", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("h welloorld", textfield_->text());
}
TEST_F(TextfieldTest, DragAndDrop_ToTheLeft) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
base::string16 string;
ui::OSExchangeData data;
int formats = 0;
int operations = 0;
std::set<OSExchangeData::CustomFormat> custom_formats;
textfield_->SelectRange(gfx::Range(5, 10));
gfx::Point point(GetCursorPositionX(7), 0);
ui::MouseEvent click_a(ui::ET_MOUSE_PRESSED, point, point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click_a);
EXPECT_TRUE(textfield_->CanStartDragForView(textfield_, click_a.location(),
gfx::Point()));
operations = textfield_->GetDragOperationsForView(textfield_,
click_a.location());
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE | ui::DragDropTypes::DRAG_COPY,
operations);
textfield_->WriteDragDataForView(NULL, click_a.location(), &data);
EXPECT_TRUE(data.GetString(&string));
EXPECT_EQ(textfield_->GetSelectedText(), string);
EXPECT_TRUE(textfield_->GetDropFormats(&formats, &custom_formats));
EXPECT_EQ(ui::OSExchangeData::STRING, formats);
EXPECT_TRUE(custom_formats.empty());
EXPECT_TRUE(textfield_->CanDrop(data));
gfx::Point drop_point(GetCursorPositionX(1), 0);
ui::DropTargetEvent drop_a(data, drop_point, drop_point, operations);
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop_a));
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnPerformDrop(drop_a));
EXPECT_STR_EQ("h worlellod", textfield_->text());
textfield_->OnDragDone();
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("hello world", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("hello world", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("h worlellod", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("h worlellod", textfield_->text());
}
TEST_F(TextfieldTest, DragAndDrop_Canceled) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
textfield_->SelectRange(gfx::Range(6, 10));
gfx::Point point(GetCursorPositionX(8), 0);
ui::MouseEvent click(ui::ET_MOUSE_PRESSED, point, point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(click);
ui::OSExchangeData data;
textfield_->WriteDragDataForView(NULL, click.location(), &data);
EXPECT_TRUE(textfield_->CanDrop(data));
gfx::Point drop_point(GetCursorPositionX(2), 0);
ui::DropTargetEvent drop(data, drop_point, drop_point,
ui::DragDropTypes::DRAG_MOVE);
EXPECT_EQ(ui::DragDropTypes::DRAG_MOVE, textfield_->OnDragUpdated(drop));
gfx::Point drag_point(GetCursorPositionX(9), 0);
ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, drag_point, drag_point,
ui::EF_LEFT_MOUSE_BUTTON, 0);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, drag_point, drag_point,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseDragged(drag);
textfield_->OnMouseReleased(release);
textfield_->OnDragDone();
EXPECT_EQ(ASCIIToUTF16("hello world"), textfield_->text());
}
TEST_F(TextfieldTest, ReadOnlyTest) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("read only"));
textfield_->SetReadOnly(true);
EXPECT_TRUE(textfield_->enabled());
EXPECT_TRUE(textfield_->IsFocusable());
SendKeyEvent(ui::VKEY_HOME);
EXPECT_EQ(0U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_END);
EXPECT_EQ(9U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_LEFT, false, false);
EXPECT_EQ(8U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_LEFT, false, true);
EXPECT_EQ(5U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_LEFT, true, true);
EXPECT_EQ(0U, textfield_->GetCursorPosition());
EXPECT_STR_EQ("read ", textfield_->GetSelectedText());
textfield_->SelectAll(false);
EXPECT_STR_EQ("read only", textfield_->GetSelectedText());
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test");
EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_CUT));
textfield_->ExecuteCommand(IDS_APP_CUT, 0);
SendKeyEvent(ui::VKEY_X, false, true);
SendKeyEvent(ui::VKEY_DELETE, true, false);
EXPECT_STR_EQ("Test", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("read only", textfield_->text());
EXPECT_FALSE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE));
textfield_->ExecuteCommand(IDS_APP_PASTE, 0);
SendKeyEvent(ui::VKEY_V, false, true);
SendKeyEvent(ui::VKEY_INSERT, true, false);
EXPECT_STR_EQ("read only", textfield_->text());
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test");
EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_COPY));
textfield_->ExecuteCommand(IDS_APP_COPY, 0);
EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test");
SendKeyEvent(ui::VKEY_C, false, true);
EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "Test");
SendKeyEvent(ui::VKEY_INSERT, false, true);
EXPECT_STR_EQ("read only", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
textfield_->SetText(ASCIIToUTF16(" four five six "));
EXPECT_STR_EQ(" four five six ", textfield_->text());
textfield_->SelectAll(false);
EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_DELETE);
EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_BACK);
EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
SendKeyEvent(ui::VKEY_T);
EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
}
TEST_F(TextfieldTest, TextInputClientTest) {
InitTextfield();
ui::TextInputClient* client = textfield_->GetTextInputClient();
EXPECT_TRUE(client);
EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, client->GetTextInputType());
textfield_->SetText(ASCIIToUTF16("0123456789"));
gfx::Range range;
EXPECT_TRUE(client->GetTextRange(&range));
EXPECT_EQ(0U, range.start());
EXPECT_EQ(10U, range.end());
EXPECT_TRUE(client->SetSelectionRange(gfx::Range(1, 4)));
EXPECT_TRUE(client->GetSelectionRange(&range));
EXPECT_EQ(gfx::Range(1, 4), range);
#if 0
GetTextHelper helper;
base::Callback<void(base::string16)> callback =
base::Bind(&GetTextHelper::set_text, base::Unretained(&helper));
EXPECT_TRUE(client->GetTextFromRange(range, callback));
EXPECT_STR_EQ("123", helper.text());
#endif
EXPECT_TRUE(client->DeleteRange(range));
EXPECT_STR_EQ("0456789", textfield_->text());
ui::CompositionText composition;
composition.text = UTF8ToUTF16("321");
input_method_->Clear();
input_method_->SetCompositionTextForNextKey(composition);
textfield_->clear();
on_before_user_action_ = on_after_user_action_ = 0;
SendKeyEvent(ui::VKEY_A);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
EXPECT_TRUE(client->HasCompositionText());
EXPECT_TRUE(client->GetCompositionTextRange(&range));
EXPECT_STR_EQ("0321456789", textfield_->text());
EXPECT_EQ(gfx::Range(1, 4), range);
EXPECT_EQ(1, on_before_user_action_);
EXPECT_EQ(1, on_after_user_action_);
input_method_->SetResultTextForNextKey(UTF8ToUTF16("123"));
on_before_user_action_ = on_after_user_action_ = 0;
textfield_->clear();
SendKeyEvent(ui::VKEY_A);
EXPECT_TRUE(textfield_->key_received());
EXPECT_FALSE(textfield_->key_handled());
EXPECT_FALSE(client->HasCompositionText());
EXPECT_FALSE(input_method_->cancel_composition_called());
EXPECT_STR_EQ("0123456789", textfield_->text());
EXPECT_EQ(1, on_before_user_action_);
EXPECT_EQ(1, on_after_user_action_);
input_method_->Clear();
input_method_->SetCompositionTextForNextKey(composition);
textfield_->clear();
SendKeyEvent(ui::VKEY_A);
EXPECT_TRUE(client->HasCompositionText());
EXPECT_STR_EQ("0123321456789", textfield_->text());
on_before_user_action_ = on_after_user_action_ = 0;
textfield_->clear();
SendKeyEvent(ui::VKEY_RIGHT);
EXPECT_FALSE(client->HasCompositionText());
EXPECT_TRUE(input_method_->cancel_composition_called());
EXPECT_TRUE(textfield_->key_received());
EXPECT_TRUE(textfield_->key_handled());
EXPECT_STR_EQ("0123321456789", textfield_->text());
EXPECT_EQ(8U, textfield_->GetCursorPosition());
EXPECT_EQ(1, on_before_user_action_);
EXPECT_EQ(1, on_after_user_action_);
textfield_->clear();
textfield_->SetText(ASCIIToUTF16("0123456789"));
EXPECT_TRUE(client->SetSelectionRange(gfx::Range(5, 5)));
client->ExtendSelectionAndDelete(4, 2);
EXPECT_STR_EQ("0789", textfield_->text());
on_before_user_action_ = on_after_user_action_ = 0;
textfield_->clear();
textfield_->ClearSelection();
textfield_->SelectAll(false);
EXPECT_EQ(0, on_before_user_action_);
EXPECT_EQ(0, on_after_user_action_);
input_method_->Clear();
textfield_->SetReadOnly(true);
EXPECT_TRUE(input_method_->text_input_type_changed());
EXPECT_FALSE(textfield_->GetTextInputClient());
textfield_->SetReadOnly(false);
input_method_->Clear();
textfield_->SetTextInputType(ui::TEXT_INPUT_TYPE_PASSWORD);
EXPECT_TRUE(input_method_->text_input_type_changed());
EXPECT_TRUE(textfield_->GetTextInputClient());
}
TEST_F(TextfieldTest, UndoRedoTest) {
InitTextfield();
SendKeyEvent(ui::VKEY_A);
EXPECT_STR_EQ("a", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("a", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("a", textfield_->text());
textfield_->AppendText(ASCIIToUTF16("b"));
last_contents_.clear();
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("a", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_C);
EXPECT_STR_EQ("abc", textfield_->text());
textfield_->SetText(ASCIIToUTF16("abc"));
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("abc", textfield_->text());
textfield_->SetText(ASCIIToUTF16("123"));
textfield_->SetText(ASCIIToUTF16("123"));
EXPECT_STR_EQ("123", textfield_->text());
SendKeyEvent(ui::VKEY_END, false, false);
SendKeyEvent(ui::VKEY_4, false, false);
EXPECT_STR_EQ("1234", textfield_->text());
last_contents_.clear();
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("123", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("a", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("123", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("1234", textfield_->text());
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent(ui::VKEY_A);
EXPECT_STR_EQ("a", textfield_->text());
SendKeyEvent(ui::VKEY_B);
SendKeyEvent(ui::VKEY_C);
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("1234", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_BACK);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_HOME);
SendKeyEvent(ui::VKEY_DELETE);
EXPECT_STR_EQ("b", textfield_->text());
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent(ui::VKEY_DELETE);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("b", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Z, false, true);
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("ab", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("b", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("", textfield_->text());
SendKeyEvent(ui::VKEY_Y, false, true);
EXPECT_STR_EQ("", textfield_->text());
}
TEST_F(TextfieldTest, CutCopyPaste) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("123"));
textfield_->SelectAll(false);
EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_CUT));
textfield_->ExecuteCommand(IDS_APP_CUT, 0);
EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("", textfield_->text());
textfield_->SetText(ASCIIToUTF16("456"));
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_X, true, false, true, false);
EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("456", textfield_->text());
SendKeyEvent(ui::VKEY_X, false, true);
EXPECT_STR_EQ("456", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("", textfield_->text());
textfield_->SetText(ASCIIToUTF16("123"));
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_DELETE, true, false);
EXPECT_STR_EQ("123", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("", textfield_->text());
textfield_->SetText(ASCIIToUTF16("789"));
textfield_->SelectAll(false);
EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_COPY));
textfield_->ExecuteCommand(IDS_APP_COPY, 0);
EXPECT_STR_EQ("789", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
textfield_->SetText(ASCIIToUTF16("012"));
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_C, true, false, true, false);
EXPECT_STR_EQ("789", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
SendKeyEvent(ui::VKEY_C, false, true);
EXPECT_STR_EQ("012", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
textfield_->SetText(ASCIIToUTF16("345"));
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_INSERT, false, true);
EXPECT_STR_EQ("345", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("345", textfield_->text());
SetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE, "abc");
textfield_->SetText(base::string16());
EXPECT_TRUE(textfield_->IsCommandIdEnabled(IDS_APP_PASTE));
textfield_->ExecuteCommand(IDS_APP_PASTE, 0);
EXPECT_STR_EQ("abc", textfield_->text());
SendKeyEvent(ui::VKEY_V, false, true);
EXPECT_STR_EQ("abcabc", textfield_->text());
SendKeyEvent(ui::VKEY_INSERT, true, false);
EXPECT_STR_EQ("abcabcabc", textfield_->text());
SendKeyEvent(ui::VKEY_V, true, false, true, false);
EXPECT_STR_EQ("abcabcabc", textfield_->text());
textfield_->SelectAll(false);
SendKeyEvent(ui::VKEY_INSERT, true, true);
EXPECT_STR_EQ("abc", GetClipboardText(ui::CLIPBOARD_TYPE_COPY_PASTE));
EXPECT_STR_EQ("abcabcabc", textfield_->text());
}
TEST_F(TextfieldTest, OvertypeMode) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("2"));
SendKeyEvent(ui::VKEY_HOME);
SendKeyEvent(ui::VKEY_INSERT);
SendKeyEvent(ui::VKEY_1, false, false);
EXPECT_STR_EQ("12", textfield_->text());
}
TEST_F(TextfieldTest, TextCursorDisplayTest) {
InitTextfield();
SendKeyEvent('a');
EXPECT_STR_EQ("a", textfield_->text());
int x = GetCursorBounds().x();
int prev_x = x;
SendKeyEvent('b');
EXPECT_STR_EQ("ab", textfield_->text());
x = GetCursorBounds().x();
EXPECT_LT(prev_x, x);
prev_x = x;
SendKeyEvent(0x05E1);
EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
SendKeyEvent(0x05E2);
EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent('\n');
SendKeyEvent(0x05E1);
EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(GetDisplayRect().x(), x);
prev_x = x;
SendKeyEvent(0x05E2);
EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
SendKeyEvent('a');
EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_LT(prev_x, x);
prev_x = x;
SendKeyEvent('b');
EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_LT(prev_x, x);
}
TEST_F(TextfieldTest, TextCursorDisplayInRTLTest) {
std::string locale = l10n_util::GetApplicationLocale("");
base::i18n::SetICUDefaultLocale("he");
InitTextfield();
SendKeyEvent('a');
EXPECT_STR_EQ("a", textfield_->text());
int x = GetCursorBounds().x();
EXPECT_EQ(GetDisplayRect().right() - 1, x);
int prev_x = x;
SendKeyEvent('b');
EXPECT_STR_EQ("ab", textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
SendKeyEvent(0x05E1);
EXPECT_EQ(WideToUTF16(L"ab\x05E1"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_GT(prev_x, x);
prev_x = x;
SendKeyEvent(0x05E2);
EXPECT_EQ(WideToUTF16(L"ab\x05E1\x5E2"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_GT(prev_x, x);
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent('\n');
SendKeyEvent(0x05E1);
EXPECT_EQ(WideToUTF16(L"\x05E1"), textfield_->text());
x = GetCursorBounds().x();
prev_x = x;
SendKeyEvent(0x05E2);
EXPECT_EQ(WideToUTF16(L"\x05E1\x05E2"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_GT(prev_x, x);
prev_x = x;
SendKeyEvent('a');
EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"a"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
prev_x = x;
SendKeyEvent('b');
EXPECT_EQ(WideToUTF16(L"\x05E1\x5E2" L"ab"), textfield_->text());
x = GetCursorBounds().x();
EXPECT_EQ(prev_x, x);
base::i18n::SetICUDefaultLocale(locale);
}
TEST_F(TextfieldTest, HitInsideTextAreaTest) {
InitTextfield();
textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2"));
std::vector<gfx::Rect> cursor_bounds;
gfx::SelectionModel sel(0, gfx::CURSOR_FORWARD);
cursor_bounds.push_back(GetCursorBounds(sel));
sel = gfx::SelectionModel(1, gfx::CURSOR_BACKWARD);
gfx::Rect bound = GetCursorBounds(sel);
sel = gfx::SelectionModel(1, gfx::CURSOR_FORWARD);
EXPECT_EQ(bound.x(), GetCursorBounds(sel).x());
cursor_bounds.push_back(bound);
sel = gfx::SelectionModel(2, gfx::CURSOR_BACKWARD);
bound = GetCursorBounds(sel);
sel = gfx::SelectionModel(4, gfx::CURSOR_BACKWARD);
EXPECT_EQ(bound.x(), GetCursorBounds(sel).x());
cursor_bounds.push_back(bound);
sel = gfx::SelectionModel(3, gfx::CURSOR_BACKWARD);
bound = GetCursorBounds(sel);
sel = gfx::SelectionModel(3, gfx::CURSOR_FORWARD);
EXPECT_EQ(bound.x(), GetCursorBounds(sel).x());
cursor_bounds.push_back(bound);
sel = gfx::SelectionModel(2, gfx::CURSOR_FORWARD);
bound = GetCursorBounds(sel);
sel = gfx::SelectionModel(4, gfx::CURSOR_FORWARD);
EXPECT_EQ(bound.x(), GetCursorBounds(sel).x());
cursor_bounds.push_back(bound);
size_t cursor_pos_expected[] = {0, 1, 1, 2, 4, 3, 3, 2};
int index = 0;
for (int i = 0; i < static_cast<int>(cursor_bounds.size() - 1); ++i) {
int half_width = (cursor_bounds[i + 1].x() - cursor_bounds[i].x()) / 2;
MouseClick(cursor_bounds[i], half_width / 2);
EXPECT_EQ(cursor_pos_expected[index++], textfield_->GetCursorPosition());
NonClientMouseClick();
MouseClick(cursor_bounds[i + 1], - (half_width / 2));
EXPECT_EQ(cursor_pos_expected[index++], textfield_->GetCursorPosition());
NonClientMouseClick();
}
}
TEST_F(TextfieldTest, HitOutsideTextAreaTest) {
InitTextfield();
textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2"));
SendKeyEvent(ui::VKEY_HOME);
gfx::Rect bound = GetCursorBounds();
MouseClick(bound, -10);
EXPECT_EQ(bound, GetCursorBounds());
SendKeyEvent(ui::VKEY_END);
bound = GetCursorBounds();
MouseClick(bound, 10);
EXPECT_EQ(bound, GetCursorBounds());
NonClientMouseClick();
textfield_->SetText(WideToUTF16(L"\x05E1\x5E2" L"ab"));
SendKeyEvent(ui::VKEY_HOME);
bound = GetCursorBounds();
MouseClick(bound, 10);
EXPECT_EQ(bound, GetCursorBounds());
SendKeyEvent(ui::VKEY_END);
bound = GetCursorBounds();
MouseClick(bound, -10);
EXPECT_EQ(bound, GetCursorBounds());
}
TEST_F(TextfieldTest, HitOutsideTextAreaInRTLTest) {
std::string locale = l10n_util::GetApplicationLocale("");
base::i18n::SetICUDefaultLocale("he");
InitTextfield();
textfield_->SetText(WideToUTF16(L"\x05E1\x5E2" L"ab"));
SendKeyEvent(ui::VKEY_HOME);
gfx::Rect bound = GetCursorBounds();
MouseClick(bound, 10);
EXPECT_EQ(bound, GetCursorBounds());
SendKeyEvent(ui::VKEY_END);
bound = GetCursorBounds();
MouseClick(bound, -10);
EXPECT_EQ(bound, GetCursorBounds());
NonClientMouseClick();
textfield_->SetText(WideToUTF16(L"ab\x05E1\x5E2"));
SendKeyEvent(ui::VKEY_HOME);
bound = GetCursorBounds();
MouseClick(bound, -10);
EXPECT_EQ(bound, GetCursorBounds());
SendKeyEvent(ui::VKEY_END);
bound = GetCursorBounds();
MouseClick(bound, 10);
EXPECT_EQ(bound, GetCursorBounds());
base::i18n::SetICUDefaultLocale(locale);
}
TEST_F(TextfieldTest, OverflowTest) {
InitTextfield();
base::string16 str;
for (int i = 0; i < 500; ++i)
SendKeyEvent('a');
SendKeyEvent(kHebrewLetterSamekh);
EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds()));
MouseClick(GetCursorBounds(), -1);
EXPECT_EQ(500U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent('\n');
for (int i = 0; i < 500; ++i)
SendKeyEvent(kHebrewLetterSamekh);
SendKeyEvent('a');
EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds()));
MouseClick(GetCursorBounds(), -1);
EXPECT_EQ(501U, textfield_->GetCursorPosition());
}
TEST_F(TextfieldTest, OverflowInRTLTest) {
std::string locale = l10n_util::GetApplicationLocale("");
base::i18n::SetICUDefaultLocale("he");
InitTextfield();
base::string16 str;
for (int i = 0; i < 500; ++i)
SendKeyEvent('a');
SendKeyEvent(kHebrewLetterSamekh);
EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds()));
MouseClick(GetCursorBounds(), 1);
EXPECT_EQ(501U, textfield_->GetCursorPosition());
SendKeyEvent(ui::VKEY_A, false, true);
SendKeyEvent('\n');
for (int i = 0; i < 500; ++i)
SendKeyEvent(kHebrewLetterSamekh);
SendKeyEvent('a');
EXPECT_TRUE(GetDisplayRect().Contains(GetCursorBounds()));
MouseClick(GetCursorBounds(), 1);
EXPECT_EQ(500U, textfield_->GetCursorPosition());
base::i18n::SetICUDefaultLocale(locale);
}
TEST_F(TextfieldTest, GetCompositionCharacterBoundsTest) {
InitTextfield();
base::string16 str;
const uint32 char_count = 10UL;
ui::CompositionText composition;
composition.text = UTF8ToUTF16("0123456789");
ui::TextInputClient* client = textfield_->GetTextInputClient();
gfx::Rect rect;
EXPECT_FALSE(client->GetCompositionCharacterBounds(0, &rect));
gfx::Rect char_rect_in_screen_coord[char_count];
gfx::Rect prev_cursor = GetCursorBounds();
for (uint32 i = 0; i < char_count; ++i) {
composition.selection = gfx::Range(0, i+1);
client->SetCompositionText(composition);
EXPECT_TRUE(client->HasCompositionText()) << " i=" << i;
gfx::Rect cursor_bounds = GetCursorBounds();
gfx::Point top_left(prev_cursor.x(), prev_cursor.y());
gfx::Point bottom_right(cursor_bounds.x(), prev_cursor.bottom());
views::View::ConvertPointToScreen(textfield_, &top_left);
views::View::ConvertPointToScreen(textfield_, &bottom_right);
char_rect_in_screen_coord[i].set_origin(top_left);
char_rect_in_screen_coord[i].set_width(bottom_right.x() - top_left.x());
char_rect_in_screen_coord[i].set_height(bottom_right.y() - top_left.y());
prev_cursor = cursor_bounds;
}
for (uint32 i = 0; i < char_count; ++i) {
gfx::Rect actual_rect;
EXPECT_TRUE(client->GetCompositionCharacterBounds(i, &actual_rect))
<< " i=" << i;
EXPECT_EQ(char_rect_in_screen_coord[i], actual_rect) << " i=" << i;
}
EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count, &rect));
EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count + 1, &rect));
EXPECT_FALSE(client->GetCompositionCharacterBounds(char_count + 100, &rect));
}
TEST_F(TextfieldTest, GetCompositionCharacterBounds_ComplexText) {
InitTextfield();
const base::char16 kUtf16Chars[] = {
0x0020,
0xd83d, 0xdc08,
0x5642, 0xDB40, 0xDD00,
0x260E, 0xFE0F,
0x0020,
};
const size_t kUtf16CharsCount = arraysize(kUtf16Chars);
ui::CompositionText composition;
composition.text.assign(kUtf16Chars, kUtf16Chars + kUtf16CharsCount);
ui::TextInputClient* client = textfield_->GetTextInputClient();
client->SetCompositionText(composition);
gfx::Rect rects[kUtf16CharsCount];
gfx::Rect prev_cursor = GetCursorBounds();
for (uint32 i = 0; i < kUtf16CharsCount; ++i)
EXPECT_TRUE(client->GetCompositionCharacterBounds(i, &rects[i]));
}
TEST_F(TextfieldTest, KeepInitiallySelectedWord) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("abc def ghi"));
textfield_->SelectRange(gfx::Range(5, 5));
const gfx::Rect middle_cursor = GetCursorBounds();
textfield_->SelectRange(gfx::Range(0, 0));
const gfx::Point beginning = GetCursorBounds().origin();
MouseClick(middle_cursor, 0);
const gfx::Point middle(middle_cursor.x(),
middle_cursor.y() + middle_cursor.height() / 2);
ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, middle, middle,
ui::EF_LEFT_MOUSE_BUTTON,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(press_event);
EXPECT_EQ(gfx::Range(4, 7), textfield_->GetSelectedRange());
ui::MouseEvent drag_event(ui::ET_MOUSE_DRAGGED, beginning, beginning,
ui::EF_LEFT_MOUSE_BUTTON, 0);
textfield_->OnMouseDragged(drag_event);
EXPECT_EQ(gfx::Range(7, 0), textfield_->GetSelectedRange());
}
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
TEST_F(TextfieldTest, SelectionClipboard) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("0123"));
gfx::Point point_1(GetCursorPositionX(1), 0);
gfx::Point point_2(GetCursorPositionX(2), 0);
gfx::Point point_3(GetCursorPositionX(3), 0);
gfx::Point point_4(GetCursorPositionX(4), 0);
ui::MouseEvent press(ui::ET_MOUSE_PRESSED, point_1, point_1,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(press);
ui::MouseEvent drag(ui::ET_MOUSE_DRAGGED, point_3, point_3,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseDragged(drag);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, point_3, point_3,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseReleased(release);
EXPECT_EQ(gfx::Range(1, 3), textfield_->GetSelectedRange());
EXPECT_STR_EQ("12", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
SendKeyEvent(ui::VKEY_A, false, true);
EXPECT_EQ(gfx::Range(0, 4), textfield_->GetSelectedRange());
EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
NonClientMouseClick();
ui::MouseEvent press_2(ui::ET_MOUSE_PRESSED, point_2, point_2,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
press_2.set_flags(press_2.flags() | ui::EF_SHIFT_DOWN);
textfield_->OnMousePressed(press_2);
ui::MouseEvent release_2(ui::ET_MOUSE_RELEASED, point_2, point_2,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseReleased(release_2);
EXPECT_EQ(gfx::Range(0, 2), textfield_->GetSelectedRange());
EXPECT_STR_EQ("01", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
SendKeyEvent(ui::VKEY_RIGHT, true, false);
EXPECT_STR_EQ("012", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
SendKeyEvent(ui::VKEY_LEFT, true, false);
EXPECT_STR_EQ("01", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
SendKeyEvent(ui::VKEY_RIGHT, true, true);
EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
SendKeyEvent(ui::VKEY_LEFT, false, false);
EXPECT_EQ(gfx::Range(0, 0), textfield_->GetSelectedRange());
EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
ui::MouseEvent middle(ui::ET_MOUSE_PRESSED, point_4, point_4,
ui::EF_MIDDLE_MOUSE_BUTTON, ui::EF_MIDDLE_MOUSE_BUTTON);
textfield_->OnMousePressed(middle);
EXPECT_STR_EQ("01230123", textfield_->text());
EXPECT_EQ(gfx::Range(0, 0), textfield_->GetSelectedRange());
EXPECT_STR_EQ("0123", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
textfield_->SelectRange(gfx::Range(5, 5));
textfield_->OnMousePressed(middle);
EXPECT_STR_EQ("012301230123", textfield_->text());
EXPECT_EQ(gfx::Range(9, 9), textfield_->GetSelectedRange());
textfield_->SelectRange(gfx::Range(7, 9));
textfield_->OnMousePressed(middle);
EXPECT_STR_EQ("0123012301230123", textfield_->text());
EXPECT_EQ(gfx::Range(11, 13), textfield_->GetSelectedRange());
textfield_->SelectRange(gfx::Range(2, 6));
textfield_->OnMousePressed(middle);
EXPECT_STR_EQ("0123012301230123", textfield_->text());
EXPECT_EQ(gfx::Range(6, 6), textfield_->GetSelectedRange());
EXPECT_TRUE(GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION).empty());
textfield_->SetText(ASCIIToUTF16("ab cd ef"));
gfx::Point word(GetCursorPositionX(4), 0);
ui::MouseEvent press_word(ui::ET_MOUSE_PRESSED, word, word,
ui::EF_LEFT_MOUSE_BUTTON, ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(press_word);
ui::MouseEvent release_word(ui::ET_MOUSE_RELEASED, word, word,
ui::EF_LEFT_MOUSE_BUTTON,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMouseReleased(release_word);
ui::MouseEvent double_click(ui::ET_MOUSE_PRESSED, word, word,
ui::EF_LEFT_MOUSE_BUTTON | ui::EF_IS_DOUBLE_CLICK,
ui::EF_LEFT_MOUSE_BUTTON);
textfield_->OnMousePressed(double_click);
textfield_->OnMouseReleased(release_word);
EXPECT_EQ(gfx::Range(3, 5), textfield_->GetSelectedRange());
EXPECT_STR_EQ("cd", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
textfield_->OnMousePressed(press_word);
textfield_->OnMouseReleased(release_word);
EXPECT_EQ(gfx::Range(0, 8), textfield_->GetSelectedRange());
EXPECT_STR_EQ("ab cd ef", GetClipboardText(ui::CLIPBOARD_TYPE_SELECTION));
}
#endif
#if defined(OS_CHROMEOS)
TEST_F(TextfieldTest, TouchSelectionAndDraggingTest) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
EXPECT_FALSE(GetTouchSelectionController());
const int x = GetCursorPositionX(2);
GestureEventForTest tap(ui::ET_GESTURE_TAP, x, 0, 1.0f, 0.0f);
GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, x, 0, 0.0f, 0.0f);
GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS, x, 0, 0.0f, 0.0f);
CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing);
textfield_->OnGestureEvent(&tap);
EXPECT_TRUE(GetTouchSelectionController());
textfield_->GetFocusManager()->ClearFocus();
EXPECT_FALSE(GetTouchSelectionController());
textfield_->OnGestureEvent(&tap_down);
textfield_->OnGestureEvent(&long_press);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
EXPECT_TRUE(GetTouchSelectionController());
ASSERT_TRUE(switches::IsTouchDragDropEnabled());
textfield_->OnGestureEvent(&tap_down);
textfield_->OnGestureEvent(&long_press);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
EXPECT_FALSE(GetTouchSelectionController());
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kDisableTouchDragDrop);
ASSERT_FALSE(switches::IsTouchDragDropEnabled());
textfield_->OnGestureEvent(&tap_down);
textfield_->OnGestureEvent(&long_press);
EXPECT_STR_EQ("hello", textfield_->GetSelectedText());
EXPECT_TRUE(GetTouchSelectionController());
EXPECT_TRUE(long_press.handled());
}
TEST_F(TextfieldTest, TouchScrubbingSelection) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("hello world"));
EXPECT_FALSE(GetTouchSelectionController());
CommandLine::ForCurrentProcess()->AppendSwitch(switches::kEnableTouchEditing);
int scrubbing_start = GetCursorPositionX(1);
int scrubbing_end = GetCursorPositionX(6);
GestureEventForTest tap_down(ui::ET_GESTURE_TAP_DOWN, scrubbing_start, 0,
0.0f, 0.0f);
textfield_->OnGestureEvent(&tap_down);
GestureEventForTest tap_cancel(ui::ET_GESTURE_TAP_CANCEL, scrubbing_start, 0,
0.0f, 0.0f);
textfield_->OnGestureEvent(&tap_cancel);
GestureEventForTest scroll_begin(ui::ET_GESTURE_SCROLL_BEGIN, scrubbing_start,
0, 0.0f, 0.0f);
textfield_->OnGestureEvent(&scroll_begin);
GestureEventForTest scroll_update(ui::ET_GESTURE_SCROLL_UPDATE, scrubbing_end,
0, scrubbing_end - scrubbing_start, 0.0f);
textfield_->OnGestureEvent(&scroll_update);
GestureEventForTest scroll_end(ui::ET_GESTURE_SCROLL_END, scrubbing_end, 0,
0.0f, 0.0f);
textfield_->OnGestureEvent(&scroll_end);
GestureEventForTest end(ui::ET_GESTURE_END, scrubbing_end, 0, 0.0f, 0.0f);
textfield_->OnGestureEvent(&end);
EXPECT_STR_EQ("ello ", textfield_->GetSelectedText());
EXPECT_TRUE(GetTouchSelectionController());
}
#endif
TEST_F(TextfieldTest, TestLongPressInitiatesDragDrop) {
InitTextfield();
textfield_->SetText(ASCIIToUTF16("Hello string world"));
textfield_->SelectRange(gfx::Range(6, 12));
const gfx::Point kStringPoint(GetCursorPositionX(9), 0);
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableTouchDragDrop);
GestureEventForTest long_press(ui::ET_GESTURE_LONG_PRESS, kStringPoint.x(),
kStringPoint.y(), 0.0f, 0.0f);
textfield_->OnGestureEvent(&long_press);
EXPECT_TRUE(textfield_->CanStartDragForView(NULL, kStringPoint,
kStringPoint));
}
TEST_F(TextfieldTest, GetTextfieldBaseline_FontFallbackTest) {
InitTextfield();
textfield_->SetText(UTF8ToUTF16("abc"));
const int old_baseline = textfield_->GetBaseline();
textfield_->SetText(UTF8ToUTF16("\xE0\xB9\x91"));
const int new_baseline = textfield_->GetBaseline();
EXPECT_EQ(new_baseline, old_baseline);
}
}