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