input_method_engine_unittest.cc revision 0529e5d033099cbfc42635f6f6183833b09dff6e
1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "base/logging.h" 6#include "chrome/browser/chromeos/input_method/input_method_configuration.h" 7#include "chrome/browser/chromeos/input_method/input_method_engine.h" 8#include "chrome/browser/chromeos/input_method/input_method_engine_interface.h" 9#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 10#include "chromeos/ime/extension_ime_util.h" 11#include "chromeos/ime/mock_component_extension_ime_manager_delegate.h" 12#include "testing/gtest/include/gtest/gtest.h" 13 14namespace chromeos { 15 16namespace input_method { 17namespace { 18 19const char kTestExtensionId[] = "mppnpdlheglhdfmldimlhpnegondlapf"; 20const char kTestExtensionId2[] = "dmpipdbjkoajgdeppkffbjhngfckdloi"; 21const char kTestImeEngineId[] = "test_engine_id"; 22 23enum CallsBitmap { 24 NONE = 0U, 25 ACTIVATE = 1U, 26 DEACTIVATED = 2U, 27 ONFOCUS = 4U, 28 ONBLUR = 8U 29}; 30 31void InitInputMethod() { 32 ComponentExtensionIMEManager* comp_ime_manager = 33 new ComponentExtensionIMEManager; 34 MockComponentExtIMEManagerDelegate* delegate = 35 new MockComponentExtIMEManagerDelegate; 36 37 ComponentExtensionIME ext1; 38 ext1.id = kTestExtensionId; 39 40 ComponentExtensionEngine ext1_engine1; 41 ext1_engine1.engine_id = kTestImeEngineId; 42 ext1_engine1.language_codes.push_back("en-US"); 43 ext1_engine1.layouts.push_back("us"); 44 ext1.engines.push_back(ext1_engine1); 45 46 std::vector<ComponentExtensionIME> ime_list; 47 ime_list.push_back(ext1); 48 delegate->set_ime_list(ime_list); 49 comp_ime_manager->Initialize( 50 scoped_ptr<ComponentExtensionIMEManagerDelegate>(delegate).Pass()); 51 52 MockInputMethodManager* manager = new MockInputMethodManager; 53 manager->SetComponentExtensionIMEManager( 54 scoped_ptr<ComponentExtensionIMEManager>(comp_ime_manager).Pass()); 55 InitializeForTesting(manager); 56} 57 58class TestObserver : public InputMethodEngineInterface::Observer { 59 public: 60 TestObserver() : calls_bitmap_(NONE) {} 61 virtual ~TestObserver() {} 62 63 virtual void OnActivate(const std::string& engine_id) OVERRIDE { 64 calls_bitmap_ |= ACTIVATE; 65 } 66 virtual void OnDeactivated(const std::string& engine_id) OVERRIDE { 67 calls_bitmap_ |= DEACTIVATED; 68 } 69 virtual void OnFocus( 70 const InputMethodEngineInterface::InputContext& context) OVERRIDE { 71 calls_bitmap_ |= ONFOCUS; 72 } 73 virtual void OnBlur(int context_id) OVERRIDE { 74 calls_bitmap_ |= ONBLUR; 75 } 76 virtual void OnKeyEvent( 77 const std::string& engine_id, 78 const InputMethodEngineInterface::KeyboardEvent& event, 79 input_method::KeyEventHandle* key_data) OVERRIDE {} 80 virtual void OnInputContextUpdate( 81 const InputMethodEngineInterface::InputContext& context) OVERRIDE {} 82 virtual void OnCandidateClicked( 83 const std::string& engine_id, 84 int candidate_id, 85 InputMethodEngineInterface::MouseButtonEvent button) OVERRIDE {} 86 virtual void OnMenuItemActivated( 87 const std::string& engine_id, 88 const std::string& menu_id) OVERRIDE {} 89 virtual void OnSurroundingTextChanged( 90 const std::string& engine_id, 91 const std::string& text, 92 int cursor_pos, 93 int anchor_pos) OVERRIDE {} 94 virtual void OnReset(const std::string& engine_id) OVERRIDE {} 95 96 unsigned char GetCallsBitmapAndReset() { 97 unsigned char ret = calls_bitmap_; 98 calls_bitmap_ = NONE; 99 return ret; 100 } 101 102 private: 103 unsigned char calls_bitmap_; 104 105 DISALLOW_COPY_AND_ASSIGN(TestObserver); 106}; 107 108class InputMethodEngineTest : public testing::Test { 109 public: 110 InputMethodEngineTest() : observer_(NULL), input_view_("inputview.html") { 111 languages_.push_back("en-US"); 112 layouts_.push_back("us"); 113 InitInputMethod(); 114 IMEBridge::Initialize(); 115 } 116 virtual ~InputMethodEngineTest() { 117 engine_.reset(); 118 Shutdown(); 119 } 120 121 protected: 122 void CreateEngine(bool whitelisted) { 123 engine_.reset(new InputMethodEngine()); 124 observer_ = new TestObserver(); 125 scoped_ptr<InputMethodEngineInterface::Observer> observer_ptr(observer_); 126 engine_->Initialize(observer_ptr.Pass(), 127 "", 128 whitelisted ? kTestExtensionId : kTestExtensionId2, 129 kTestImeEngineId, 130 languages_, 131 layouts_, 132 options_page_, 133 input_view_); 134 } 135 136 void FocusIn(ui::TextInputType input_type) { 137 IMEEngineHandlerInterface::InputContext input_context( 138 input_type, ui::TEXT_INPUT_MODE_DEFAULT); 139 engine_->FocusIn(input_context); 140 IMEBridge::Get()->SetCurrentTextInputType(input_type); 141 } 142 143 scoped_ptr<InputMethodEngine> engine_; 144 TestObserver* observer_; 145 std::vector<std::string> languages_; 146 std::vector<std::string> layouts_; 147 GURL options_page_; 148 GURL input_view_; 149 150 private: 151 DISALLOW_COPY_AND_ASSIGN(InputMethodEngineTest); 152}; 153 154} // namespace 155 156TEST_F(InputMethodEngineTest, TestSwitching) { 157 CreateEngine(false); 158 // Enable/disable with focus. 159 FocusIn(ui::TEXT_INPUT_TYPE_URL); 160 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 161 engine_->Enable(); 162 EXPECT_EQ(ACTIVATE | ONFOCUS, observer_->GetCallsBitmapAndReset()); 163 engine_->Disable(); 164 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 165 // Enable/disable without focus. 166 engine_->FocusOut(); 167 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 168 engine_->Enable(); 169 EXPECT_EQ(ACTIVATE | ONFOCUS, observer_->GetCallsBitmapAndReset()); 170 engine_->Disable(); 171 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 172 // Focus change when enabled. 173 engine_->Enable(); 174 EXPECT_EQ(ACTIVATE | ONFOCUS, observer_->GetCallsBitmapAndReset()); 175 engine_->FocusOut(); 176 EXPECT_EQ(ONBLUR, observer_->GetCallsBitmapAndReset()); 177 // Focus change when disabled. 178 engine_->Disable(); 179 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 180 FocusIn(ui::TEXT_INPUT_TYPE_TEXT); 181 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 182 engine_->FocusOut(); 183 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 184} 185 186TEST_F(InputMethodEngineTest, TestSwitching_Password_3rd_Party) { 187 CreateEngine(false); 188 // Enable/disable with focus. 189 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD); 190 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 191 engine_->Enable(); 192 EXPECT_EQ(ACTIVATE, observer_->GetCallsBitmapAndReset()); 193 engine_->Disable(); 194 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 195 // Focus change when enabled. 196 engine_->Enable(); 197 EXPECT_EQ(ACTIVATE, observer_->GetCallsBitmapAndReset()); 198 engine_->FocusOut(); 199 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 200 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD); 201 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 202 engine_->Disable(); 203 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 204} 205 206TEST_F(InputMethodEngineTest, TestSwitching_Password_Whitelisted) { 207 CreateEngine(true); 208 // Enable/disable with focus. 209 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD); 210 EXPECT_EQ(NONE, observer_->GetCallsBitmapAndReset()); 211 engine_->Enable(); 212 EXPECT_EQ(ACTIVATE | ONFOCUS, observer_->GetCallsBitmapAndReset()); 213 engine_->Disable(); 214 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 215 // Focus change when enabled. 216 engine_->Enable(); 217 EXPECT_EQ(ACTIVATE | ONFOCUS, observer_->GetCallsBitmapAndReset()); 218 engine_->FocusOut(); 219 EXPECT_EQ(ONBLUR, observer_->GetCallsBitmapAndReset()); 220 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD); 221 EXPECT_EQ(ONFOCUS, observer_->GetCallsBitmapAndReset()); 222 engine_->Disable(); 223 EXPECT_EQ(DEACTIVATED, observer_->GetCallsBitmapAndReset()); 224} 225 226} // namespace input_method 227} // namespace chromeos 228