| Index: ui/base/ime/input_method_base_unittest.cc
|
| diff --git a/ui/base/ime/input_method_base_unittest.cc b/ui/base/ime/input_method_base_unittest.cc
|
| deleted file mode 100644
|
| index 48d0c096138c3aa12addb5b9c3575494e56881da..0000000000000000000000000000000000000000
|
| --- a/ui/base/ime/input_method_base_unittest.cc
|
| +++ /dev/null
|
| @@ -1,394 +0,0 @@
|
| -// Copyright 2013 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_base.h"
|
| -
|
| -#include "base/gtest_prod_util.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/message_loop/message_loop.h"
|
| -#include "base/run_loop.h"
|
| -#include "base/scoped_observer.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -#include "ui/base/ime/dummy_text_input_client.h"
|
| -#include "ui/base/ime/input_method_observer.h"
|
| -#include "ui/base/ime/text_input_focus_manager.h"
|
| -#include "ui/base/ui_base_switches_util.h"
|
| -#include "ui/events/event.h"
|
| -
|
| -namespace ui {
|
| -namespace {
|
| -
|
| -class ClientChangeVerifier {
|
| - public:
|
| - ClientChangeVerifier()
|
| - : previous_client_(NULL),
|
| - next_client_(NULL),
|
| - call_expected_(false),
|
| - on_will_change_focused_client_called_(false),
|
| - on_did_change_focused_client_called_(false),
|
| - on_text_input_state_changed_(false) {
|
| - }
|
| -
|
| - // Expects that focused text input client will not be changed.
|
| - void ExpectClientDoesNotChange() {
|
| - previous_client_ = NULL;
|
| - next_client_ = NULL;
|
| - call_expected_ = false;
|
| - on_will_change_focused_client_called_ = false;
|
| - on_did_change_focused_client_called_ = false;
|
| - on_text_input_state_changed_ = false;
|
| - }
|
| -
|
| - // Expects that focused text input client will be changed from
|
| - // |previous_client| to |next_client|.
|
| - void ExpectClientChange(TextInputClient* previous_client,
|
| - TextInputClient* next_client) {
|
| - previous_client_ = previous_client;
|
| - next_client_ = next_client;
|
| - call_expected_ = true;
|
| - on_will_change_focused_client_called_ = false;
|
| - on_did_change_focused_client_called_ = false;
|
| - on_text_input_state_changed_ = false;
|
| - }
|
| -
|
| - // Verifies the result satisfies the expectation or not.
|
| - void Verify() {
|
| - if (switches::IsTextInputFocusManagerEnabled()) {
|
| - EXPECT_FALSE(on_will_change_focused_client_called_);
|
| - EXPECT_FALSE(on_did_change_focused_client_called_);
|
| - EXPECT_FALSE(on_text_input_state_changed_);
|
| - } else {
|
| - EXPECT_EQ(call_expected_, on_will_change_focused_client_called_);
|
| - EXPECT_EQ(call_expected_, on_did_change_focused_client_called_);
|
| - EXPECT_EQ(call_expected_, on_text_input_state_changed_);
|
| - }
|
| - }
|
| -
|
| - void OnWillChangeFocusedClient(TextInputClient* focused_before,
|
| - TextInputClient* focused) {
|
| - EXPECT_TRUE(call_expected_);
|
| -
|
| - // Check arguments
|
| - EXPECT_EQ(previous_client_, focused_before);
|
| - EXPECT_EQ(next_client_, focused);
|
| -
|
| - // Check call order
|
| - EXPECT_FALSE(on_will_change_focused_client_called_);
|
| - EXPECT_FALSE(on_did_change_focused_client_called_);
|
| - EXPECT_FALSE(on_text_input_state_changed_);
|
| -
|
| - on_will_change_focused_client_called_ = true;
|
| - }
|
| -
|
| - void OnDidChangeFocusedClient(TextInputClient* focused_before,
|
| - TextInputClient* focused) {
|
| - EXPECT_TRUE(call_expected_);
|
| -
|
| - // Check arguments
|
| - EXPECT_EQ(previous_client_, focused_before);
|
| - EXPECT_EQ(next_client_, focused);
|
| -
|
| - // Check call order
|
| - EXPECT_TRUE(on_will_change_focused_client_called_);
|
| - EXPECT_FALSE(on_did_change_focused_client_called_);
|
| - EXPECT_FALSE(on_text_input_state_changed_);
|
| -
|
| - on_did_change_focused_client_called_ = true;
|
| - }
|
| -
|
| - void OnTextInputStateChanged(const TextInputClient* client) {
|
| - EXPECT_TRUE(call_expected_);
|
| -
|
| - // Check arguments
|
| - EXPECT_EQ(next_client_, client);
|
| -
|
| - // Check call order
|
| - EXPECT_TRUE(on_will_change_focused_client_called_);
|
| - EXPECT_TRUE(on_did_change_focused_client_called_);
|
| - EXPECT_FALSE(on_text_input_state_changed_);
|
| -
|
| - on_text_input_state_changed_ = true;
|
| - }
|
| -
|
| - private:
|
| - TextInputClient* previous_client_;
|
| - TextInputClient* next_client_;
|
| - bool call_expected_;
|
| - bool on_will_change_focused_client_called_;
|
| - bool on_did_change_focused_client_called_;
|
| - bool on_text_input_state_changed_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(ClientChangeVerifier);
|
| -};
|
| -
|
| -class InputMethodBaseTest : public testing::Test {
|
| - protected:
|
| - InputMethodBaseTest() {
|
| - }
|
| - virtual ~InputMethodBaseTest() {
|
| - }
|
| -
|
| - virtual void SetUp() {
|
| - message_loop_.reset(new base::MessageLoopForUI);
|
| - }
|
| -
|
| - virtual void TearDown() {
|
| - message_loop_.reset();
|
| - }
|
| -
|
| - private:
|
| - scoped_ptr<base::MessageLoop> message_loop_;
|
| - DISALLOW_COPY_AND_ASSIGN(InputMethodBaseTest);
|
| -};
|
| -
|
| -class MockInputMethodBase : public InputMethodBase {
|
| - public:
|
| - // Note: this class does not take the ownership of |verifier|.
|
| - MockInputMethodBase(ClientChangeVerifier* verifier) : verifier_(verifier) {
|
| - }
|
| - ~MockInputMethodBase() override {}
|
| -
|
| - private:
|
| - // Overriden from InputMethod.
|
| - bool OnUntranslatedIMEMessage(
|
| - const base::NativeEvent& event,
|
| - InputMethod::NativeEventResult* result) override {
|
| - return false;
|
| - }
|
| - bool DispatchKeyEvent(const ui::KeyEvent&) override { return false; }
|
| - void OnCaretBoundsChanged(const TextInputClient* client) override {}
|
| - void CancelComposition(const TextInputClient* client) override {}
|
| - void OnInputLocaleChanged() override {}
|
| - std::string GetInputLocale() override { return ""; }
|
| - bool IsActive() override { return false; }
|
| - bool IsCandidatePopupOpen() const override { return false; }
|
| - // Overriden from InputMethodBase.
|
| - void OnWillChangeFocusedClient(TextInputClient* focused_before,
|
| - TextInputClient* focused) override {
|
| - verifier_->OnWillChangeFocusedClient(focused_before, focused);
|
| - }
|
| -
|
| - void OnDidChangeFocusedClient(TextInputClient* focused_before,
|
| - TextInputClient* focused) override {
|
| - verifier_->OnDidChangeFocusedClient(focused_before, focused);
|
| - }
|
| -
|
| - ClientChangeVerifier* verifier_;
|
| -
|
| - FRIEND_TEST_ALL_PREFIXES(InputMethodBaseTest, CandidateWindowEvents);
|
| - DISALLOW_COPY_AND_ASSIGN(MockInputMethodBase);
|
| -};
|
| -
|
| -class MockInputMethodObserver : public InputMethodObserver {
|
| - public:
|
| - // Note: this class does not take the ownership of |verifier|.
|
| - explicit MockInputMethodObserver(ClientChangeVerifier* verifier)
|
| - : verifier_(verifier) {
|
| - }
|
| - ~MockInputMethodObserver() override {}
|
| -
|
| - private:
|
| - void OnTextInputTypeChanged(const TextInputClient* client) override {}
|
| - void OnFocus() override {}
|
| - void OnBlur() override {}
|
| - void OnCaretBoundsChanged(const TextInputClient* client) override {}
|
| - void OnTextInputStateChanged(const TextInputClient* client) override {
|
| - verifier_->OnTextInputStateChanged(client);
|
| - }
|
| - void OnShowImeIfNeeded() override {}
|
| - void OnInputMethodDestroyed(const InputMethod* client) override {}
|
| -
|
| - ClientChangeVerifier* verifier_;
|
| - DISALLOW_COPY_AND_ASSIGN(MockInputMethodObserver);
|
| -};
|
| -
|
| -class MockTextInputClient : public DummyTextInputClient {
|
| - public:
|
| - MockTextInputClient()
|
| - : shown_event_count_(0), updated_event_count_(0), hidden_event_count_(0) {
|
| - }
|
| - ~MockTextInputClient() override {}
|
| -
|
| - void OnCandidateWindowShown() override { ++shown_event_count_; }
|
| - void OnCandidateWindowUpdated() override { ++updated_event_count_; }
|
| - void OnCandidateWindowHidden() override { ++hidden_event_count_; }
|
| -
|
| - int shown_event_count() const { return shown_event_count_; }
|
| - int updated_event_count() const { return updated_event_count_; }
|
| - int hidden_event_count() const { return hidden_event_count_; }
|
| -
|
| - private:
|
| - int shown_event_count_;
|
| - int updated_event_count_;
|
| - int hidden_event_count_;
|
| -};
|
| -
|
| -typedef ScopedObserver<InputMethod, InputMethodObserver>
|
| - InputMethodScopedObserver;
|
| -
|
| -void SetFocusedTextInputClient(InputMethod* input_method,
|
| - TextInputClient* text_input_client) {
|
| - if (switches::IsTextInputFocusManagerEnabled()) {
|
| - TextInputFocusManager::GetInstance()->FocusTextInputClient(
|
| - text_input_client);
|
| - } else {
|
| - input_method->SetFocusedTextInputClient(text_input_client);
|
| - }
|
| -}
|
| -
|
| -TEST_F(InputMethodBaseTest, SetFocusedTextInputClient) {
|
| - DummyTextInputClient text_input_client_1st;
|
| - DummyTextInputClient text_input_client_2nd;
|
| -
|
| - ClientChangeVerifier verifier;
|
| - MockInputMethodBase input_method(&verifier);
|
| - MockInputMethodObserver input_method_observer(&verifier);
|
| - InputMethodScopedObserver scoped_observer(&input_method_observer);
|
| - scoped_observer.Add(&input_method);
|
| -
|
| - // Assume that the top-level-widget gains focus.
|
| - input_method.OnFocus();
|
| -
|
| - {
|
| - SCOPED_TRACE("Focus from NULL to 1st TextInputClient");
|
| -
|
| - ASSERT_EQ(NULL, input_method.GetTextInputClient());
|
| - verifier.ExpectClientChange(NULL, &text_input_client_1st);
|
| - SetFocusedTextInputClient(&input_method, &text_input_client_1st);
|
| - EXPECT_EQ(&text_input_client_1st, input_method.GetTextInputClient());
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("Redundant focus events must be ignored");
|
| - verifier.ExpectClientDoesNotChange();
|
| - SetFocusedTextInputClient(&input_method, &text_input_client_1st);
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("Focus from 1st to 2nd TextInputClient");
|
| -
|
| - ASSERT_EQ(&text_input_client_1st, input_method.GetTextInputClient());
|
| - verifier.ExpectClientChange(&text_input_client_1st,
|
| - &text_input_client_2nd);
|
| - SetFocusedTextInputClient(&input_method, &text_input_client_2nd);
|
| - EXPECT_EQ(&text_input_client_2nd, input_method.GetTextInputClient());
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("Focus from 2nd TextInputClient to NULL");
|
| -
|
| - ASSERT_EQ(&text_input_client_2nd, input_method.GetTextInputClient());
|
| - verifier.ExpectClientChange(&text_input_client_2nd, NULL);
|
| - SetFocusedTextInputClient(&input_method, NULL);
|
| - EXPECT_EQ(NULL, input_method.GetTextInputClient());
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("Redundant focus events must be ignored");
|
| - verifier.ExpectClientDoesNotChange();
|
| - SetFocusedTextInputClient(&input_method, NULL);
|
| - verifier.Verify();
|
| - }
|
| -}
|
| -
|
| -TEST_F(InputMethodBaseTest, DetachTextInputClient) {
|
| - // DetachTextInputClient is not supported when IsTextInputFocusManagerEnabled.
|
| - if (switches::IsTextInputFocusManagerEnabled())
|
| - return;
|
| -
|
| - DummyTextInputClient text_input_client;
|
| - DummyTextInputClient text_input_client_the_other;
|
| -
|
| - ClientChangeVerifier verifier;
|
| - MockInputMethodBase input_method(&verifier);
|
| - MockInputMethodObserver input_method_observer(&verifier);
|
| - InputMethodScopedObserver scoped_observer(&input_method_observer);
|
| - scoped_observer.Add(&input_method);
|
| -
|
| - // Assume that the top-level-widget gains focus.
|
| - input_method.OnFocus();
|
| -
|
| - // Initialize for the next test.
|
| - {
|
| - verifier.ExpectClientChange(NULL, &text_input_client);
|
| - input_method.SetFocusedTextInputClient(&text_input_client);
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("DetachTextInputClient must be ignored for other clients");
|
| - ASSERT_EQ(&text_input_client, input_method.GetTextInputClient());
|
| - verifier.ExpectClientDoesNotChange();
|
| - input_method.DetachTextInputClient(&text_input_client_the_other);
|
| - EXPECT_EQ(&text_input_client, input_method.GetTextInputClient());
|
| - verifier.Verify();
|
| - }
|
| -
|
| - {
|
| - SCOPED_TRACE("DetachTextInputClient must succeed even after the "
|
| - "top-level loses the focus");
|
| -
|
| - ASSERT_EQ(&text_input_client, input_method.GetTextInputClient());
|
| - input_method.OnBlur();
|
| - input_method.OnFocus();
|
| - verifier.ExpectClientChange(&text_input_client, NULL);
|
| - input_method.DetachTextInputClient(&text_input_client);
|
| - EXPECT_EQ(NULL, input_method.GetTextInputClient());
|
| - verifier.Verify();
|
| - }
|
| -}
|
| -
|
| -TEST_F(InputMethodBaseTest, CandidateWindowEvents) {
|
| - MockTextInputClient text_input_client;
|
| -
|
| - {
|
| - ClientChangeVerifier verifier;
|
| - MockInputMethodBase input_method_base(&verifier);
|
| - input_method_base.OnFocus();
|
| -
|
| - verifier.ExpectClientChange(NULL, &text_input_client);
|
| - SetFocusedTextInputClient(&input_method_base, &text_input_client);
|
| -
|
| - EXPECT_EQ(0, text_input_client.shown_event_count());
|
| - EXPECT_EQ(0, text_input_client.updated_event_count());
|
| - EXPECT_EQ(0, text_input_client.hidden_event_count());
|
| -
|
| - input_method_base.OnCandidateWindowShown();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, text_input_client.shown_event_count());
|
| - EXPECT_EQ(0, text_input_client.updated_event_count());
|
| - EXPECT_EQ(0, text_input_client.hidden_event_count());
|
| -
|
| - input_method_base.OnCandidateWindowUpdated();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, text_input_client.shown_event_count());
|
| - EXPECT_EQ(1, text_input_client.updated_event_count());
|
| - EXPECT_EQ(0, text_input_client.hidden_event_count());
|
| -
|
| - input_method_base.OnCandidateWindowHidden();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - EXPECT_EQ(1, text_input_client.shown_event_count());
|
| - EXPECT_EQ(1, text_input_client.updated_event_count());
|
| - EXPECT_EQ(1, text_input_client.hidden_event_count());
|
| -
|
| - input_method_base.OnCandidateWindowShown();
|
| - }
|
| -
|
| - // If InputMethod is deleted immediately after an event happens, but before
|
| - // its callback is invoked, the callback will be cancelled.
|
| - base::RunLoop().RunUntilIdle();
|
| - EXPECT_EQ(1, text_input_client.shown_event_count());
|
| - EXPECT_EQ(1, text_input_client.updated_event_count());
|
| - EXPECT_EQ(1, text_input_client.hidden_event_count());
|
| -}
|
| -
|
| -} // namespace
|
| -} // namespace ui
|
|
|