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.
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"
16 namespace input_method
{
19 const char kTestExtensionId
[] = "mppnpdlheglhdfmldimlhpnegondlapf";
20 const char kTestExtensionId2
[] = "dmpipdbjkoajgdeppkffbjhngfckdloi";
21 const char kTestImeEngineId
[] = "test_engine_id";
31 void InitInputMethod() {
32 ComponentExtensionIMEManager
* comp_ime_manager
=
33 new ComponentExtensionIMEManager
;
34 MockComponentExtIMEManagerDelegate
* delegate
=
35 new MockComponentExtIMEManagerDelegate
;
37 ComponentExtensionIME ext1
;
38 ext1
.id
= kTestExtensionId
;
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
);
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());
52 MockInputMethodManager
* manager
= new MockInputMethodManager
;
53 manager
->SetComponentExtensionIMEManager(
54 scoped_ptr
<ComponentExtensionIMEManager
>(comp_ime_manager
).Pass());
55 InitializeForTesting(manager
);
58 class TestObserver
: public InputMethodEngineInterface::Observer
{
60 TestObserver() : calls_bitmap_(NONE
) {}
61 virtual ~TestObserver() {}
63 virtual void OnActivate(const std::string
& engine_id
) OVERRIDE
{
64 calls_bitmap_
|= ACTIVATE
;
66 virtual void OnDeactivated(const std::string
& engine_id
) OVERRIDE
{
67 calls_bitmap_
|= DEACTIVATED
;
70 const InputMethodEngineInterface::InputContext
& context
) OVERRIDE
{
71 calls_bitmap_
|= ONFOCUS
;
73 virtual void OnBlur(int context_id
) OVERRIDE
{
74 calls_bitmap_
|= ONBLUR
;
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
,
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
,
93 int anchor_pos
) OVERRIDE
{}
94 virtual void OnReset(const std::string
& engine_id
) OVERRIDE
{}
96 unsigned char GetCallsBitmapAndReset() {
97 unsigned char ret
= calls_bitmap_
;
103 unsigned char calls_bitmap_
;
105 DISALLOW_COPY_AND_ASSIGN(TestObserver
);
108 class InputMethodEngineTest
: public testing::Test
{
110 InputMethodEngineTest() : observer_(NULL
), input_view_("inputview.html") {
111 languages_
.push_back("en-US");
112 layouts_
.push_back("us");
114 IMEBridge::Initialize();
116 virtual ~InputMethodEngineTest() {
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(),
128 whitelisted
? kTestExtensionId
: kTestExtensionId2
,
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
);
143 scoped_ptr
<InputMethodEngine
> engine_
;
144 TestObserver
* observer_
;
145 std::vector
<std::string
> languages_
;
146 std::vector
<std::string
> layouts_
;
151 DISALLOW_COPY_AND_ASSIGN(InputMethodEngineTest
);
156 TEST_F(InputMethodEngineTest
, TestSwitching
) {
158 // Enable/disable with focus.
159 FocusIn(ui::TEXT_INPUT_TYPE_URL
);
160 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
162 EXPECT_EQ(ACTIVATE
| ONFOCUS
, observer_
->GetCallsBitmapAndReset());
164 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
165 // Enable/disable without focus.
167 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
169 EXPECT_EQ(ACTIVATE
| ONFOCUS
, observer_
->GetCallsBitmapAndReset());
171 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
172 // Focus change when enabled.
174 EXPECT_EQ(ACTIVATE
| ONFOCUS
, observer_
->GetCallsBitmapAndReset());
176 EXPECT_EQ(ONBLUR
, observer_
->GetCallsBitmapAndReset());
177 // Focus change when disabled.
179 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
180 FocusIn(ui::TEXT_INPUT_TYPE_TEXT
);
181 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
183 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
186 TEST_F(InputMethodEngineTest
, TestSwitching_Password_3rd_Party
) {
188 // Enable/disable with focus.
189 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD
);
190 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
192 EXPECT_EQ(ACTIVATE
, observer_
->GetCallsBitmapAndReset());
194 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
195 // Focus change when enabled.
197 EXPECT_EQ(ACTIVATE
, observer_
->GetCallsBitmapAndReset());
199 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
200 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD
);
201 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
203 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
206 TEST_F(InputMethodEngineTest
, TestSwitching_Password_Whitelisted
) {
208 // Enable/disable with focus.
209 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD
);
210 EXPECT_EQ(NONE
, observer_
->GetCallsBitmapAndReset());
212 EXPECT_EQ(ACTIVATE
| ONFOCUS
, observer_
->GetCallsBitmapAndReset());
214 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
215 // Focus change when enabled.
217 EXPECT_EQ(ACTIVATE
| ONFOCUS
, observer_
->GetCallsBitmapAndReset());
219 EXPECT_EQ(ONBLUR
, observer_
->GetCallsBitmapAndReset());
220 FocusIn(ui::TEXT_INPUT_TYPE_PASSWORD
);
221 EXPECT_EQ(ONFOCUS
, observer_
->GetCallsBitmapAndReset());
223 EXPECT_EQ(DEACTIVATED
, observer_
->GetCallsBitmapAndReset());
226 } // namespace input_method
227 } // namespace chromeos