Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(752)

Unified Diff: ui/base/ime/input_method_chromeos_unittest.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/base/ime/input_method_chromeos.cc ('k') | ui/base/ime/input_method_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/ime/input_method_chromeos_unittest.cc
diff --git a/ui/base/ime/input_method_chromeos_unittest.cc b/ui/base/ime/input_method_chromeos_unittest.cc
deleted file mode 100644
index 5071872c93bba68daac6bc7625d3732d7c9ca088..0000000000000000000000000000000000000000
--- a/ui/base/ime/input_method_chromeos_unittest.cc
+++ /dev/null
@@ -1,1071 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/base/ime/input_method_chromeos.h"
-
-#include <X11/Xlib.h>
-#undef Bool
-#undef FocusIn
-#undef FocusOut
-#undef None
-
-#include <cstring>
-
-#include "base/i18n/char_iterator.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/strings/utf_string_conversions.h"
-#include "chromeos/ime/composition_text.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "ui/base/ime/chromeos/ime_bridge.h"
-#include "ui/base/ime/chromeos/mock_ime_candidate_window_handler.h"
-#include "ui/base/ime/chromeos/mock_ime_engine_handler.h"
-#include "ui/base/ime/input_method_delegate.h"
-#include "ui/base/ime/text_input_client.h"
-#include "ui/base/ime/text_input_focus_manager.h"
-#include "ui/base/ui_base_switches_util.h"
-#include "ui/events/event.h"
-#include "ui/events/test/events_test_utils_x11.h"
-#include "ui/gfx/geometry/rect.h"
-
-using base::UTF8ToUTF16;
-using base::UTF16ToUTF8;
-
-namespace ui {
-namespace {
-
-const base::string16 kSampleText = base::UTF8ToUTF16(
- "\xE3\x81\x82\xE3\x81\x84\xE3\x81\x86\xE3\x81\x88\xE3\x81\x8A");
-
-typedef chromeos::IMEEngineHandlerInterface::KeyEventDoneCallback
- KeyEventCallback;
-
-uint32 GetOffsetInUTF16(
- const base::string16& utf16_string, uint32 utf8_offset) {
- DCHECK_LT(utf8_offset, utf16_string.size());
- base::i18n::UTF16CharIterator char_iterator(&utf16_string);
- for (size_t i = 0; i < utf8_offset; ++i)
- char_iterator.Advance();
- return char_iterator.array_pos();
-}
-
-bool IsEqualXKeyEvent(const XEvent& e1, const XEvent& e2) {
- if ((e1.type == KeyPress && e2.type == KeyPress) ||
- (e1.type == KeyRelease && e2.type == KeyRelease)) {
- return !std::memcmp(&e1.xkey, &e2.xkey, sizeof(XKeyEvent));
- }
- return false;
-}
-
-enum KeyEventHandlerBehavior {
- KEYEVENT_CONSUME,
- KEYEVENT_NOT_CONSUME,
-};
-
-} // namespace
-
-
-class TestableInputMethodChromeOS : public InputMethodChromeOS {
- public:
- explicit TestableInputMethodChromeOS(internal::InputMethodDelegate* delegate)
- : InputMethodChromeOS(delegate),
- process_key_event_post_ime_call_count_(0) {
- }
-
- struct ProcessKeyEventPostIMEArgs {
- ProcessKeyEventPostIMEArgs() : event(NULL), handled(false) {}
- const ui::KeyEvent* event;
- bool handled;
- };
-
- // Overridden from InputMethodChromeOS:
- virtual void ProcessKeyEventPostIME(const ui::KeyEvent& key_event,
- bool handled) override {
- process_key_event_post_ime_args_.event = &key_event;
- process_key_event_post_ime_args_.handled = handled;
- ++process_key_event_post_ime_call_count_;
- }
-
- void ResetCallCount() {
- process_key_event_post_ime_call_count_ = 0;
- }
-
- const ProcessKeyEventPostIMEArgs& process_key_event_post_ime_args() const {
- return process_key_event_post_ime_args_;
- }
-
- int process_key_event_post_ime_call_count() const {
- return process_key_event_post_ime_call_count_;
- }
-
- // Change access rights for testing.
- using InputMethodChromeOS::ExtractCompositionText;
- using InputMethodChromeOS::ResetContext;
-
- private:
- ProcessKeyEventPostIMEArgs process_key_event_post_ime_args_;
- int process_key_event_post_ime_call_count_;
-};
-
-class SynchronousKeyEventHandler {
- public:
- SynchronousKeyEventHandler(uint32 expected_keyval,
- uint32 expected_keycode,
- uint32 expected_state,
- KeyEventHandlerBehavior behavior)
- : expected_keyval_(expected_keyval),
- expected_keycode_(expected_keycode),
- expected_state_(expected_state),
- behavior_(behavior) {}
-
- virtual ~SynchronousKeyEventHandler() {}
-
- void Run(uint32 keyval,
- uint32 keycode,
- uint32 state,
- const KeyEventCallback& callback) {
- EXPECT_EQ(expected_keyval_, keyval);
- EXPECT_EQ(expected_keycode_, keycode);
- EXPECT_EQ(expected_state_, state);
- callback.Run(behavior_ == KEYEVENT_CONSUME);
- }
-
- private:
- const uint32 expected_keyval_;
- const uint32 expected_keycode_;
- const uint32 expected_state_;
- const KeyEventHandlerBehavior behavior_;
-
- DISALLOW_COPY_AND_ASSIGN(SynchronousKeyEventHandler);
-};
-
-class AsynchronousKeyEventHandler {
- public:
- AsynchronousKeyEventHandler(uint32 expected_keyval,
- uint32 expected_keycode,
- uint32 expected_state)
- : expected_keyval_(expected_keyval),
- expected_keycode_(expected_keycode),
- expected_state_(expected_state) {}
-
- virtual ~AsynchronousKeyEventHandler() {}
-
- void Run(uint32 keyval,
- uint32 keycode,
- uint32 state,
- const KeyEventCallback& callback) {
- EXPECT_EQ(expected_keyval_, keyval);
- EXPECT_EQ(expected_keycode_, keycode);
- EXPECT_EQ(expected_state_, state);
- callback_ = callback;
- }
-
- void RunCallback(KeyEventHandlerBehavior behavior) {
- callback_.Run(behavior == KEYEVENT_CONSUME);
- }
-
- private:
- const uint32 expected_keyval_;
- const uint32 expected_keycode_;
- const uint32 expected_state_;
- KeyEventCallback callback_;
-
- DISALLOW_COPY_AND_ASSIGN(AsynchronousKeyEventHandler);
-};
-
-class SetSurroundingTextVerifier {
- public:
- SetSurroundingTextVerifier(const std::string& expected_surrounding_text,
- uint32 expected_cursor_position,
- uint32 expected_anchor_position)
- : expected_surrounding_text_(expected_surrounding_text),
- expected_cursor_position_(expected_cursor_position),
- expected_anchor_position_(expected_anchor_position) {}
-
- void Verify(const std::string& text,
- uint32 cursor_pos,
- uint32 anchor_pos) {
- EXPECT_EQ(expected_surrounding_text_, text);
- EXPECT_EQ(expected_cursor_position_, cursor_pos);
- EXPECT_EQ(expected_anchor_position_, anchor_pos);
- }
-
- private:
- const std::string expected_surrounding_text_;
- const uint32 expected_cursor_position_;
- const uint32 expected_anchor_position_;
-
- DISALLOW_COPY_AND_ASSIGN(SetSurroundingTextVerifier);
-};
-
-class InputMethodChromeOSTest : public internal::InputMethodDelegate,
- public testing::Test,
- public TextInputClient {
- public:
- InputMethodChromeOSTest()
- : dispatched_key_event_(ui::ET_UNKNOWN, ui::VKEY_UNKNOWN, ui::EF_NONE) {
- ResetFlags();
- }
-
- virtual ~InputMethodChromeOSTest() {
- }
-
- virtual void SetUp() override {
- chromeos::IMEBridge::Initialize();
-
- mock_ime_engine_handler_.reset(
- new chromeos::MockIMEEngineHandler());
- chromeos::IMEBridge::Get()->SetCurrentEngineHandler(
- mock_ime_engine_handler_.get());
-
- mock_ime_candidate_window_handler_.reset(
- new chromeos::MockIMECandidateWindowHandler());
- chromeos::IMEBridge::Get()->SetCandidateWindowHandler(
- mock_ime_candidate_window_handler_.get());
-
- ime_.reset(new TestableInputMethodChromeOS(this));
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->FocusTextInputClient(this);
- else
- ime_->SetFocusedTextInputClient(this);
- }
-
- virtual void TearDown() override {
- if (ime_.get()) {
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->BlurTextInputClient(this);
- else
- ime_->SetFocusedTextInputClient(NULL);
- }
- ime_.reset();
- chromeos::IMEBridge::Get()->SetCurrentEngineHandler(NULL);
- chromeos::IMEBridge::Get()->SetCandidateWindowHandler(NULL);
- mock_ime_engine_handler_.reset();
- mock_ime_candidate_window_handler_.reset();
- chromeos::IMEBridge::Shutdown();
- }
-
- // Overridden from ui::internal::InputMethodDelegate:
- virtual bool DispatchKeyEventPostIME(const ui::KeyEvent& event) override {
- dispatched_key_event_ = event;
- return false;
- }
-
- // Overridden from ui::TextInputClient:
- virtual void SetCompositionText(
- const CompositionText& composition) override {
- composition_text_ = composition;
- }
- virtual void ConfirmCompositionText() override {
- confirmed_text_ = composition_text_;
- composition_text_.Clear();
- }
- virtual void ClearCompositionText() override {
- composition_text_.Clear();
- }
- virtual void InsertText(const base::string16& text) override {
- inserted_text_ = text;
- }
- virtual void InsertChar(base::char16 ch, int flags) override {
- inserted_char_ = ch;
- inserted_char_flags_ = flags;
- }
- virtual gfx::NativeWindow GetAttachedWindow() const override {
- return static_cast<gfx::NativeWindow>(NULL);
- }
- virtual TextInputType GetTextInputType() const override {
- return input_type_;
- }
- virtual TextInputMode GetTextInputMode() const override {
- return input_mode_;
- }
- virtual bool CanComposeInline() const override {
- return can_compose_inline_;
- }
- virtual gfx::Rect GetCaretBounds() const override {
- return caret_bounds_;
- }
- virtual bool GetCompositionCharacterBounds(uint32 index,
- gfx::Rect* rect) const override {
- return false;
- }
- virtual bool HasCompositionText() const override {
- CompositionText empty;
- return composition_text_ != empty;
- }
- virtual bool GetTextRange(gfx::Range* range) const override {
- *range = text_range_;
- return true;
- }
- virtual bool GetCompositionTextRange(gfx::Range* range) const override {
- return false;
- }
- virtual bool GetSelectionRange(gfx::Range* range) const override {
- *range = selection_range_;
- return true;
- }
-
- virtual bool SetSelectionRange(const gfx::Range& range) override {
- return false;
- }
- virtual bool DeleteRange(const gfx::Range& range) override { return false; }
- virtual bool GetTextFromRange(const gfx::Range& range,
- base::string16* text) const override {
- *text = surrounding_text_.substr(range.GetMin(), range.length());
- return true;
- }
- virtual void OnInputMethodChanged() override {
- ++on_input_method_changed_call_count_;
- }
- virtual bool ChangeTextDirectionAndLayoutAlignment(
- base::i18n::TextDirection direction) override { return false; }
- virtual void ExtendSelectionAndDelete(size_t before,
- size_t after) override {}
- virtual void EnsureCaretInRect(const gfx::Rect& rect) override {}
- virtual void OnCandidateWindowShown() override {}
- virtual void OnCandidateWindowUpdated() override {}
- virtual void OnCandidateWindowHidden() override {}
- virtual bool IsEditingCommandEnabled(int command_id) override {
- return false;
- }
- virtual void ExecuteEditingCommand(int command_id) override {}
-
- bool HasNativeEvent() const {
- return dispatched_key_event_.HasNativeEvent();
- }
-
- void ResetFlags() {
- dispatched_key_event_ = ui::KeyEvent(ui::ET_UNKNOWN, ui::VKEY_UNKNOWN,
- ui::EF_NONE);
-
- composition_text_.Clear();
- confirmed_text_.Clear();
- inserted_text_.clear();
- inserted_char_ = 0;
- inserted_char_flags_ = 0;
- on_input_method_changed_call_count_ = 0;
-
- input_type_ = TEXT_INPUT_TYPE_NONE;
- input_mode_ = TEXT_INPUT_MODE_DEFAULT;
- can_compose_inline_ = true;
- caret_bounds_ = gfx::Rect();
- }
-
- scoped_ptr<TestableInputMethodChromeOS> ime_;
-
- // Copy of the dispatched key event.
- ui::KeyEvent dispatched_key_event_;
-
- // Variables for remembering the parameters that are passed to
- // ui::TextInputClient functions.
- CompositionText composition_text_;
- CompositionText confirmed_text_;
- base::string16 inserted_text_;
- base::char16 inserted_char_;
- unsigned int on_input_method_changed_call_count_;
- int inserted_char_flags_;
-
- // Variables that will be returned from the ui::TextInputClient functions.
- TextInputType input_type_;
- TextInputMode input_mode_;
- bool can_compose_inline_;
- gfx::Rect caret_bounds_;
- gfx::Range text_range_;
- gfx::Range selection_range_;
- base::string16 surrounding_text_;
-
- scoped_ptr<chromeos::MockIMEEngineHandler> mock_ime_engine_handler_;
- scoped_ptr<chromeos::MockIMECandidateWindowHandler>
- mock_ime_candidate_window_handler_;
-
- DISALLOW_COPY_AND_ASSIGN(InputMethodChromeOSTest);
-};
-
-// Tests public APIs in ui::InputMethod first.
-
-TEST_F(InputMethodChromeOSTest, GetInputLocale) {
- // ui::InputMethodChromeOS does not support the API.
- ime_->Init(true);
- EXPECT_EQ("", ime_->GetInputLocale());
-}
-
-TEST_F(InputMethodChromeOSTest, IsActive) {
- ime_->Init(true);
- // ui::InputMethodChromeOS always returns true.
- EXPECT_TRUE(ime_->IsActive());
-}
-
-TEST_F(InputMethodChromeOSTest, GetInputTextType) {
- ime_->Init(true);
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_PASSWORD, ime_->GetTextInputType());
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_TEXT, ime_->GetTextInputType());
-}
-
-TEST_F(InputMethodChromeOSTest, CanComposeInline) {
- ime_->Init(true);
- EXPECT_TRUE(ime_->CanComposeInline());
- can_compose_inline_ = false;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_FALSE(ime_->CanComposeInline());
-}
-
-TEST_F(InputMethodChromeOSTest, GetTextInputClient) {
- ime_->Init(true);
- EXPECT_EQ(this, ime_->GetTextInputClient());
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->BlurTextInputClient(this);
- else
- ime_->SetFocusedTextInputClient(NULL);
- EXPECT_EQ(NULL, ime_->GetTextInputClient());
-}
-
-TEST_F(InputMethodChromeOSTest, GetInputTextType_WithoutFocusedClient) {
- ime_->Init(true);
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->BlurTextInputClient(this);
- else
- ime_->SetFocusedTextInputClient(NULL);
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- // The OnTextInputTypeChanged() call above should be ignored since |this| is
- // not the current focused client.
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
-
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->FocusTextInputClient(this);
- else
- ime_->SetFocusedTextInputClient(this);
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_PASSWORD, ime_->GetTextInputType());
-}
-
-TEST_F(InputMethodChromeOSTest, GetInputTextType_WithoutFocusedWindow) {
- ime_->Init(true);
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->BlurTextInputClient(this);
- else
- ime_->OnBlur();
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- // The OnTextInputTypeChanged() call above should be ignored since the top-
- // level window which the ime_ is attached to is not currently focused.
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
-
- if (switches::IsTextInputFocusManagerEnabled())
- TextInputFocusManager::GetInstance()->FocusTextInputClient(this);
- else
- ime_->OnFocus();
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_PASSWORD, ime_->GetTextInputType());
-}
-
-TEST_F(InputMethodChromeOSTest, GetInputTextType_WithoutFocusedWindow2) {
- // We no longer support the case that |ime_->Init(false)| because no one
- // actually uses it.
- if (switches::IsTextInputFocusManagerEnabled())
- return;
-
- ime_->Init(false); // the top-level is initially unfocused.
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE, ime_->GetTextInputType());
-
- ime_->OnFocus();
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(TEXT_INPUT_TYPE_PASSWORD, ime_->GetTextInputType());
-}
-
-// Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is
-// TEXT.
-TEST_F(InputMethodChromeOSTest, FocusIn_Text) {
- ime_->Init(true);
- // A context shouldn't be created since the daemon is not running.
- EXPECT_EQ(0U, on_input_method_changed_call_count_);
- // Click a text input form.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
- // Since a form has focus, IBusClient::FocusIn() should be called.
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(
- 1,
- mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
- // ui::TextInputClient::OnInputMethodChanged() should be called when
- // ui::InputMethodChromeOS connects/disconnects to/from ibus-daemon and the
- // current text input type is not NONE.
- EXPECT_EQ(1U, on_input_method_changed_call_count_);
-}
-
-// Confirm that InputMethodEngine::FocusIn is called on "connected" even if
-// input_type_ is PASSWORD.
-TEST_F(InputMethodChromeOSTest, FocusIn_Password) {
- ime_->Init(true);
- EXPECT_EQ(0U, on_input_method_changed_call_count_);
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- // InputMethodEngine::FocusIn() should be called even for password field.
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(1U, on_input_method_changed_call_count_);
-}
-
-// Confirm that IBusClient::FocusOut is called as expected.
-TEST_F(InputMethodChromeOSTest, FocusOut_None) {
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->Init(true);
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count());
- input_type_ = TEXT_INPUT_TYPE_NONE;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_out_call_count());
-}
-
-// Confirm that IBusClient::FocusOut is called as expected.
-TEST_F(InputMethodChromeOSTest, FocusOut_Password) {
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->Init(true);
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count());
- input_type_ = TEXT_INPUT_TYPE_PASSWORD;
- ime_->OnTextInputTypeChanged(this);
- EXPECT_EQ(2, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_out_call_count());
-}
-
-// FocusIn/FocusOut scenario test
-TEST_F(InputMethodChromeOSTest, Focus_Scenario) {
- ime_->Init(true);
- // Confirm that both FocusIn and FocusOut are NOT called.
- EXPECT_EQ(0, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count());
- EXPECT_EQ(TEXT_INPUT_TYPE_NONE,
- mock_ime_engine_handler_->last_text_input_context().type);
- EXPECT_EQ(TEXT_INPUT_MODE_DEFAULT,
- mock_ime_engine_handler_->last_text_input_context().mode);
-
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- input_mode_ = TEXT_INPUT_MODE_LATIN;
- ime_->OnTextInputTypeChanged(this);
- // Confirm that only FocusIn is called, the TextInputType is TEXT and the
- // TextInputMode is LATIN..
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(0, mock_ime_engine_handler_->focus_out_call_count());
- EXPECT_EQ(TEXT_INPUT_TYPE_TEXT,
- mock_ime_engine_handler_->last_text_input_context().type);
- EXPECT_EQ(TEXT_INPUT_MODE_LATIN,
- mock_ime_engine_handler_->last_text_input_context().mode);
-
- input_mode_ = TEXT_INPUT_MODE_KANA;
- ime_->OnTextInputTypeChanged(this);
- // Confirm that both FocusIn and FocusOut are called for mode change.
- EXPECT_EQ(2, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(1, mock_ime_engine_handler_->focus_out_call_count());
- EXPECT_EQ(TEXT_INPUT_TYPE_TEXT,
- mock_ime_engine_handler_->last_text_input_context().type);
- EXPECT_EQ(TEXT_INPUT_MODE_KANA,
- mock_ime_engine_handler_->last_text_input_context().mode);
-
- input_type_ = TEXT_INPUT_TYPE_URL;
- ime_->OnTextInputTypeChanged(this);
- // Confirm that both FocusIn and FocusOut are called and the TextInputType is
- // changed to URL.
- EXPECT_EQ(3, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(2, mock_ime_engine_handler_->focus_out_call_count());
- EXPECT_EQ(TEXT_INPUT_TYPE_URL,
- mock_ime_engine_handler_->last_text_input_context().type);
- EXPECT_EQ(TEXT_INPUT_MODE_KANA,
- mock_ime_engine_handler_->last_text_input_context().mode);
-
- // When IsTextInputFocusManagerEnabled, InputMethod::SetFocusedTextInputClient
- // is not supported and it's no-op.
- if (switches::IsTextInputFocusManagerEnabled())
- return;
- // Confirm that FocusOut is called when set focus to NULL client.
- ime_->SetFocusedTextInputClient(NULL);
- EXPECT_EQ(3, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(3, mock_ime_engine_handler_->focus_out_call_count());
- // Confirm that FocusIn is called when set focus to this client.
- ime_->SetFocusedTextInputClient(this);
- EXPECT_EQ(4, mock_ime_engine_handler_->focus_in_call_count());
- EXPECT_EQ(3, mock_ime_engine_handler_->focus_out_call_count());
-}
-
-// Test if the new |caret_bounds_| is correctly sent to ibus-daemon.
-TEST_F(InputMethodChromeOSTest, OnCaretBoundsChanged) {
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->Init(true);
- EXPECT_EQ(
- 1,
- mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
- caret_bounds_ = gfx::Rect(1, 2, 3, 4);
- ime_->OnCaretBoundsChanged(this);
- EXPECT_EQ(
- 2,
- mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
- caret_bounds_ = gfx::Rect(0, 2, 3, 4);
- ime_->OnCaretBoundsChanged(this);
- EXPECT_EQ(
- 3,
- mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
- caret_bounds_ = gfx::Rect(0, 2, 3, 4); // unchanged
- ime_->OnCaretBoundsChanged(this);
- // Current InputMethodChromeOS implementation performs the IPC
- // regardless of the bounds are changed or not.
- EXPECT_EQ(
- 4,
- mock_ime_candidate_window_handler_->set_cursor_bounds_call_count());
-}
-
-TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_NoAttribute) {
- const base::string16 kSampleAsciiText = UTF8ToUTF16("Sample Text");
- const uint32 kCursorPos = 2UL;
-
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleAsciiText);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleAsciiText, composition_text.text);
- // If there is no selection, |selection| represents cursor position.
- EXPECT_EQ(kCursorPos, composition_text.selection.start());
- EXPECT_EQ(kCursorPos, composition_text.selection.end());
- // If there is no underline, |underlines| contains one underline and it is
- // whole text underline.
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(0UL, composition_text.underlines[0].start_offset);
- EXPECT_EQ(kSampleAsciiText.size(), composition_text.underlines[0].end_offset);
- EXPECT_FALSE(composition_text.underlines[0].thick);
-}
-
-TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_SingleUnderline) {
- const uint32 kCursorPos = 2UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos::CompositionText::UnderlineAttribute underline;
- underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_SINGLE;
- underline.start_index = 1UL;
- underline.end_index = 4UL;
- chromeos_composition_text.mutable_underline_attributes()->push_back(
- underline);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- // If there is no selection, |selection| represents cursor position.
- EXPECT_EQ(kCursorPos, composition_text.selection.start());
- EXPECT_EQ(kCursorPos, composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.start_index),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.end_index),
- composition_text.underlines[0].end_offset);
- // Single underline represents as black thin line.
- EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
- EXPECT_FALSE(composition_text.underlines[0].thick);
- EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
- composition_text.underlines[0].background_color);
-}
-
-TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_DoubleUnderline) {
- const uint32 kCursorPos = 2UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos::CompositionText::UnderlineAttribute underline;
- underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_DOUBLE;
- underline.start_index = 1UL;
- underline.end_index = 4UL;
- chromeos_composition_text.mutable_underline_attributes()->push_back(
- underline);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- // If there is no selection, |selection| represents cursor position.
- EXPECT_EQ(kCursorPos, composition_text.selection.start());
- EXPECT_EQ(kCursorPos, composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.start_index),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.end_index),
- composition_text.underlines[0].end_offset);
- // Double underline represents as black thick line.
- EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
- EXPECT_TRUE(composition_text.underlines[0].thick);
- EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
- composition_text.underlines[0].background_color);
-}
-
-TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_ErrorUnderline) {
- const uint32 kCursorPos = 2UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos::CompositionText::UnderlineAttribute underline;
- underline.type = chromeos::CompositionText::COMPOSITION_TEXT_UNDERLINE_ERROR;
- underline.start_index = 1UL;
- underline.end_index = 4UL;
- chromeos_composition_text.mutable_underline_attributes()->push_back(
- underline);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- EXPECT_EQ(kCursorPos, composition_text.selection.start());
- EXPECT_EQ(kCursorPos, composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.start_index),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, underline.end_index),
- composition_text.underlines[0].end_offset);
- // Error underline represents as red thin line.
- EXPECT_EQ(SK_ColorRED, composition_text.underlines[0].color);
- EXPECT_FALSE(composition_text.underlines[0].thick);
-}
-
-TEST_F(InputMethodChromeOSTest, ExtractCompositionTextTest_Selection) {
- const uint32 kCursorPos = 2UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos_composition_text.set_selection_start(1UL);
- chromeos_composition_text.set_selection_end(4UL);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- EXPECT_EQ(kCursorPos, composition_text.selection.start());
- EXPECT_EQ(kCursorPos, composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_start()),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_end()),
- composition_text.underlines[0].end_offset);
- EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
- EXPECT_TRUE(composition_text.underlines[0].thick);
- EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
- composition_text.underlines[0].background_color);
-}
-
-TEST_F(InputMethodChromeOSTest,
- ExtractCompositionTextTest_SelectionStartWithCursor) {
- const uint32 kCursorPos = 1UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos_composition_text.set_selection_start(kCursorPos);
- chromeos_composition_text.set_selection_end(4UL);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- // If the cursor position is same as selection bounds, selection start
- // position become opposit side of selection from cursor.
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_end()),
- composition_text.selection.start());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, kCursorPos),
- composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_start()),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_end()),
- composition_text.underlines[0].end_offset);
- EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
- EXPECT_TRUE(composition_text.underlines[0].thick);
- EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
- composition_text.underlines[0].background_color);
-}
-
-TEST_F(InputMethodChromeOSTest,
- ExtractCompositionTextTest_SelectionEndWithCursor) {
- const uint32 kCursorPos = 4UL;
-
- // Set up chromeos composition text with one underline attribute.
- chromeos::CompositionText chromeos_composition_text;
- chromeos_composition_text.set_text(kSampleText);
- chromeos_composition_text.set_selection_start(1UL);
- chromeos_composition_text.set_selection_end(kCursorPos);
-
- CompositionText composition_text;
- ime_->ExtractCompositionText(
- chromeos_composition_text, kCursorPos, &composition_text);
- EXPECT_EQ(kSampleText, composition_text.text);
- // If the cursor position is same as selection bounds, selection start
- // position become opposit side of selection from cursor.
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_start()),
- composition_text.selection.start());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText, kCursorPos),
- composition_text.selection.end());
- ASSERT_EQ(1UL, composition_text.underlines.size());
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_start()),
- composition_text.underlines[0].start_offset);
- EXPECT_EQ(GetOffsetInUTF16(kSampleText,
- chromeos_composition_text.selection_end()),
- composition_text.underlines[0].end_offset);
- EXPECT_EQ(SK_ColorBLACK, composition_text.underlines[0].color);
- EXPECT_TRUE(composition_text.underlines[0].thick);
- EXPECT_EQ(static_cast<SkColor>(SK_ColorTRANSPARENT),
- composition_text.underlines[0].background_color);
-}
-
-TEST_F(InputMethodChromeOSTest, SurroundingText_NoSelectionTest) {
- ime_->Init(true);
- // Click a text input form.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
-
- // Set the TextInputClient behaviors.
- surrounding_text_ = UTF8ToUTF16("abcdef");
- text_range_ = gfx::Range(0, 6);
- selection_range_ = gfx::Range(3, 3);
-
- // Set the verifier for SetSurroundingText mock call.
- SetSurroundingTextVerifier verifier(UTF16ToUTF8(surrounding_text_), 3, 3);
-
-
- ime_->OnCaretBoundsChanged(this);
-
- // Check the call count.
- EXPECT_EQ(1,
- mock_ime_engine_handler_->set_surrounding_text_call_count());
- EXPECT_EQ(UTF16ToUTF8(surrounding_text_),
- mock_ime_engine_handler_->last_set_surrounding_text());
- EXPECT_EQ(3U,
- mock_ime_engine_handler_->last_set_surrounding_cursor_pos());
- EXPECT_EQ(3U,
- mock_ime_engine_handler_->last_set_surrounding_anchor_pos());
-}
-
-TEST_F(InputMethodChromeOSTest, SurroundingText_SelectionTest) {
- ime_->Init(true);
- // Click a text input form.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
-
- // Set the TextInputClient behaviors.
- surrounding_text_ = UTF8ToUTF16("abcdef");
- text_range_ = gfx::Range(0, 6);
- selection_range_ = gfx::Range(2, 5);
-
- // Set the verifier for SetSurroundingText mock call.
- SetSurroundingTextVerifier verifier(UTF16ToUTF8(surrounding_text_), 2, 5);
-
- ime_->OnCaretBoundsChanged(this);
-
- // Check the call count.
- EXPECT_EQ(1,
- mock_ime_engine_handler_->set_surrounding_text_call_count());
- EXPECT_EQ(UTF16ToUTF8(surrounding_text_),
- mock_ime_engine_handler_->last_set_surrounding_text());
- EXPECT_EQ(2U,
- mock_ime_engine_handler_->last_set_surrounding_cursor_pos());
- EXPECT_EQ(5U,
- mock_ime_engine_handler_->last_set_surrounding_anchor_pos());
-}
-
-TEST_F(InputMethodChromeOSTest, SurroundingText_PartialText) {
- ime_->Init(true);
- // Click a text input form.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
-
- // Set the TextInputClient behaviors.
- surrounding_text_ = UTF8ToUTF16("abcdefghij");
- text_range_ = gfx::Range(5, 10);
- selection_range_ = gfx::Range(7, 9);
-
- ime_->OnCaretBoundsChanged(this);
-
- // Check the call count.
- EXPECT_EQ(1,
- mock_ime_engine_handler_->set_surrounding_text_call_count());
- // Set the verifier for SetSurroundingText mock call.
- // Here (2, 4) is selection range in expected surrounding text coordinates.
- EXPECT_EQ("fghij",
- mock_ime_engine_handler_->last_set_surrounding_text());
- EXPECT_EQ(2U,
- mock_ime_engine_handler_->last_set_surrounding_cursor_pos());
- EXPECT_EQ(4U,
- mock_ime_engine_handler_->last_set_surrounding_anchor_pos());
-}
-
-TEST_F(InputMethodChromeOSTest, SurroundingText_BecomeEmptyText) {
- ime_->Init(true);
- // Click a text input form.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
-
- // Set the TextInputClient behaviors.
- // If the surrounding text becomes empty, text_range become (0, 0) and
- // selection range become invalid.
- surrounding_text_ = UTF8ToUTF16("");
- text_range_ = gfx::Range(0, 0);
- selection_range_ = gfx::Range::InvalidRange();
-
- ime_->OnCaretBoundsChanged(this);
-
- // Check the call count.
- EXPECT_EQ(0,
- mock_ime_engine_handler_->set_surrounding_text_call_count());
-
- // Should not be called twice with same condition.
- ime_->OnCaretBoundsChanged(this);
- EXPECT_EQ(0,
- mock_ime_engine_handler_->set_surrounding_text_call_count());
-}
-
-class InputMethodChromeOSKeyEventTest : public InputMethodChromeOSTest {
- public:
- InputMethodChromeOSKeyEventTest() {}
- virtual ~InputMethodChromeOSKeyEventTest() {}
-
- virtual void SetUp() override {
- InputMethodChromeOSTest::SetUp();
- ime_->Init(true);
- }
-
- DISALLOW_COPY_AND_ASSIGN(InputMethodChromeOSKeyEventTest);
-};
-
-TEST_F(InputMethodChromeOSKeyEventTest, KeyEventDelayResponseTest) {
- const int kFlags = ui::EF_SHIFT_DOWN;
- ScopedXI2Event xevent;
- xevent.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_A, kFlags);
- const ui::KeyEvent event(xevent);
-
- // Do key event.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
- ime_->DispatchKeyEvent(event);
-
- // Check before state.
- const ui::KeyEvent* key_event =
- mock_ime_engine_handler_->last_processed_key_event();
- EXPECT_EQ(1, mock_ime_engine_handler_->process_key_event_call_count());
- EXPECT_EQ(ui::VKEY_A, key_event->key_code());
- EXPECT_EQ("KeyA", key_event->code());
- EXPECT_EQ(kFlags, key_event->flags());
- EXPECT_EQ(0, ime_->process_key_event_post_ime_call_count());
-
- // Do callback.
- mock_ime_engine_handler_->last_passed_callback().Run(true);
-
- // Check the results
- EXPECT_EQ(1, ime_->process_key_event_post_ime_call_count());
- const ui::KeyEvent* stored_event =
- ime_->process_key_event_post_ime_args().event;
- EXPECT_TRUE(stored_event->HasNativeEvent());
- EXPECT_TRUE(IsEqualXKeyEvent(*xevent, *(stored_event->native_event())));
- EXPECT_TRUE(ime_->process_key_event_post_ime_args().handled);
-}
-
-TEST_F(InputMethodChromeOSKeyEventTest, MultiKeyEventDelayResponseTest) {
- // Preparation
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
-
- const int kFlags = ui::EF_SHIFT_DOWN;
- ScopedXI2Event xevent;
- xevent.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_B, kFlags);
- const ui::KeyEvent event(xevent);
-
- // Do key event.
- ime_->DispatchKeyEvent(event);
- const ui::KeyEvent* key_event =
- mock_ime_engine_handler_->last_processed_key_event();
- EXPECT_EQ(ui::VKEY_B, key_event->key_code());
- EXPECT_EQ("KeyB", key_event->code());
- EXPECT_EQ(kFlags, key_event->flags());
-
- KeyEventCallback first_callback =
- mock_ime_engine_handler_->last_passed_callback();
-
- // Do key event again.
- ScopedXI2Event xevent2;
- xevent2.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_C, kFlags);
- const ui::KeyEvent event2(xevent2);
-
- ime_->DispatchKeyEvent(event2);
- const ui::KeyEvent* key_event2 =
- mock_ime_engine_handler_->last_processed_key_event();
- EXPECT_EQ(ui::VKEY_C, key_event2->key_code());
- EXPECT_EQ("KeyC", key_event2->code());
- EXPECT_EQ(kFlags, key_event2->flags());
-
- // Check before state.
- EXPECT_EQ(2,
- mock_ime_engine_handler_->process_key_event_call_count());
- EXPECT_EQ(0, ime_->process_key_event_post_ime_call_count());
-
- // Do callback for first key event.
- first_callback.Run(true);
-
- // Check the results for first key event.
- EXPECT_EQ(1, ime_->process_key_event_post_ime_call_count());
- const ui::KeyEvent* stored_event =
- ime_->process_key_event_post_ime_args().event;
- EXPECT_TRUE(stored_event->HasNativeEvent());
- EXPECT_TRUE(IsEqualXKeyEvent(*xevent, *(stored_event->native_event())));
- EXPECT_TRUE(ime_->process_key_event_post_ime_args().handled);
-
- // Do callback for second key event.
- mock_ime_engine_handler_->last_passed_callback().Run(false);
-
- // Check the results for second key event.
- EXPECT_EQ(2, ime_->process_key_event_post_ime_call_count());
- stored_event = ime_->process_key_event_post_ime_args().event;
- EXPECT_TRUE(stored_event->HasNativeEvent());
- EXPECT_TRUE(IsEqualXKeyEvent(*xevent2, *(stored_event->native_event())));
- EXPECT_FALSE(ime_->process_key_event_post_ime_args().handled);
-}
-
-TEST_F(InputMethodChromeOSKeyEventTest, KeyEventDelayResponseResetTest) {
- ScopedXI2Event xevent;
- xevent.InitKeyEvent(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_SHIFT_DOWN);
- const ui::KeyEvent event(xevent);
-
- // Do key event.
- input_type_ = TEXT_INPUT_TYPE_TEXT;
- ime_->OnTextInputTypeChanged(this);
- ime_->DispatchKeyEvent(event);
-
- // Check before state.
- EXPECT_EQ(1, mock_ime_engine_handler_->process_key_event_call_count());
- EXPECT_EQ(0, ime_->process_key_event_post_ime_call_count());
-
- ime_->ResetContext();
-
- // Do callback.
- mock_ime_engine_handler_->last_passed_callback().Run(true);
-
- EXPECT_EQ(0, ime_->process_key_event_post_ime_call_count());
-}
-// TODO(nona): Introduce ProcessKeyEventPostIME tests(crbug.com/156593).
-
-} // namespace ui
« no previous file with comments | « ui/base/ime/input_method_chromeos.cc ('k') | ui/base/ime/input_method_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698