| Index: views/controls/textfield/native_textfield_views_unittest.cc
|
| diff --git a/views/controls/textfield/native_textfield_views_unittest.cc b/views/controls/textfield/native_textfield_views_unittest.cc
|
| index 7e2bab45e5016c45e89aaad6071c9e194bf00054..92f0e258a1a68fba2c962bfc7b963272921c4019 100644
|
| --- a/views/controls/textfield/native_textfield_views_unittest.cc
|
| +++ b/views/controls/textfield/native_textfield_views_unittest.cc
|
| @@ -3,6 +3,9 @@
|
| // found in the LICENSE file.
|
|
|
| #include "base/auto_reset.h"
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +#include "base/callback.h"
|
| #include "base/message_loop.h"
|
| #include "base/utf_string_conversions.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -16,11 +19,74 @@
|
| #include "views/controls/textfield/textfield_views_model.h"
|
| #include "views/events/event.h"
|
| #include "views/focus/focus_manager.h"
|
| +#include "views/ime/mock_input_method.h"
|
| +#include "views/ime/text_input_client.h"
|
| #include "views/test/test_views_delegate.h"
|
| #include "views/test/views_test_base.h"
|
| #include "views/views_delegate.h"
|
| +#include "views/widget/native_widget.h"
|
| #include "views/widget/widget.h"
|
|
|
| +namespace {
|
| +
|
| +// A wrapper of Textfield to intercept the result of OnKeyPressed() and
|
| +// OnKeyReleased() methods.
|
| +class TestTextfield : public views::Textfield {
|
| + public:
|
| + TestTextfield()
|
| + : key_handled_(false),
|
| + key_received_(false) {
|
| + }
|
| +
|
| + explicit TestTextfield(StyleFlags style)
|
| + : Textfield(style),
|
| + key_handled_(false),
|
| + key_received_(false) {
|
| + }
|
| +
|
| + virtual bool OnKeyPressed(const views::KeyEvent& e) OVERRIDE {
|
| + key_received_ = true;
|
| + key_handled_ = views::Textfield::OnKeyPressed(e);
|
| + return key_handled_;
|
| + }
|
| +
|
| + virtual bool OnKeyReleased(const views::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);
|
| +};
|
| +
|
| +// A helper class for use with TextInputClient::GetTextFromRange().
|
| +class GetTextHelper {
|
| + public:
|
| + GetTextHelper() {
|
| + }
|
| +
|
| + void set_text(const string16& text) { text_ = text; }
|
| + const string16& text() const { return text_; }
|
| +
|
| + private:
|
| + string16 text_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(GetTextHelper);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| namespace views {
|
|
|
| // Convert to Wide so that the printed string will be readable when
|
| @@ -40,7 +106,10 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
| : widget_(NULL),
|
| textfield_(NULL),
|
| textfield_view_(NULL),
|
| - model_(NULL) {
|
| + model_(NULL),
|
| + input_method_(NULL),
|
| + on_before_user_action_(0),
|
| + on_after_user_action_(0) {
|
| }
|
|
|
| // ::testing::Test:
|
| @@ -57,7 +126,8 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
|
|
| // TextfieldController:
|
| virtual void ContentsChanged(Textfield* sender,
|
| - const string16& new_contents){
|
| + const string16& new_contents) {
|
| + ASSERT_NE(last_contents_, new_contents);
|
| last_contents_ = new_contents;
|
| }
|
|
|
| @@ -68,13 +138,21 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
| return false;
|
| }
|
|
|
| + virtual void OnBeforeUserAction(Textfield* sender) {
|
| + ++on_before_user_action_;
|
| + }
|
| +
|
| + virtual void OnAfterUserAction(Textfield* sender) {
|
| + ++on_after_user_action_;
|
| + }
|
| +
|
| void InitTextfield(Textfield::StyleFlags style) {
|
| InitTextfields(style, 1);
|
| }
|
|
|
| void InitTextfields(Textfield::StyleFlags style, int count) {
|
| ASSERT_FALSE(textfield_);
|
| - textfield_ = new Textfield(style);
|
| + textfield_ = new TestTextfield(style);
|
| textfield_->SetController(this);
|
| Widget::CreateParams params(Widget::CreateParams::TYPE_POPUP);
|
| params.mirror_origin_in_rtl = false;
|
| @@ -96,6 +174,14 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
|
|
| DCHECK(textfield_view_);
|
| model_ = textfield_view_->model_.get();
|
| +
|
| + input_method_ = new MockInputMethod();
|
| + widget_->native_widget()->ReplaceInputMethod(input_method_);
|
| +
|
| + // Assumes the Widget is always focused.
|
| + input_method_->OnFocus();
|
| +
|
| + textfield_->RequestFocus();
|
| }
|
|
|
| views::Menu2* GetContextMenu() {
|
| @@ -108,25 +194,23 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
| }
|
|
|
| protected:
|
| - bool SendKeyEventToTextfieldViews(ui::KeyboardCode key_code,
|
| - bool shift,
|
| - bool control,
|
| - bool capslock) {
|
| + void SendKeyEvent(ui::KeyboardCode key_code,
|
| + bool shift,
|
| + bool control,
|
| + bool capslock) {
|
| int flags = (shift ? ui::EF_SHIFT_DOWN : 0) |
|
| (control ? ui::EF_CONTROL_DOWN : 0) |
|
| (capslock ? ui::EF_CAPS_LOCK_DOWN : 0);
|
| KeyEvent event(ui::ET_KEY_PRESSED, key_code, flags);
|
| - return textfield_->OnKeyPressed(event);
|
| + input_method_->DispatchKeyEvent(event);
|
| }
|
|
|
| - bool SendKeyEventToTextfieldViews(ui::KeyboardCode key_code,
|
| - bool shift,
|
| - bool control) {
|
| - return SendKeyEventToTextfieldViews(key_code, shift, control, false);
|
| + void SendKeyEvent(ui::KeyboardCode key_code, bool shift, bool control) {
|
| + SendKeyEvent(key_code, shift, control, false);
|
| }
|
|
|
| - bool SendKeyEventToTextfieldViews(ui::KeyboardCode key_code) {
|
| - return SendKeyEventToTextfieldViews(key_code, false, false);
|
| + void SendKeyEvent(ui::KeyboardCode key_code) {
|
| + SendKeyEvent(key_code, false, false);
|
| }
|
|
|
| View* GetFocusedView() {
|
| @@ -136,62 +220,66 @@ class NativeTextfieldViewsTest : public ViewsTestBase,
|
| // We need widget to populate wrapper class.
|
| Widget* widget_;
|
|
|
| - Textfield* textfield_;
|
| + TestTextfield* textfield_;
|
| NativeTextfieldViews* textfield_view_;
|
| TextfieldViewsModel* model_;
|
|
|
| // The string from Controller::ContentsChanged callback.
|
| string16 last_contents_;
|
|
|
| + // For testing input method related behaviors.
|
| + MockInputMethod* input_method_;
|
| +
|
| + // Indicates how many times OnBeforeUserAction() is called.
|
| + int on_before_user_action_;
|
| +
|
| + // Indicates how many times OnAfterUserAction() is called.
|
| + int on_after_user_action_;
|
| +
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(NativeTextfieldViewsTest);
|
| };
|
|
|
| -TEST_F(NativeTextfieldViewsTest, ModelChangesTeset) {
|
| +TEST_F(NativeTextfieldViewsTest, ModelChangesTest) {
|
| InitTextfield(Textfield::STYLE_DEFAULT);
|
| +
|
| + // TextfieldController::ContentsChanged() shouldn't be called when changing
|
| + // text programmatically.
|
| + last_contents_.clear();
|
| textfield_->SetText(ASCIIToUTF16("this is"));
|
|
|
| EXPECT_STR_EQ("this is", model_->text());
|
| - EXPECT_STR_EQ("this is", last_contents_);
|
| - last_contents_.clear();
|
| + 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", last_contents_);
|
| - last_contents_.clear();
|
| -
|
| - // Cases where the callback should not be called.
|
| - textfield_->SetText(ASCIIToUTF16("this is a test"));
|
| - EXPECT_STR_EQ("this is a test", model_->text());
|
| - EXPECT_EQ(string16(), last_contents_);
|
| -
|
| - textfield_->AppendText(string16());
|
| - EXPECT_STR_EQ("this is a test", model_->text());
|
| - EXPECT_EQ(string16(), last_contents_);
|
| + EXPECT_STR_EQ("this is a test", textfield_->text());
|
| + EXPECT_TRUE(last_contents_.empty());
|
|
|
| EXPECT_EQ(string16(), textfield_->GetSelectedText());
|
| textfield_->SelectAll();
|
| EXPECT_STR_EQ("this is a test", textfield_->GetSelectedText());
|
| - EXPECT_EQ(string16(), last_contents_);
|
| + EXPECT_TRUE(last_contents_.empty());
|
| }
|
|
|
| TEST_F(NativeTextfieldViewsTest, KeyTest) {
|
| InitTextfield(Textfield::STYLE_DEFAULT);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_C, true, false);
|
| + SendKeyEvent(ui::VKEY_C, true, false);
|
| EXPECT_STR_EQ("C", textfield_->text());
|
| EXPECT_STR_EQ("C", last_contents_);
|
| last_contents_.clear();
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_R, false, false);
|
| + SendKeyEvent(ui::VKEY_R, false, false);
|
| EXPECT_STR_EQ("Cr", textfield_->text());
|
| EXPECT_STR_EQ("Cr", last_contents_);
|
|
|
| textfield_->SetText(ASCIIToUTF16(""));
|
| - SendKeyEventToTextfieldViews(ui::VKEY_C, true, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_C, false, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_1, false, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_1, true, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_1, true, false, false);
|
| + SendKeyEvent(ui::VKEY_C, true, false, true);
|
| + SendKeyEvent(ui::VKEY_C, false, false, true);
|
| + SendKeyEvent(ui::VKEY_1, false, false, true);
|
| + SendKeyEvent(ui::VKEY_1, true, false, true);
|
| + SendKeyEvent(ui::VKEY_1, true, false, false);
|
| EXPECT_STR_EQ("cC1!!", textfield_->text());
|
| EXPECT_STR_EQ("cC1!!", last_contents_);
|
| }
|
| @@ -200,34 +288,34 @@ TEST_F(NativeTextfieldViewsTest, ControlAndSelectTest) {
|
| // Insert a test string in a textfield.
|
| InitTextfield(Textfield::STYLE_DEFAULT);
|
| textfield_->SetText(ASCIIToUTF16("one two three"));
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT,
|
| + SendKeyEvent(ui::VKEY_RIGHT,
|
| true /* shift */, false /* control */);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, true, false);
|
| + SendKeyEvent(ui::VKEY_RIGHT, true, false);
|
| + SendKeyEvent(ui::VKEY_RIGHT, true, false);
|
|
|
| EXPECT_STR_EQ("one", textfield_->GetSelectedText());
|
|
|
| // Test word select.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, true, true);
|
| + SendKeyEvent(ui::VKEY_RIGHT, true, true);
|
| EXPECT_STR_EQ("one two", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, true, true);
|
| + SendKeyEvent(ui::VKEY_RIGHT, true, true);
|
| EXPECT_STR_EQ("one two three", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, true, true);
|
| + SendKeyEvent(ui::VKEY_LEFT, true, true);
|
| EXPECT_STR_EQ("one two ", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, true, true);
|
| + SendKeyEvent(ui::VKEY_LEFT, true, true);
|
| EXPECT_STR_EQ("one ", textfield_->GetSelectedText());
|
|
|
| // Replace the selected text.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_Z, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_E, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_R, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_O, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_SPACE, false, false);
|
| + 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());
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_END, true, false);
|
| + SendKeyEvent(ui::VKEY_END, true, false);
|
| EXPECT_STR_EQ("two three", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_HOME, true, false);
|
| + SendKeyEvent(ui::VKEY_HOME, true, false);
|
| EXPECT_STR_EQ("ZERO ", textfield_->GetSelectedText());
|
| }
|
|
|
| @@ -242,41 +330,41 @@ TEST_F(NativeTextfieldViewsTest, InsertionDeletionTest) {
|
| ui::KeyboardCode code =
|
| c == ' ' ? ui::VKEY_SPACE :
|
| static_cast<ui::KeyboardCode>(ui::VKEY_A + c - 'a');
|
| - SendKeyEventToTextfieldViews(code);
|
| + SendKeyEvent(code);
|
| }
|
| EXPECT_STR_EQ(test_str, textfield_->text());
|
|
|
| // Move the cursor around.
|
| for (int i = 0; i < 6; i++) {
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT);
|
| + SendKeyEvent(ui::VKEY_LEFT);
|
| }
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT);
|
| + SendKeyEvent(ui::VKEY_RIGHT);
|
|
|
| // Delete using backspace and check resulting string.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_BACK);
|
| + SendKeyEvent(ui::VKEY_BACK);
|
| EXPECT_STR_EQ("this is test", textfield_->text());
|
|
|
| // Delete using delete key and check resulting string.
|
| for (int i = 0; i < 5; i++) {
|
| - SendKeyEventToTextfieldViews(ui::VKEY_DELETE);
|
| + SendKeyEvent(ui::VKEY_DELETE);
|
| }
|
| EXPECT_STR_EQ("this is ", textfield_->text());
|
|
|
| // Select all and replace with "k".
|
| textfield_->SelectAll();
|
| - SendKeyEventToTextfieldViews(ui::VKEY_K);
|
| + SendKeyEvent(ui::VKEY_K);
|
| EXPECT_STR_EQ("k", textfield_->text());
|
|
|
| // Delete the previous word from cursor.
|
| textfield_->SetText(ASCIIToUTF16("one two three four"));
|
| - SendKeyEventToTextfieldViews(ui::VKEY_END);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_BACK, false, true, false);
|
| + SendKeyEvent(ui::VKEY_END);
|
| + SendKeyEvent(ui::VKEY_BACK, false, true, false);
|
| EXPECT_STR_EQ("one two three ", textfield_->text());
|
|
|
| // Delete upto the beginning of the buffer from cursor in chromeos, do nothing
|
| // in windows.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_BACK, true, true, false);
|
| + SendKeyEvent(ui::VKEY_LEFT, false, true, false);
|
| + SendKeyEvent(ui::VKEY_BACK, true, true, false);
|
| #if defined(OS_WIN)
|
| EXPECT_STR_EQ("one two three ", textfield_->text());
|
| #else
|
| @@ -285,14 +373,14 @@ TEST_F(NativeTextfieldViewsTest, InsertionDeletionTest) {
|
|
|
| // Delete the next word from cursor.
|
| textfield_->SetText(ASCIIToUTF16("one two three four"));
|
| - SendKeyEventToTextfieldViews(ui::VKEY_HOME);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_DELETE, false, true, false);
|
| + SendKeyEvent(ui::VKEY_HOME);
|
| + SendKeyEvent(ui::VKEY_DELETE, false, true, false);
|
| EXPECT_STR_EQ(" two three four", textfield_->text());
|
|
|
| // Delete upto the end of the buffer from cursor in chromeos, do nothing
|
| // in windows.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, false, true, false);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_DELETE, true, true, false);
|
| + SendKeyEvent(ui::VKEY_RIGHT, false, true, false);
|
| + SendKeyEvent(ui::VKEY_DELETE, true, true, false);
|
| #if defined(OS_WIN)
|
| EXPECT_STR_EQ(" two three four", textfield_->text());
|
| #else
|
| @@ -302,20 +390,44 @@ TEST_F(NativeTextfieldViewsTest, InsertionDeletionTest) {
|
|
|
| TEST_F(NativeTextfieldViewsTest, PasswordTest) {
|
| InitTextfield(Textfield::STYLE_PASSWORD);
|
| +
|
| + last_contents_.clear();
|
| textfield_->SetText(ASCIIToUTF16("my password"));
|
| // Just to make sure the text() and callback returns
|
| // the actual text instead of "*".
|
| EXPECT_STR_EQ("my password", textfield_->text());
|
| - EXPECT_STR_EQ("my password", last_contents_);
|
| + EXPECT_TRUE(last_contents_.empty());
|
| }
|
|
|
| TEST_F(NativeTextfieldViewsTest, OnKeyPressReturnValueTest) {
|
| InitTextfield(Textfield::STYLE_DEFAULT);
|
| - EXPECT_TRUE(SendKeyEventToTextfieldViews(ui::VKEY_A));
|
| +
|
| + // Character keys will be handled by input method.
|
| + SendKeyEvent(ui::VKEY_A);
|
| + EXPECT_TRUE(textfield_->key_received());
|
| + EXPECT_FALSE(textfield_->key_handled());
|
| + textfield_->clear();
|
| +
|
| + // Home will be handled.
|
| + SendKeyEvent(ui::VKEY_HOME);
|
| + EXPECT_TRUE(textfield_->key_received());
|
| + EXPECT_TRUE(textfield_->key_handled());
|
| + textfield_->clear();
|
| +
|
| // F24, up/down key won't be handled.
|
| - EXPECT_FALSE(SendKeyEventToTextfieldViews(ui::VKEY_F24));
|
| - EXPECT_FALSE(SendKeyEventToTextfieldViews(ui::VKEY_UP));
|
| - EXPECT_FALSE(SendKeyEventToTextfieldViews(ui::VKEY_DOWN));
|
| + 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());
|
| }
|
|
|
| TEST_F(NativeTextfieldViewsTest, CursorMovement) {
|
| @@ -325,23 +437,23 @@ TEST_F(NativeTextfieldViewsTest, CursorMovement) {
|
| textfield_->SetText(ASCIIToUTF16("one two hre "));
|
|
|
| // Send the cursor at the end.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_END);
|
| + SendKeyEvent(ui::VKEY_END);
|
|
|
| // Ctrl+Left should move the cursor just before the last word.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_T);
|
| + 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_);
|
|
|
| // Ctrl+Right should move the cursor to the end of the last word.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_E);
|
| + 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_);
|
|
|
| // Ctrl+Right again should move the cursor to the end.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_BACK);
|
| + 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_);
|
|
|
| @@ -349,34 +461,26 @@ TEST_F(NativeTextfieldViewsTest, CursorMovement) {
|
| textfield_->SetText(ASCIIToUTF16(" ne two"));
|
|
|
| // Send the cursor at the beginning.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_HOME);
|
| + SendKeyEvent(ui::VKEY_HOME);
|
|
|
| // Ctrl+Right, then Ctrl+Left should move the cursor to the beginning of the
|
| // first word.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_RIGHT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_O);
|
| + 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_);
|
|
|
| // Ctrl+Left to move the cursor to the beginning of the first word.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true);
|
| + SendKeyEvent(ui::VKEY_LEFT, false, true);
|
| // Ctrl+Left again should move the cursor back to the very beginning.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_DELETE);
|
| + SendKeyEvent(ui::VKEY_LEFT, false, true);
|
| + SendKeyEvent(ui::VKEY_DELETE);
|
| EXPECT_STR_EQ("one two", textfield_->text());
|
| EXPECT_STR_EQ("one two", last_contents_);
|
| }
|
|
|
| -#if defined(OS_WIN)
|
| -// TODO(oshima): Windows' FocusManager::ClearNativeFocus() resets the
|
| -// focused view to NULL, which causes crash in this test. Figure out
|
| -// why and fix this.
|
| -#define MAYBE_FocusTraversalTest DISABLED_FocusTraversalTest
|
| -#else
|
| -#define MAYBE_FocusTraversalTest FocusTraversalTest
|
| -#endif
|
| -TEST_F(NativeTextfieldViewsTest, MAYBE_FocusTraversalTest) {
|
| +TEST_F(NativeTextfieldViewsTest, FocusTraversalTest) {
|
| InitTextfields(Textfield::STYLE_DEFAULT, 3);
|
| textfield_->RequestFocus();
|
|
|
| @@ -464,19 +568,19 @@ TEST_F(NativeTextfieldViewsTest, ReadOnlyTest) {
|
| InitTextfield(Textfield::STYLE_DEFAULT);
|
| textfield_->SetText(ASCIIToUTF16(" one two three "));
|
| textfield_->SetReadOnly(true);
|
| - SendKeyEventToTextfieldViews(ui::VKEY_HOME);
|
| + SendKeyEvent(ui::VKEY_HOME);
|
| EXPECT_EQ(0U, textfield_->GetCursorPosition());
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_END);
|
| + SendKeyEvent(ui::VKEY_END);
|
| EXPECT_EQ(15U, textfield_->GetCursorPosition());
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, false);
|
| + SendKeyEvent(ui::VKEY_LEFT, false, false);
|
| EXPECT_EQ(14U, textfield_->GetCursorPosition());
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, false, true);
|
| + SendKeyEvent(ui::VKEY_LEFT, false, true);
|
| EXPECT_EQ(9U, textfield_->GetCursorPosition());
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_LEFT, true, true);
|
| + SendKeyEvent(ui::VKEY_LEFT, true, true);
|
| EXPECT_EQ(5U, textfield_->GetCursorPosition());
|
| EXPECT_STR_EQ("two ", textfield_->GetSelectedText());
|
|
|
| @@ -484,14 +588,14 @@ TEST_F(NativeTextfieldViewsTest, ReadOnlyTest) {
|
| EXPECT_STR_EQ(" one two three ", textfield_->GetSelectedText());
|
|
|
| // CUT&PASTE does not work, but COPY works
|
| - SendKeyEventToTextfieldViews(ui::VKEY_X, false, true);
|
| + SendKeyEvent(ui::VKEY_X, false, true);
|
| EXPECT_STR_EQ(" one two three ", textfield_->GetSelectedText());
|
| string16 str;
|
| views::ViewsDelegate::views_delegate->GetClipboard()->
|
| ReadText(ui::Clipboard::BUFFER_STANDARD, &str);
|
| EXPECT_STR_NE(" one two three ", str);
|
|
|
| - SendKeyEventToTextfieldViews(ui::VKEY_C, false, true);
|
| + SendKeyEvent(ui::VKEY_C, false, true);
|
| views::ViewsDelegate::views_delegate->GetClipboard()->
|
| ReadText(ui::Clipboard::BUFFER_STANDARD, &str);
|
| EXPECT_STR_EQ(" one two three ", str);
|
| @@ -501,7 +605,7 @@ TEST_F(NativeTextfieldViewsTest, ReadOnlyTest) {
|
| EXPECT_STR_EQ(" four five six ", textfield_->text());
|
|
|
| // Paste shouldn't work.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_V, false, true);
|
| + SendKeyEvent(ui::VKEY_V, false, true);
|
| EXPECT_STR_EQ(" four five six ", textfield_->text());
|
| EXPECT_TRUE(textfield_->GetSelectedText().empty());
|
|
|
| @@ -509,12 +613,103 @@ TEST_F(NativeTextfieldViewsTest, ReadOnlyTest) {
|
| EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
|
|
|
| // Text field is unmodifiable and selection shouldn't change.
|
| - SendKeyEventToTextfieldViews(ui::VKEY_DELETE);
|
| + SendKeyEvent(ui::VKEY_DELETE);
|
| EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_BACK);
|
| + SendKeyEvent(ui::VKEY_BACK);
|
| EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
|
| - SendKeyEventToTextfieldViews(ui::VKEY_T);
|
| + SendKeyEvent(ui::VKEY_T);
|
| EXPECT_STR_EQ(" four five six ", textfield_->GetSelectedText());
|
| }
|
|
|
| +TEST_F(NativeTextfieldViewsTest, TextInputClientTest) {
|
| + InitTextfield(Textfield::STYLE_DEFAULT);
|
| + TextInputClient* client = textfield_->GetTextInputClient();
|
| + EXPECT_TRUE(client);
|
| + EXPECT_EQ(ui::TEXT_INPUT_TYPE_TEXT, client->GetTextInputType());
|
| +
|
| + textfield_->SetText(ASCIIToUTF16("0123456789"));
|
| + ui::Range range;
|
| + EXPECT_TRUE(client->GetTextRange(&range));
|
| + EXPECT_EQ(0U, range.start());
|
| + EXPECT_EQ(10U, range.end());
|
| +
|
| + EXPECT_TRUE(client->SetSelectionRange(ui::Range(1, 4)));
|
| + EXPECT_TRUE(client->GetSelectionRange(&range));
|
| + EXPECT_EQ(ui::Range(1,4), range);
|
| +
|
| + // This code can't be compiled because of a bug in base::Callback.
|
| +#if 0
|
| + GetTextHelper helper;
|
| + base::Callback<void(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");
|
| + // Set composition through input method.
|
| + 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(ui::Range(1,4), range);
|
| + EXPECT_EQ(2, on_before_user_action_);
|
| + EXPECT_EQ(2, 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(2, on_before_user_action_);
|
| + EXPECT_EQ(2, 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_);
|
| +
|
| + 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_->SetPassword(true);
|
| + EXPECT_TRUE(input_method_->text_input_type_changed());
|
| + EXPECT_TRUE(textfield_->GetTextInputClient());
|
| +}
|
| +
|
| +
|
| } // namespace views
|
|
|