1d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)// found in the LICENSE file.
4d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/base/ime/input_method_base.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/gtest_prod_util.h"
8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
9a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/message_loop/message_loop.h"
10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "base/run_loop.h"
11d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "base/scoped_observer.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/base/ime/dummy_text_input_client.h"
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/base/ime/input_method_observer.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace ui {
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace {
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
20d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)class ClientChangeVerifier {
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientChangeVerifier()
23d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)     : previous_client_(NULL),
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       next_client_(NULL),
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       call_expected_(false),
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       on_will_change_focused_client_called_(false),
27d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       on_did_change_focused_client_called_(false),
28d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)       on_text_input_state_changed_(false) {
29d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
30d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
31d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Expects that focused text input client will not be changed.
32d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void ExpectClientDoesNotChange() {
33d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    previous_client_ = NULL;
34d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    next_client_ = NULL;
35d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    call_expected_ = false;
36d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_will_change_focused_client_called_ = false;
37d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_did_change_focused_client_called_ = false;
38d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_text_input_state_changed_ = false;
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
40d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
41d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Expects that focused text input client will be changed from
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // |previous_client| to |next_client|.
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void ExpectClientChange(TextInputClient* previous_client,
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                          TextInputClient* next_client) {
45d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    previous_client_ = previous_client;
46d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    next_client_ = next_client;
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    call_expected_ = true;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_will_change_focused_client_called_ = false;
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_did_change_focused_client_called_ = false;
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_text_input_state_changed_ = false;
51d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
52d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
53d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Verifies the result satisfies the expectation or not.
54d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void Verify() {
55d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(call_expected_, on_will_change_focused_client_called_);
56d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(call_expected_, on_did_change_focused_client_called_);
57d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(call_expected_, on_text_input_state_changed_);
58d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
59d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
60d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnWillChangeFocusedClient(TextInputClient* focused_before,
61d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                 TextInputClient* focused) {
62d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(call_expected_);
63d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check arguments
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(previous_client_, focused_before);
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(next_client_, focused);
67d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
68d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check call order
69d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_will_change_focused_client_called_);
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_did_change_focused_client_called_);
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_text_input_state_changed_);
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
73d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_will_change_focused_client_called_ = true;
74d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
75d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
76d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnDidChangeFocusedClient(TextInputClient* focused_before,
77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                TextInputClient* focused) {
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(call_expected_);
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check arguments
81d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(previous_client_, focused_before);
82d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(next_client_, focused);
83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
84d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check call order
85d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(on_will_change_focused_client_called_);
86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_did_change_focused_client_called_);
87d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_text_input_state_changed_);
88d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
89d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_did_change_focused_client_called_ = true;
90d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }
91d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
92d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  void OnTextInputStateChanged(const TextInputClient* client) {
93d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(call_expected_);
94d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
95d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check arguments
96d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(next_client_, client);
97d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
98d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    // Check call order
99d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(on_will_change_focused_client_called_);
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_TRUE(on_did_change_focused_client_called_);
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_FALSE(on_text_input_state_changed_);
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    on_text_input_state_changed_ = true;
104d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) }
105d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
106d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
107d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TextInputClient* previous_client_;
108d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  TextInputClient* next_client_;
109d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool call_expected_;
110d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool on_will_change_focused_client_called_;
111d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool on_did_change_focused_client_called_;
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool on_text_input_state_changed_;
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ClientChangeVerifier);
115d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
116d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class InputMethodBaseTest : public testing::Test {
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) protected:
119a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  InputMethodBaseTest() {
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~InputMethodBaseTest() {
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void SetUp() {
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    message_loop_.reset(new base::MessageLoopForUI);
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void TearDown() {
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    message_loop_.reset();
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  scoped_ptr<base::MessageLoop> message_loop_;
134a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InputMethodBaseTest);
135a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockInputMethodBase : public InputMethodBase {
138d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) public:
139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Note: this class does not take the ownership of |verifier|.
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockInputMethodBase(ClientChangeVerifier* verifier) : verifier_(verifier) {
141d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual ~MockInputMethodBase() {
143d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
144d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
145d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) private:
146d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overriden from InputMethod.
147d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool OnUntranslatedIMEMessage(
148d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      const base::NativeEvent& event,
149d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      InputMethod::NativeEventResult* result) OVERRIDE {
150d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
151d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual bool DispatchKeyEvent(const ui::KeyEvent&) OVERRIDE {
153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE {
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
1571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void CancelComposition(const TextInputClient* client) OVERRIDE {
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnInputLocaleChanged() OVERRIDE {
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual std::string GetInputLocale() OVERRIDE{
162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return "";
163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual base::i18n::TextDirection GetInputTextDirection() OVERRIDE {
165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return base::i18n::UNKNOWN_DIRECTION;
166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool IsActive() OVERRIDE {
168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
169d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
170d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual bool IsCandidatePopupOpen() const OVERRIDE {
171d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
172d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
173d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Overriden from InputMethodBase.
174d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnWillChangeFocusedClient(TextInputClient* focused_before,
175d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                         TextInputClient* focused) OVERRIDE {
176d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier_->OnWillChangeFocusedClient(focused_before, focused);
177d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
178d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
179d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  virtual void OnDidChangeFocusedClient(TextInputClient* focused_before,
180d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                        TextInputClient* focused) OVERRIDE {
181d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier_->OnDidChangeFocusedClient(focused_before, focused);
182d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
183d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
184d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientChangeVerifier* verifier_;
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
186a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(InputMethodBaseTest, CandidateWindowEvents);
187d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockInputMethodBase);
188d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
189d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class MockInputMethodObserver : public InputMethodObserver {
1911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public:
1921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Note: this class does not take the ownership of |verifier|.
1931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit MockInputMethodObserver(ClientChangeVerifier* verifier)
1941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      : verifier_(verifier) {
1951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual ~MockInputMethodObserver() {
1971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
1981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private:
200f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnTextInputTypeChanged(const TextInputClient* client) OVERRIDE {
201f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
202f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnFocus() OVERRIDE {
203f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
204f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnBlur() OVERRIDE {
205f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
206f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnCaretBoundsChanged(const TextInputClient* client) OVERRIDE {
207f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
208f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnTextInputStateChanged(const TextInputClient* client) OVERRIDE {
2091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    verifier_->OnTextInputStateChanged(client);
210d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
211f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void OnInputMethodDestroyed(const InputMethod* client) OVERRIDE {
212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
213d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
214d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientChangeVerifier* verifier_;
215d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MockInputMethodObserver);
216d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)};
217d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class MockTextInputClient : public DummyTextInputClient {
219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) public:
220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockTextInputClient()
221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      : shown_event_count_(0), updated_event_count_(0), hidden_event_count_(0) {
222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual ~MockTextInputClient() {
224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnCandidateWindowShown() OVERRIDE {
227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ++shown_event_count_;
228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnCandidateWindowUpdated() OVERRIDE {
230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ++updated_event_count_;
231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void OnCandidateWindowHidden() OVERRIDE {
233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ++hidden_event_count_;
234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int shown_event_count() const { return shown_event_count_; }
237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int updated_event_count() const { return updated_event_count_; }
238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int hidden_event_count() const { return hidden_event_count_; }
239a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
240a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) private:
241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int shown_event_count_;
242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int updated_event_count_;
243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int hidden_event_count_;
244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)};
245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)typedef ScopedObserver<InputMethod, InputMethodObserver>
247d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    InputMethodScopedObserver;
248d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputMethodBaseTest, SetFocusedTextInputClient) {
250d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DummyTextInputClient text_input_client_1st;
251d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DummyTextInputClient text_input_client_2nd;
252d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
253d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientChangeVerifier verifier;
254d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MockInputMethodBase input_method(&verifier);
255d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MockInputMethodObserver input_method_observer(&verifier);
256d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InputMethodScopedObserver scoped_observer(&input_method_observer);
257d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_observer.Add(&input_method);
258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
259d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Assume that the top-level-widget gains focus.
260d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  input_method.OnFocus();
261d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
262d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
263d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("Focus from NULL to 1st TextInputClient");
264d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
265d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(NULL, input_method.GetTextInputClient());
266d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientChange(NULL, &text_input_client_1st);
267d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(&text_input_client_1st);
268d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(&text_input_client_1st, input_method.GetTextInputClient());
269d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
270d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
271d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
272d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
273d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("Redundant focus events must be ignored");
274d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientDoesNotChange();
275d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(&text_input_client_1st);
276d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
277d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("Focus from 1st to 2nd TextInputClient");
281d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(&text_input_client_1st, input_method.GetTextInputClient());
283d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientChange(&text_input_client_1st,
284d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                                &text_input_client_2nd);
285d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(&text_input_client_2nd);
286d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(&text_input_client_2nd, input_method.GetTextInputClient());
287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
290d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
291d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("Focus from 2nd TextInputClient to NULL");
292d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
293d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(&text_input_client_2nd, input_method.GetTextInputClient());
294d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientChange(&text_input_client_2nd, NULL);
295d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(NULL);
296d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(NULL, input_method.GetTextInputClient());
297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
299d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
300d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
301d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("Redundant focus events must be ignored");
302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientDoesNotChange();
303d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(NULL);
304d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
305d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
306d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
307d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
308a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputMethodBaseTest, DetachTextInputClient) {
309d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DummyTextInputClient text_input_client;
310d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  DummyTextInputClient text_input_client_the_other;
311d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
312d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  ClientChangeVerifier verifier;
313d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MockInputMethodBase input_method(&verifier);
314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  MockInputMethodObserver input_method_observer(&verifier);
315d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  InputMethodScopedObserver scoped_observer(&input_method_observer);
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  scoped_observer.Add(&input_method);
317d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
318d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Assume that the top-level-widget gains focus.
319d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  input_method.OnFocus();
320d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
321d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Initialize for the next test.
322d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
323d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientChange(NULL, &text_input_client);
324d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.SetFocusedTextInputClient(&text_input_client);
325d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
326d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
327d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
329d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("DetachTextInputClient must be ignored for other clients");
330d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(&text_input_client, input_method.GetTextInputClient());
331d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientDoesNotChange();
332d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.DetachTextInputClient(&text_input_client_the_other);
333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(&text_input_client, input_method.GetTextInputClient());
334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
335d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
336d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
337d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  {
338d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    SCOPED_TRACE("DetachTextInputClient must succeed even after the "
339d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                 "top-level loses the focus");
340d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
341d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    ASSERT_EQ(&text_input_client, input_method.GetTextInputClient());
342d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.OnBlur();
343d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.OnFocus();
344d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.ExpectClientChange(&text_input_client, NULL);
345d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    input_method.DetachTextInputClient(&text_input_client);
346d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    EXPECT_EQ(NULL, input_method.GetTextInputClient());
347d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    verifier.Verify();
348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  }
349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}
350d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(InputMethodBaseTest, CandidateWindowEvents) {
352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  MockTextInputClient text_input_client;
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  {
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ClientChangeVerifier verifier;
356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    MockInputMethodBase input_method_base(&verifier);
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.OnFocus();
358a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    verifier.ExpectClientChange(NULL, &text_input_client);
360a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.SetFocusedTextInputClient(&text_input_client);
361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
362a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.shown_event_count());
363a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.updated_event_count());
364a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.hidden_event_count());
365a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.OnCandidateWindowShown();
367a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
368a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.shown_event_count());
370a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.updated_event_count());
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.hidden_event_count());
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.OnCandidateWindowUpdated();
374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.shown_event_count());
377a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.updated_event_count());
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(0, text_input_client.hidden_event_count());
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
380a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.OnCandidateWindowHidden();
381a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    base::RunLoop().RunUntilIdle();
382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
383a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.shown_event_count());
384a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.updated_event_count());
385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    EXPECT_EQ(1, text_input_client.hidden_event_count());
386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
387a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    input_method_base.OnCandidateWindowShown();
388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
389a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // If InputMethod is deleted immediately after an event happens, but before
391a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // its callback is invoked, the callback will be cancelled.
392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::RunLoop().RunUntilIdle();
393a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(1, text_input_client.shown_event_count());
394a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(1, text_input_client.updated_event_count());
395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  EXPECT_EQ(1, text_input_client.hidden_event_count());
396a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
397a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
398d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace
399d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace ui
400