1 // Copyright (c) 2012 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 "chrome/browser/chromeos/input_method/input_method_manager_impl.h"
9 #include "ash/ime/input_method_menu_item.h"
10 #include "ash/ime/input_method_menu_manager.h"
11 #include "base/basictypes.h"
12 #include "base/bind.h"
13 #include "base/bind_helpers.h"
14 #include "base/compiler_specific.h"
15 #include "base/logging.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/message_loop/message_loop.h"
18 #include "base/run_loop.h"
19 #include "chrome/browser/chromeos/input_method/input_method_engine_interface.h"
20 #include "chrome/browser/chromeos/input_method/mock_candidate_window_controller.h"
21 #include "chrome/browser/chromeos/input_method/mock_input_method_engine.h"
22 #include "chrome/test/base/browser_with_test_window_test.h"
23 #include "chrome/test/base/testing_browser_process.h"
24 #include "chrome/test/base/testing_profile.h"
25 #include "chrome/test/base/testing_profile_manager.h"
26 #include "chromeos/ime/extension_ime_util.h"
27 #include "chromeos/ime/fake_ime_keyboard.h"
28 #include "chromeos/ime/fake_input_method_delegate.h"
29 #include "chromeos/ime/mock_component_extension_ime_manager_delegate.h"
30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "ui/base/accelerators/accelerator.h"
32 #include "ui/base/ime/chromeos/mock_ime_engine_handler.h"
33 #include "ui/base/ime/input_method_initializer.h"
34 #include "ui/events/keycodes/keyboard_codes.h"
38 namespace input_method
{
41 const char kNaclMozcUsId
[] =
42 "_comp_ime_fpfbhcjppmaeaijcidgiibchfbnhbeljnacl_mozc_us";
43 const char kNaclMozcJpId
[] =
44 "_comp_ime_fpfbhcjppmaeaijcidgiibchfbnhbeljnacl_mozc_jp";
45 const char kExt2Engine1Id
[] =
46 "_comp_ime_gjaehgfemfahhmlgpdfknkhdnemmolopext2_engine1_engine_id";
47 const char kExt2Engine2Id
[] =
48 "_comp_ime_gjaehgfemfahhmlgpdfknkhdnemmolopext2_engine2_engine_id";
49 const char kPinyinImeId
[] =
50 "_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabzh-t-i0-pinyin";
51 const char kXkbExtId
[] =
52 #if defined(OFFICIAL_BUILD)
53 "jkghodnilhceideoidjikpgommlajknk";
55 "fgoepimhcoialccpbmpnnblemnepkkao";
58 // Returns true if |descriptors| contain |target|.
59 bool Contain(const InputMethodDescriptors
& descriptors
,
60 const InputMethodDescriptor
& target
) {
61 for (size_t i
= 0; i
< descriptors
.size(); ++i
) {
62 if (descriptors
[i
].id() == target
.id())
68 std::string
XkbId(const std::string
& id
) {
69 return extension_ime_util::GetInputMethodIDByKeyboardLayout(id
);
72 class InputMethodManagerImplTest
: public BrowserWithTestWindowTest
{
74 InputMethodManagerImplTest()
76 candidate_window_controller_(NULL
),
79 virtual ~InputMethodManagerImplTest() {}
81 virtual void SetUp() OVERRIDE
{
82 profile_manager_
.reset(new TestingProfileManager(GetBrowserProcess()));
83 ASSERT_TRUE(profile_manager_
->SetUp());
85 ui::InitializeInputMethodForTesting();
87 delegate_
= new FakeInputMethodDelegate();
88 manager_
.reset(new InputMethodManagerImpl(
89 scoped_ptr
<InputMethodDelegate
>(delegate_
)));
90 manager_
->GetInputMethodUtil()->UpdateHardwareLayoutCache();
91 candidate_window_controller_
= new MockCandidateWindowController
;
92 manager_
->SetCandidateWindowControllerForTesting(
93 candidate_window_controller_
);
94 keyboard_
= new FakeImeKeyboard
;
95 manager_
->SetImeKeyboardForTesting(keyboard_
);
96 mock_engine_handler_
.reset(
97 new MockInputMethodEngine(InputMethodDescriptor()));
98 IMEBridge::Initialize();
99 IMEBridge::Get()->SetCurrentEngineHandler(mock_engine_handler_
.get());
101 menu_manager_
= ash::ime::InputMethodMenuManager::GetInstance();
105 BrowserWithTestWindowTest::SetUp();
108 virtual void TearDown() OVERRIDE
{
109 BrowserWithTestWindowTest::TearDown();
111 ui::ShutdownInputMethodForTesting();
114 candidate_window_controller_
= NULL
;
118 profile_manager_
.reset();
122 // Helper function to initialize component extension stuff for testing.
123 void InitComponentExtension() {
124 mock_delegate_
= new MockComponentExtIMEManagerDelegate();
125 mock_delegate_
->set_ime_list(ime_list_
);
126 scoped_ptr
<ComponentExtensionIMEManagerDelegate
> delegate(mock_delegate_
);
128 // Note, for production, these SetEngineHandler are called when
129 // IMEEngineHandlerInterface is initialized via
130 // InitializeComponentextension.
131 manager_
->AddInputMethodExtension(kNaclMozcUsId
,
132 mock_engine_handler_
.get());
133 manager_
->AddInputMethodExtension(kNaclMozcJpId
,
134 mock_engine_handler_
.get());
135 manager_
->AddInputMethodExtension(kExt2Engine1Id
,
136 mock_engine_handler_
.get());
137 manager_
->AddInputMethodExtension(kExt2Engine2Id
,
138 mock_engine_handler_
.get());
139 manager_
->InitializeComponentExtensionForTesting(delegate
.Pass());
145 ComponentExtensionIME ext_xkb
;
146 ext_xkb
.id
= kXkbExtId
;
147 ext_xkb
.description
= "ext_xkb_description";
148 ext_xkb
.path
= base::FilePath("ext_xkb_file_path");
150 ComponentExtensionEngine ext_xkb_engine_us
;
151 ext_xkb_engine_us
.engine_id
= "xkb:us::eng";
152 ext_xkb_engine_us
.display_name
= "xkb:us::eng";
153 ext_xkb_engine_us
.language_codes
.push_back("en-US");
154 ext_xkb_engine_us
.layouts
.push_back("us");
155 ext_xkb
.engines
.push_back(ext_xkb_engine_us
);
157 ComponentExtensionEngine ext_xkb_engine_intl
;
158 ext_xkb_engine_intl
.engine_id
= "xkb:us:intl:eng";
159 ext_xkb_engine_intl
.display_name
= "xkb:us:intl:eng";
160 ext_xkb_engine_intl
.language_codes
.push_back("en-US");
161 ext_xkb_engine_intl
.layouts
.push_back("us(intl)");
162 ext_xkb
.engines
.push_back(ext_xkb_engine_intl
);
164 ComponentExtensionEngine ext_xkb_engine_altgr_intl
;
165 ext_xkb_engine_altgr_intl
.engine_id
= "xkb:us:altgr-intl:eng";
166 ext_xkb_engine_altgr_intl
.display_name
= "xkb:us:altgr-intl:eng";
167 ext_xkb_engine_altgr_intl
.language_codes
.push_back("en-US");
168 ext_xkb_engine_altgr_intl
.layouts
.push_back("us(altgr-intl)");
169 ext_xkb
.engines
.push_back(ext_xkb_engine_altgr_intl
);
171 ComponentExtensionEngine ext_xkb_engine_dvorak
;
172 ext_xkb_engine_dvorak
.engine_id
= "xkb:us:dvorak:eng";
173 ext_xkb_engine_dvorak
.display_name
= "xkb:us:dvorak:eng";
174 ext_xkb_engine_dvorak
.language_codes
.push_back("en-US");
175 ext_xkb_engine_dvorak
.layouts
.push_back("us(dvorak)");
176 ext_xkb
.engines
.push_back(ext_xkb_engine_dvorak
);
178 ComponentExtensionEngine ext_xkb_engine_colemak
;
179 ext_xkb_engine_colemak
.engine_id
= "xkb:us:colemak:eng";
180 ext_xkb_engine_colemak
.display_name
= "xkb:us:colemak:eng";
181 ext_xkb_engine_colemak
.language_codes
.push_back("en-US");
182 ext_xkb_engine_colemak
.layouts
.push_back("us(colemak)");
183 ext_xkb
.engines
.push_back(ext_xkb_engine_colemak
);
185 ComponentExtensionEngine ext_xkb_engine_fr
;
186 ext_xkb_engine_fr
.engine_id
= "xkb:fr::fra";
187 ext_xkb_engine_fr
.display_name
= "xkb:fr::fra";
188 ext_xkb_engine_fr
.language_codes
.push_back("fr");
189 ext_xkb_engine_fr
.layouts
.push_back("fr");
190 ext_xkb
.engines
.push_back(ext_xkb_engine_fr
);
192 ComponentExtensionEngine ext_xkb_engine_se
;
193 ext_xkb_engine_se
.engine_id
= "xkb:se::swe";
194 ext_xkb_engine_se
.display_name
= "xkb:se::swe";
195 ext_xkb_engine_se
.language_codes
.push_back("sv");
196 ext_xkb_engine_se
.layouts
.push_back("se");
197 ext_xkb
.engines
.push_back(ext_xkb_engine_se
);
199 ComponentExtensionEngine ext_xkb_engine_jp
;
200 ext_xkb_engine_jp
.engine_id
= "xkb:jp::jpn";
201 ext_xkb_engine_jp
.display_name
= "xkb:jp::jpn";
202 ext_xkb_engine_jp
.language_codes
.push_back("ja");
203 ext_xkb_engine_jp
.layouts
.push_back("jp");
204 ext_xkb
.engines
.push_back(ext_xkb_engine_jp
);
206 ComponentExtensionEngine ext_xkb_engine_ru
;
207 ext_xkb_engine_ru
.engine_id
= "xkb:ru::rus";
208 ext_xkb_engine_ru
.display_name
= "xkb:ru::rus";
209 ext_xkb_engine_ru
.language_codes
.push_back("ru");
210 ext_xkb_engine_ru
.layouts
.push_back("ru");
211 ext_xkb
.engines
.push_back(ext_xkb_engine_ru
);
213 ComponentExtensionEngine ext_xkb_engine_hu
;
214 ext_xkb_engine_hu
.engine_id
= "xkb:hu::hun";
215 ext_xkb_engine_hu
.display_name
= "xkb:hu::hun";
216 ext_xkb_engine_hu
.language_codes
.push_back("hu");
217 ext_xkb_engine_hu
.layouts
.push_back("hu");
218 ext_xkb
.engines
.push_back(ext_xkb_engine_hu
);
220 ime_list_
.push_back(ext_xkb
);
222 ComponentExtensionIME ext1
;
223 ext1
.id
= "fpfbhcjppmaeaijcidgiibchfbnhbelj";
224 ext1
.description
= "ext1_description";
225 ext1
.path
= base::FilePath("ext1_file_path");
227 ComponentExtensionEngine ext1_engine1
;
228 ext1_engine1
.engine_id
= "nacl_mozc_us";
229 ext1_engine1
.display_name
= "ext1_engine_1_display_name";
230 ext1_engine1
.language_codes
.push_back("ja");
231 ext1_engine1
.layouts
.push_back("us");
232 ext1
.engines
.push_back(ext1_engine1
);
234 ComponentExtensionEngine ext1_engine2
;
235 ext1_engine2
.engine_id
= "nacl_mozc_jp";
236 ext1_engine2
.display_name
= "ext1_engine_1_display_name";
237 ext1_engine2
.language_codes
.push_back("ja");
238 ext1_engine2
.layouts
.push_back("jp");
239 ext1
.engines
.push_back(ext1_engine2
);
241 ime_list_
.push_back(ext1
);
243 ComponentExtensionIME ext2
;
244 ext2
.id
= "gjaehgfemfahhmlgpdfknkhdnemmolop";
245 ext2
.description
= "ext2_description";
246 ext2
.path
= base::FilePath("ext2_file_path");
248 ComponentExtensionEngine ext2_engine1
;
249 ext2_engine1
.engine_id
= "ext2_engine1_engine_id";
250 ext2_engine1
.display_name
= "ext2_engine_1_display_name";
251 ext2_engine1
.language_codes
.push_back("en");
252 ext2_engine1
.layouts
.push_back("us");
253 ext2
.engines
.push_back(ext2_engine1
);
255 ComponentExtensionEngine ext2_engine2
;
256 ext2_engine2
.engine_id
= "ext2_engine2_engine_id";
257 ext2_engine2
.display_name
= "ext2_engine_2_display_name";
258 ext2_engine2
.language_codes
.push_back("en");
259 ext2_engine2
.layouts
.push_back("us(dvorak)");
260 ext2
.engines
.push_back(ext2_engine2
);
262 ime_list_
.push_back(ext2
);
265 TestingBrowserProcess
* GetBrowserProcess() {
266 return TestingBrowserProcess::GetGlobal();
269 scoped_ptr
<TestingProfileManager
> profile_manager_
;
270 scoped_ptr
<InputMethodManagerImpl
> manager_
;
271 FakeInputMethodDelegate
* delegate_
;
272 MockCandidateWindowController
* candidate_window_controller_
;
273 scoped_ptr
<MockInputMethodEngine
> mock_engine_handler_
;
274 FakeImeKeyboard
* keyboard_
;
275 MockComponentExtIMEManagerDelegate
* mock_delegate_
;
276 std::vector
<ComponentExtensionIME
> ime_list_
;
277 ash::ime::InputMethodMenuManager
* menu_manager_
;
280 DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImplTest
);
283 class TestObserver
: public InputMethodManager::Observer
,
284 public ash::ime::InputMethodMenuManager::Observer
{
287 : input_method_changed_count_(0),
288 input_method_menu_item_changed_count_(0),
289 last_show_message_(false) {
291 virtual ~TestObserver() {}
293 virtual void InputMethodChanged(InputMethodManager
* manager
,
294 bool show_message
) OVERRIDE
{
295 ++input_method_changed_count_
;
296 last_show_message_
= show_message
;
298 virtual void InputMethodMenuItemChanged(
299 ash::ime::InputMethodMenuManager
* manager
) OVERRIDE
{
300 ++input_method_menu_item_changed_count_
;
303 int input_method_changed_count_
;
304 int input_method_menu_item_changed_count_
;
305 bool last_show_message_
;
308 DISALLOW_COPY_AND_ASSIGN(TestObserver
);
311 class TestCandidateWindowObserver
312 : public InputMethodManager::CandidateWindowObserver
{
314 TestCandidateWindowObserver()
315 : candidate_window_opened_count_(0),
316 candidate_window_closed_count_(0) {
318 virtual ~TestCandidateWindowObserver() {}
320 virtual void CandidateWindowOpened(InputMethodManager
* manager
) OVERRIDE
{
321 ++candidate_window_opened_count_
;
323 virtual void CandidateWindowClosed(InputMethodManager
* manager
) OVERRIDE
{
324 ++candidate_window_closed_count_
;
327 int candidate_window_opened_count_
;
328 int candidate_window_closed_count_
;
331 DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver
);
335 TEST_F(InputMethodManagerImplTest
, TestGetImeKeyboard
) {
336 EXPECT_TRUE(manager_
->GetImeKeyboard());
337 EXPECT_EQ(keyboard_
, manager_
->GetImeKeyboard());
340 TEST_F(InputMethodManagerImplTest
, TestCandidateWindowObserver
) {
341 TestCandidateWindowObserver observer
;
342 candidate_window_controller_
->NotifyCandidateWindowOpened(); // nop
343 candidate_window_controller_
->NotifyCandidateWindowClosed(); // nop
344 manager_
->AddCandidateWindowObserver(&observer
);
345 candidate_window_controller_
->NotifyCandidateWindowOpened();
346 EXPECT_EQ(1, observer
.candidate_window_opened_count_
);
347 candidate_window_controller_
->NotifyCandidateWindowClosed();
348 EXPECT_EQ(1, observer
.candidate_window_closed_count_
);
349 candidate_window_controller_
->NotifyCandidateWindowOpened();
350 EXPECT_EQ(2, observer
.candidate_window_opened_count_
);
351 candidate_window_controller_
->NotifyCandidateWindowClosed();
352 EXPECT_EQ(2, observer
.candidate_window_closed_count_
);
353 manager_
->RemoveCandidateWindowObserver(&observer
);
356 TEST_F(InputMethodManagerImplTest
, TestObserver
) {
357 // For http://crbug.com/19655#c11 - (3). browser_state_monitor_unittest.cc is
358 // also for the scenario.
359 std::vector
<std::string
> keyboard_layouts
;
360 keyboard_layouts
.push_back("xkb:us::eng");
362 TestObserver observer
;
363 InitComponentExtension();
364 manager_
->AddObserver(&observer
);
365 menu_manager_
->AddObserver(&observer
);
366 EXPECT_EQ(0, observer
.input_method_changed_count_
);
367 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
368 EXPECT_EQ(5U, manager_
->GetActiveInputMethods()->size());
369 EXPECT_EQ(1, observer
.input_method_changed_count_
);
370 EXPECT_EQ(1, observer
.input_method_menu_item_changed_count_
);
371 manager_
->ChangeInputMethod(XkbId("xkb:us:dvorak:eng"));
372 EXPECT_FALSE(observer
.last_show_message_
);
373 EXPECT_EQ(2, observer
.input_method_changed_count_
);
374 EXPECT_EQ(2, observer
.input_method_menu_item_changed_count_
);
375 manager_
->ChangeInputMethod(XkbId("xkb:us:dvorak:eng"));
376 EXPECT_FALSE(observer
.last_show_message_
);
378 // The observer is always notified even when the same input method ID is
379 // passed to ChangeInputMethod() more than twice.
380 // TODO(komatsu): Revisit if this is neccessary.
381 EXPECT_EQ(3, observer
.input_method_changed_count_
);
383 // If the same input method ID is passed, PropertyChanged() is not
385 EXPECT_EQ(2, observer
.input_method_menu_item_changed_count_
);
387 manager_
->RemoveObserver(&observer
);
388 menu_manager_
->RemoveObserver(&observer
);
391 TEST_F(InputMethodManagerImplTest
, TestGetSupportedInputMethods
) {
392 InitComponentExtension();
393 InputMethodDescriptors methods
;
394 if (extension_ime_util::UseWrappedExtensionKeyboardLayouts()) {
395 methods
= manager_
->GetComponentExtensionIMEManager()
396 ->GetXkbIMEAsInputMethodDescriptor();
398 methods
= *(manager_
->GetSupportedInputMethods());
400 // Try to find random 4-5 layuts and IMEs to make sure the returned list is
402 const InputMethodDescriptor
* id_to_find
=
403 manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
405 id_to_find
= manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
406 XkbId("xkb:us::eng"));
407 EXPECT_TRUE(Contain(methods
, *id_to_find
));
408 id_to_find
= manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
409 XkbId("xkb:us:dvorak:eng"));
410 EXPECT_TRUE(Contain(methods
, *id_to_find
));
411 id_to_find
= manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
412 XkbId("xkb:fr::fra"));
413 EXPECT_TRUE(Contain(methods
, *id_to_find
));
416 TEST_F(InputMethodManagerImplTest
, TestEnableLayouts
) {
417 // Currently 5 keyboard layouts are supported for en-US, and 1 for ja. See
418 // ibus_input_method.txt.
419 std::vector
<std::string
> keyboard_layouts
;
421 InitComponentExtension();
422 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
423 EXPECT_EQ(5U, manager_
->GetNumActiveInputMethods());
425 // For http://crbug.com/19655#c11 - (5)
426 // The hardware keyboard layout "xkb:us::eng" is always active, hence 2U.
427 manager_
->EnableLoginLayouts("ja", keyboard_layouts
); // Japanese
428 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
431 TEST_F(InputMethodManagerImplTest
, TestEnableLayoutsAndCurrentInputMethod
) {
432 // For http://crbug.com/329061
433 std::vector
<std::string
> keyboard_layouts
;
434 keyboard_layouts
.push_back(XkbId("xkb:se::swe"));
436 InitComponentExtension();
437 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
438 const std::string im_id
= manager_
->GetCurrentInputMethod().id();
439 EXPECT_EQ(XkbId("xkb:se::swe"), im_id
);
442 TEST_F(InputMethodManagerImplTest
, TestEnableLayoutsNonUsHardwareKeyboard
) {
443 InitComponentExtension();
444 // The physical layout is French.
445 manager_
->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
447 manager_
->EnableLoginLayouts(
449 manager_
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
450 EXPECT_EQ(6U, manager_
->GetNumActiveInputMethods()); // 5 + French
451 // The physical layout is Japanese.
452 manager_
->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
454 manager_
->EnableLoginLayouts(
456 manager_
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
457 // "xkb:us::eng" is not needed, hence 1.
458 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
460 // The physical layout is Russian.
461 manager_
->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
463 manager_
->EnableLoginLayouts(
465 manager_
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
466 // "xkb:us::eng" only.
467 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
468 EXPECT_EQ(XkbId("xkb:us::eng"),
469 manager_
->GetActiveInputMethodIds().front());
472 TEST_F(InputMethodManagerImplTest
, TestEnableMultipleHardwareKeyboardLayout
) {
473 InitComponentExtension();
474 // The physical layouts are French and Hungarian.
475 manager_
->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
476 "xkb:fr::fra,xkb:hu::hun");
477 manager_
->EnableLoginLayouts(
479 manager_
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
480 // 5 + French + Hungarian
481 EXPECT_EQ(7U, manager_
->GetNumActiveInputMethods());
484 TEST_F(InputMethodManagerImplTest
,
485 TestEnableMultipleHardwareKeyboardLayout_NoLoginKeyboard
) {
486 InitComponentExtension();
487 // The physical layouts are English (US) and Russian.
488 manager_
->GetInputMethodUtil()->SetHardwareKeyboardLayoutForTesting(
489 "xkb:us::eng,xkb:ru::rus");
490 manager_
->EnableLoginLayouts(
492 manager_
->GetInputMethodUtil()->GetHardwareLoginInputMethodIds());
494 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
497 TEST_F(InputMethodManagerImplTest
, TestActiveInputMethods
) {
498 InitComponentExtension();
499 std::vector
<std::string
> keyboard_layouts
;
500 manager_
->EnableLoginLayouts("ja", keyboard_layouts
); // Japanese
501 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
502 scoped_ptr
<InputMethodDescriptors
> methods(
503 manager_
->GetActiveInputMethods());
504 ASSERT_TRUE(methods
.get());
505 EXPECT_EQ(2U, methods
->size());
506 const InputMethodDescriptor
* id_to_find
=
507 manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
508 XkbId("xkb:us::eng"));
509 EXPECT_TRUE(id_to_find
&& Contain(*methods
.get(), *id_to_find
));
510 id_to_find
= manager_
->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
511 XkbId("xkb:jp::jpn"));
512 EXPECT_TRUE(id_to_find
&& Contain(*methods
.get(), *id_to_find
));
515 TEST_F(InputMethodManagerImplTest
, TestEnableTwoLayouts
) {
516 // For http://crbug.com/19655#c11 - (8), step 6.
517 TestObserver observer
;
518 manager_
->AddObserver(&observer
);
519 InitComponentExtension();
520 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
521 std::vector
<std::string
> ids
;
522 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
523 ids
.push_back(XkbId("xkb:us:colemak:eng"));
524 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
525 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
526 // Since all the IDs added avobe are keyboard layouts, Start() should not be
528 EXPECT_EQ(1, observer
.input_method_changed_count_
);
529 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
530 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
532 ids
.erase(ids
.begin());
533 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
534 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
535 EXPECT_EQ(2, observer
.input_method_changed_count_
);
536 EXPECT_EQ(XkbId(ids
[0]), // colemak
537 manager_
->GetCurrentInputMethod().id());
538 EXPECT_EQ("us(colemak)", keyboard_
->last_layout_
);
539 manager_
->RemoveObserver(&observer
);
542 TEST_F(InputMethodManagerImplTest
, TestEnableThreeLayouts
) {
543 // For http://crbug.com/19655#c11 - (9).
544 TestObserver observer
;
545 manager_
->AddObserver(&observer
);
546 InitComponentExtension();
547 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
548 std::vector
<std::string
> ids
;
549 ids
.push_back(XkbId("xkb:us::eng"));
550 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
551 ids
.push_back(XkbId("xkb:us:colemak:eng"));
552 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
553 EXPECT_EQ(3U, manager_
->GetNumActiveInputMethods());
554 EXPECT_EQ(1, observer
.input_method_changed_count_
);
555 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
556 EXPECT_EQ("us", keyboard_
->last_layout_
);
558 manager_
->SwitchToNextInputMethod();
559 EXPECT_EQ(2, observer
.input_method_changed_count_
);
560 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
561 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
563 ids
.erase(ids
.begin() + 1);
564 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
565 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
566 EXPECT_EQ(3, observer
.input_method_changed_count_
);
567 EXPECT_EQ(XkbId(ids
[0]), // US Qwerty
568 manager_
->GetCurrentInputMethod().id());
569 EXPECT_EQ("us", keyboard_
->last_layout_
);
570 manager_
->RemoveObserver(&observer
);
573 TEST_F(InputMethodManagerImplTest
, TestEnableLayoutAndIme
) {
574 // For http://crbug.com/19655#c11 - (10).
575 TestObserver observer
;
576 manager_
->AddObserver(&observer
);
577 InitComponentExtension();
578 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
579 std::vector
<std::string
> ids
;
580 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
581 ids
.push_back(kNaclMozcUsId
);
582 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
583 EXPECT_EQ(1, observer
.input_method_changed_count_
);
584 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
585 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
587 manager_
->SwitchToNextInputMethod();
588 EXPECT_EQ(2, observer
.input_method_changed_count_
);
589 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
590 EXPECT_EQ("us", keyboard_
->last_layout_
);
592 ids
.erase(ids
.begin() + 1);
593 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
594 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
595 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
596 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
599 TEST_F(InputMethodManagerImplTest
, TestEnableLayoutAndIme2
) {
600 // For http://crbug.com/19655#c11 - (11).
601 TestObserver observer
;
602 manager_
->AddObserver(&observer
);
603 InitComponentExtension();
604 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
605 std::vector
<std::string
> ids
;
606 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
607 ids
.push_back(kNaclMozcUsId
);
608 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
609 EXPECT_EQ(1, observer
.input_method_changed_count_
);
610 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
611 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
614 ids
.erase(ids
.begin());
615 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
616 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
617 EXPECT_EQ(XkbId(ids
[0]), // Mozc
618 manager_
->GetCurrentInputMethod().id());
619 EXPECT_EQ("us", keyboard_
->last_layout_
);
620 manager_
->RemoveObserver(&observer
);
623 TEST_F(InputMethodManagerImplTest
, TestEnableImes
) {
624 TestObserver observer
;
625 manager_
->AddObserver(&observer
);
626 InitComponentExtension();
627 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
628 std::vector
<std::string
> ids
;
629 ids
.push_back(kExt2Engine1Id
);
630 ids
.push_back("mozc-dv");
631 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
632 EXPECT_EQ(1, observer
.input_method_changed_count_
);
633 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
634 EXPECT_EQ("us", keyboard_
->last_layout_
);
635 manager_
->RemoveObserver(&observer
);
638 TEST_F(InputMethodManagerImplTest
, TestEnableUnknownIds
) {
639 TestObserver observer
;
640 manager_
->AddObserver(&observer
);
641 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
642 std::vector
<std::string
> ids
;
643 ids
.push_back("xkb:tl::tlh"); // Klingon, which is not supported.
644 ids
.push_back("unknown-super-cool-ime");
645 EXPECT_FALSE(manager_
->ReplaceEnabledInputMethods(ids
));
647 // TODO(yusukes): Should we fall back to the hardware keyboard layout in this
649 EXPECT_EQ(0, observer
.input_method_changed_count_
);
651 manager_
->RemoveObserver(&observer
);
654 TEST_F(InputMethodManagerImplTest
, TestEnableLayoutsThenLock
) {
655 // For http://crbug.com/19655#c11 - (14).
656 TestObserver observer
;
657 manager_
->AddObserver(&observer
);
658 InitComponentExtension();
659 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
660 std::vector
<std::string
> ids
;
661 ids
.push_back(XkbId("xkb:us::eng"));
662 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
663 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
664 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
665 EXPECT_EQ(1, observer
.input_method_changed_count_
);
666 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
667 EXPECT_EQ("us", keyboard_
->last_layout_
);
670 manager_
->SwitchToNextInputMethod();
671 EXPECT_EQ(2, observer
.input_method_changed_count_
);
672 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
673 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
676 manager_
->SetState(InputMethodManager::STATE_LOCK_SCREEN
);
677 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
678 EXPECT_EQ(XkbId(ids
[1]), // still Dvorak
679 manager_
->GetCurrentInputMethod().id());
680 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
681 // Switch back to Qwerty.
682 manager_
->SwitchToNextInputMethod();
683 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
684 EXPECT_EQ("us", keyboard_
->last_layout_
);
686 // Unlock screen. The original state, Dvorak, is restored.
687 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
688 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
689 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
690 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
692 manager_
->RemoveObserver(&observer
);
695 TEST_F(InputMethodManagerImplTest
, SwitchInputMethodTest
) {
696 // For http://crbug.com/19655#c11 - (15).
697 TestObserver observer
;
698 manager_
->AddObserver(&observer
);
699 InitComponentExtension();
700 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
701 std::vector
<std::string
> ids
;
702 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
703 ids
.push_back(kExt2Engine2Id
);
704 ids
.push_back(kExt2Engine1Id
);
705 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
706 EXPECT_EQ(3U, manager_
->GetNumActiveInputMethods());
707 EXPECT_EQ(1, observer
.input_method_changed_count_
);
708 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
709 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
712 manager_
->SwitchToNextInputMethod();
713 EXPECT_EQ(2, observer
.input_method_changed_count_
);
714 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
715 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
718 manager_
->SetState(InputMethodManager::STATE_LOCK_SCREEN
);
719 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods()); // Qwerty+Dvorak.
720 EXPECT_EQ(XkbId("xkb:us:dvorak:eng"),
721 manager_
->GetCurrentInputMethod().id());
722 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
723 manager_
->SwitchToNextInputMethod();
724 EXPECT_EQ(XkbId("xkb:us::eng"), // The hardware keyboard layout.
725 manager_
->GetCurrentInputMethod().id());
726 EXPECT_EQ("us", keyboard_
->last_layout_
);
728 // Unlock screen. The original state, pinyin-dv, is restored.
729 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
730 EXPECT_EQ(3U, manager_
->GetNumActiveInputMethods()); // Dvorak and 2 IMEs.
731 EXPECT_EQ(XkbId(ids
[1]), manager_
->GetCurrentInputMethod().id());
732 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
734 manager_
->RemoveObserver(&observer
);
737 TEST_F(InputMethodManagerImplTest
, TestXkbSetting
) {
738 // For http://crbug.com/19655#c11 - (8), step 7-11.
739 InitComponentExtension();
740 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
741 std::vector
<std::string
> ids
;
742 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
743 ids
.push_back(XkbId("xkb:us:colemak:eng"));
744 ids
.push_back(kNaclMozcJpId
);
745 ids
.push_back(kNaclMozcUsId
);
746 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
747 EXPECT_EQ(4U, manager_
->GetNumActiveInputMethods());
748 EXPECT_EQ(1, keyboard_
->set_current_keyboard_layout_by_name_count_
);
749 // See input_methods.txt for an expected XKB layout name.
750 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
751 manager_
->SwitchToNextInputMethod();
752 EXPECT_EQ(2, keyboard_
->set_current_keyboard_layout_by_name_count_
);
753 EXPECT_EQ("us(colemak)", keyboard_
->last_layout_
);
754 manager_
->SwitchToNextInputMethod();
755 EXPECT_EQ(3, keyboard_
->set_current_keyboard_layout_by_name_count_
);
756 EXPECT_EQ("jp", keyboard_
->last_layout_
);
757 manager_
->SwitchToNextInputMethod();
758 EXPECT_EQ(4, keyboard_
->set_current_keyboard_layout_by_name_count_
);
759 EXPECT_EQ("us", keyboard_
->last_layout_
);
760 manager_
->SwitchToNextInputMethod();
761 EXPECT_EQ(5, keyboard_
->set_current_keyboard_layout_by_name_count_
);
762 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
764 ids
.erase(ids
.begin());
765 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
766 EXPECT_EQ(3U, manager_
->GetNumActiveInputMethods());
767 EXPECT_EQ(6, keyboard_
->set_current_keyboard_layout_by_name_count_
);
768 EXPECT_EQ("us(colemak)", keyboard_
->last_layout_
);
771 TEST_F(InputMethodManagerImplTest
, TestActivateInputMethodMenuItem
) {
772 const std::string kKey
= "key";
773 ash::ime::InputMethodMenuItemList menu_list
;
774 menu_list
.push_back(ash::ime::InputMethodMenuItem(
775 kKey
, "label", false, false));
776 menu_manager_
->SetCurrentInputMethodMenuItemList(menu_list
);
778 manager_
->ActivateInputMethodMenuItem(kKey
);
779 EXPECT_EQ(kKey
, mock_engine_handler_
->last_activated_property());
781 // Key2 is not registered, so activated property should not be changed.
782 manager_
->ActivateInputMethodMenuItem("key2");
783 EXPECT_EQ(kKey
, mock_engine_handler_
->last_activated_property());
786 TEST_F(InputMethodManagerImplTest
, TestGetCurrentInputMethodProperties
) {
787 InitComponentExtension();
788 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
790 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
791 std::vector
<std::string
> ids
;
792 ids
.push_back(XkbId("xkb:us::eng"));
793 ids
.push_back(kNaclMozcUsId
);
794 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
795 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
796 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
797 manager_
->ChangeInputMethod(kNaclMozcUsId
);
799 ash::ime::InputMethodMenuItemList current_property_list
;
800 current_property_list
.push_back(ash::ime::InputMethodMenuItem(
801 "key", "label", false, false));
802 menu_manager_
->SetCurrentInputMethodMenuItemList(current_property_list
);
804 ASSERT_EQ(1U, menu_manager_
->GetCurrentInputMethodMenuItemList().size());
806 menu_manager_
->GetCurrentInputMethodMenuItemList().at(0).key
);
808 manager_
->ChangeInputMethod("xkb:us::eng");
809 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
812 TEST_F(InputMethodManagerImplTest
, TestGetCurrentInputMethodPropertiesTwoImes
) {
813 InitComponentExtension();
814 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
816 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
817 std::vector
<std::string
> ids
;
818 ids
.push_back(kNaclMozcUsId
); // Japanese
819 ids
.push_back(kExt2Engine1Id
); // T-Chinese
820 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
821 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
822 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
824 ash::ime::InputMethodMenuItemList current_property_list
;
825 current_property_list
.push_back(ash::ime::InputMethodMenuItem("key-mozc",
829 menu_manager_
->SetCurrentInputMethodMenuItemList(current_property_list
);
831 ASSERT_EQ(1U, menu_manager_
->GetCurrentInputMethodMenuItemList().size());
832 EXPECT_EQ("key-mozc",
833 menu_manager_
->GetCurrentInputMethodMenuItemList().at(0).key
);
835 manager_
->ChangeInputMethod(kExt2Engine1Id
);
836 // Since the IME is changed, the property for mozc Japanese should be hidden.
837 EXPECT_TRUE(menu_manager_
->GetCurrentInputMethodMenuItemList().empty());
839 // Asynchronous property update signal from mozc-chewing.
840 current_property_list
.clear();
841 current_property_list
.push_back(ash::ime::InputMethodMenuItem(
842 "key-chewing", "label", false, false));
843 menu_manager_
->SetCurrentInputMethodMenuItemList(current_property_list
);
844 ASSERT_EQ(1U, menu_manager_
->GetCurrentInputMethodMenuItemList().size());
845 EXPECT_EQ("key-chewing",
846 menu_manager_
->GetCurrentInputMethodMenuItemList().at(0).key
);
849 TEST_F(InputMethodManagerImplTest
, TestNextInputMethod
) {
850 TestObserver observer
;
851 manager_
->AddObserver(&observer
);
852 InitComponentExtension();
853 std::vector
<std::string
> keyboard_layouts
;
854 keyboard_layouts
.push_back(XkbId("xkb:us::eng"));
855 // For http://crbug.com/19655#c11 - (1)
856 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
857 EXPECT_EQ(5U, manager_
->GetNumActiveInputMethods());
858 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
859 EXPECT_EQ("us", keyboard_
->last_layout_
);
860 manager_
->SwitchToNextInputMethod();
861 EXPECT_TRUE(observer
.last_show_message_
);
862 EXPECT_EQ(XkbId("xkb:us:intl:eng"), manager_
->GetCurrentInputMethod().id());
863 EXPECT_EQ("us(intl)", keyboard_
->last_layout_
);
864 manager_
->SwitchToNextInputMethod();
865 EXPECT_TRUE(observer
.last_show_message_
);
866 EXPECT_EQ(XkbId("xkb:us:altgr-intl:eng"),
867 manager_
->GetCurrentInputMethod().id());
868 EXPECT_EQ("us(altgr-intl)", keyboard_
->last_layout_
);
869 manager_
->SwitchToNextInputMethod();
870 EXPECT_TRUE(observer
.last_show_message_
);
871 EXPECT_EQ(XkbId("xkb:us:dvorak:eng"),
872 manager_
->GetCurrentInputMethod().id());
873 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
874 manager_
->SwitchToNextInputMethod();
875 EXPECT_TRUE(observer
.last_show_message_
);
876 EXPECT_EQ(XkbId("xkb:us:colemak:eng"),
877 manager_
->GetCurrentInputMethod().id());
878 EXPECT_EQ("us(colemak)", keyboard_
->last_layout_
);
879 manager_
->SwitchToNextInputMethod();
880 EXPECT_TRUE(observer
.last_show_message_
);
881 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
882 EXPECT_EQ("us", keyboard_
->last_layout_
);
884 manager_
->RemoveObserver(&observer
);
887 TEST_F(InputMethodManagerImplTest
, TestPreviousInputMethod
) {
888 TestObserver observer
;
889 manager_
->AddObserver(&observer
);
890 InitComponentExtension();
892 ui::Accelerator
keydown_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
893 keydown_accelerator
.set_type(ui::ET_KEY_PRESSED
);
894 ui::Accelerator
keyup_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
895 keyup_accelerator
.set_type(ui::ET_KEY_RELEASED
);
897 std::vector
<std::string
> keyboard_layouts
;
898 keyboard_layouts
.push_back(XkbId("xkb:us::eng"));
899 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
900 EXPECT_EQ(5U, manager_
->GetNumActiveInputMethods());
901 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
902 EXPECT_EQ("us", keyboard_
->last_layout_
);
903 EXPECT_TRUE(manager_
->SwitchToNextInputMethod());
904 EXPECT_TRUE(observer
.last_show_message_
);
905 EXPECT_EQ(XkbId("xkb:us:intl:eng"),
906 manager_
->GetCurrentInputMethod().id());
907 EXPECT_EQ("us(intl)", keyboard_
->last_layout_
);
908 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
909 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
910 EXPECT_TRUE(observer
.last_show_message_
);
911 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
912 EXPECT_EQ("us", keyboard_
->last_layout_
);
913 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
914 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
915 EXPECT_TRUE(observer
.last_show_message_
);
916 EXPECT_EQ(XkbId("xkb:us:intl:eng"), manager_
->GetCurrentInputMethod().id());
917 EXPECT_EQ("us(intl)", keyboard_
->last_layout_
);
918 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
919 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
920 EXPECT_TRUE(observer
.last_show_message_
);
921 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
922 EXPECT_EQ("us", keyboard_
->last_layout_
);
923 EXPECT_TRUE(manager_
->SwitchToNextInputMethod());
924 EXPECT_TRUE(observer
.last_show_message_
);
925 EXPECT_EQ(XkbId("xkb:us:intl:eng"), manager_
->GetCurrentInputMethod().id());
926 EXPECT_EQ("us(intl)", keyboard_
->last_layout_
);
927 EXPECT_TRUE(manager_
->SwitchToNextInputMethod());
928 EXPECT_TRUE(observer
.last_show_message_
);
929 EXPECT_EQ(XkbId("xkb:us:altgr-intl:eng"),
930 manager_
->GetCurrentInputMethod().id());
931 EXPECT_EQ("us(altgr-intl)", keyboard_
->last_layout_
);
932 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
933 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
934 EXPECT_TRUE(observer
.last_show_message_
);
935 EXPECT_EQ(XkbId("xkb:us:intl:eng"), manager_
->GetCurrentInputMethod().id());
936 EXPECT_EQ("us(intl)", keyboard_
->last_layout_
);
937 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
938 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
939 EXPECT_TRUE(observer
.last_show_message_
);
940 EXPECT_EQ(XkbId("xkb:us:altgr-intl:eng"),
941 manager_
->GetCurrentInputMethod().id());
942 EXPECT_EQ("us(altgr-intl)", keyboard_
->last_layout_
);
944 manager_
->RemoveObserver(&observer
);
947 TEST_F(InputMethodManagerImplTest
,
948 TestSwitchToPreviousInputMethodForOneActiveInputMethod
) {
949 TestObserver observer
;
950 manager_
->AddObserver(&observer
);
951 InitComponentExtension();
953 ui::Accelerator
keydown_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
954 keydown_accelerator
.set_type(ui::ET_KEY_PRESSED
);
955 ui::Accelerator
keyup_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
956 keyup_accelerator
.set_type(ui::ET_KEY_RELEASED
);
958 std::vector
<std::string
> ids
;
959 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
960 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
961 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
963 // Ctrl+Space accelerator should not be consumed if there is only one active
965 EXPECT_FALSE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
966 EXPECT_FALSE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
968 manager_
->RemoveObserver(&observer
);
971 TEST_F(InputMethodManagerImplTest
, TestSwitchInputMethodWithUsLayouts
) {
972 std::string expect_id
= XkbId("xkb:us::eng");
973 TestObserver observer
;
974 manager_
->AddObserver(&observer
);
975 InitComponentExtension();
976 std::vector
<std::string
> keyboard_layouts
;
977 keyboard_layouts
.push_back(XkbId("xkb:us::eng"));
978 manager_
->EnableLoginLayouts("en-US", keyboard_layouts
);
979 EXPECT_EQ(5U, manager_
->GetNumActiveInputMethods());
980 EXPECT_EQ(expect_id
, manager_
->GetCurrentInputMethod().id());
981 EXPECT_EQ("us", keyboard_
->last_layout_
);
983 // Henkan, Muhenkan, ZenkakuHankaku should be ignored when no Japanese IMEs
984 // and keyboards are enabled.
985 EXPECT_FALSE(manager_
->SwitchInputMethod(
986 ui::Accelerator(ui::VKEY_CONVERT
, ui::EF_NONE
)));
987 EXPECT_FALSE(observer
.last_show_message_
);
988 EXPECT_EQ(expect_id
, manager_
->GetCurrentInputMethod().id());
989 EXPECT_EQ("us", keyboard_
->last_layout_
);
990 EXPECT_FALSE(manager_
->SwitchInputMethod(
991 ui::Accelerator(ui::VKEY_NONCONVERT
, ui::EF_NONE
)));
992 EXPECT_EQ(expect_id
, manager_
->GetCurrentInputMethod().id());
993 EXPECT_EQ("us", keyboard_
->last_layout_
);
994 EXPECT_FALSE(manager_
->SwitchInputMethod(
995 ui::Accelerator(ui::VKEY_DBE_SBCSCHAR
, ui::EF_NONE
)));
996 EXPECT_EQ(expect_id
, manager_
->GetCurrentInputMethod().id());
997 EXPECT_EQ("us", keyboard_
->last_layout_
);
998 EXPECT_FALSE(manager_
->SwitchInputMethod(
999 ui::Accelerator(ui::VKEY_DBE_DBCSCHAR
, ui::EF_NONE
)));
1000 EXPECT_EQ(expect_id
, manager_
->GetCurrentInputMethod().id());
1001 EXPECT_EQ("us", keyboard_
->last_layout_
);
1003 manager_
->RemoveObserver(&observer
);
1006 TEST_F(InputMethodManagerImplTest
, TestSwitchInputMethodWithJpLayout
) {
1007 // Enable "xkb:jp::jpn" and press Muhenkan/ZenkakuHankaku.
1008 InitComponentExtension();
1010 ui::Accelerator
keydown_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
1011 keydown_accelerator
.set_type(ui::ET_KEY_PRESSED
);
1012 ui::Accelerator
keyup_accelerator(ui::VKEY_SPACE
, ui::EF_CONTROL_DOWN
);
1013 keyup_accelerator
.set_type(ui::ET_KEY_RELEASED
);
1015 std::vector
<std::string
> keyboard_layouts
;
1016 keyboard_layouts
.push_back(XkbId("xkb:us::eng"));
1017 manager_
->EnableLoginLayouts("ja", keyboard_layouts
);
1018 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1019 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
1020 EXPECT_EQ("us", keyboard_
->last_layout_
);
1021 EXPECT_TRUE(manager_
->SwitchInputMethod(
1022 ui::Accelerator(ui::VKEY_NONCONVERT
, ui::EF_NONE
)));
1023 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1024 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1025 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
1026 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
1027 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
1028 EXPECT_EQ("us", keyboard_
->last_layout_
);
1029 EXPECT_TRUE(manager_
->SwitchInputMethod(
1030 ui::Accelerator(ui::VKEY_DBE_SBCSCHAR
, ui::EF_NONE
)));
1031 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1032 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1033 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keydown_accelerator
));
1034 EXPECT_TRUE(manager_
->SwitchToPreviousInputMethod(keyup_accelerator
));
1035 EXPECT_EQ(XkbId("xkb:us::eng"), manager_
->GetCurrentInputMethod().id());
1036 EXPECT_EQ("us", keyboard_
->last_layout_
);
1037 EXPECT_TRUE(manager_
->SwitchInputMethod(
1038 ui::Accelerator(ui::VKEY_DBE_DBCSCHAR
, ui::EF_NONE
)));
1039 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1040 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1043 TEST_F(InputMethodManagerImplTest
, TestSwitchInputMethodWithJpIme
) {
1044 InitComponentExtension();
1045 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1046 std::vector
<std::string
> ids
;
1047 ids
.push_back(XkbId("xkb:jp::jpn"));
1048 ids
.push_back(kNaclMozcJpId
);
1049 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1050 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1051 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1052 EXPECT_TRUE(manager_
->SwitchInputMethod(
1053 ui::Accelerator(ui::VKEY_DBE_DBCSCHAR
, ui::EF_NONE
)));
1054 EXPECT_EQ(kNaclMozcJpId
, manager_
->GetCurrentInputMethod().id());
1055 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1056 EXPECT_TRUE(manager_
->SwitchInputMethod(
1057 ui::Accelerator(ui::VKEY_DBE_DBCSCHAR
, ui::EF_NONE
)));
1058 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1059 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1060 EXPECT_TRUE(manager_
->SwitchInputMethod(
1061 ui::Accelerator(ui::VKEY_CONVERT
, ui::EF_NONE
)));
1062 EXPECT_EQ(kNaclMozcJpId
, manager_
->GetCurrentInputMethod().id());
1063 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1064 EXPECT_TRUE(manager_
->SwitchInputMethod(
1065 ui::Accelerator(ui::VKEY_CONVERT
, ui::EF_NONE
)));
1066 EXPECT_EQ(kNaclMozcJpId
, manager_
->GetCurrentInputMethod().id());
1067 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1068 EXPECT_TRUE(manager_
->SwitchInputMethod(
1069 ui::Accelerator(ui::VKEY_NONCONVERT
, ui::EF_NONE
)));
1070 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1071 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1072 EXPECT_TRUE(manager_
->SwitchInputMethod(
1073 ui::Accelerator(ui::VKEY_NONCONVERT
, ui::EF_NONE
)));
1074 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1075 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1078 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
1079 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1080 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1081 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1082 EXPECT_TRUE(manager_
->SwitchInputMethod(
1083 ui::Accelerator(ui::VKEY_DBE_SBCSCHAR
, ui::EF_NONE
)));
1084 EXPECT_EQ(kNaclMozcJpId
, manager_
->GetCurrentInputMethod().id());
1085 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1086 EXPECT_TRUE(manager_
->SwitchInputMethod(
1087 ui::Accelerator(ui::VKEY_DBE_SBCSCHAR
, ui::EF_NONE
)));
1088 EXPECT_EQ(XkbId("xkb:jp::jpn"), manager_
->GetCurrentInputMethod().id());
1089 EXPECT_EQ("jp", keyboard_
->last_layout_
);
1092 TEST_F(InputMethodManagerImplTest
, TestAddRemoveExtensionInputMethods
) {
1093 TestObserver observer
;
1094 manager_
->AddObserver(&observer
);
1095 InitComponentExtension();
1096 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1097 std::vector
<std::string
> ids
;
1098 ids
.push_back(XkbId("xkb:us:dvorak:eng"));
1099 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1100 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1101 EXPECT_EQ(1, observer
.input_method_changed_count_
);
1102 EXPECT_EQ(XkbId(ids
[0]),
1103 manager_
->GetCurrentInputMethod().id());
1104 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
1106 // Add two Extension IMEs.
1107 std::vector
<std::string
> layouts
;
1108 layouts
.push_back("us");
1109 std::vector
<std::string
> languages
;
1110 languages
.push_back("en-US");
1112 const std::string ext1_id
=
1113 extension_ime_util::GetInputMethodID("deadbeef", "engine_id");
1114 const InputMethodDescriptor
descriptor1(ext1_id
,
1115 "deadbeef input method",
1119 false, // is_login_keyboard
1122 MockInputMethodEngine
engine(descriptor1
);
1123 manager_
->AddInputMethodExtension(ext1_id
, &engine
);
1125 // Extension IMEs are not enabled by default.
1126 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1128 std::vector
<std::string
> extension_ime_ids
;
1129 extension_ime_ids
.push_back(ext1_id
);
1130 manager_
->SetEnabledExtensionImes(&extension_ime_ids
);
1131 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1134 scoped_ptr
<InputMethodDescriptors
> methods(
1135 manager_
->GetActiveInputMethods());
1136 ASSERT_EQ(2U, methods
->size());
1137 // Ext IMEs should be at the end of the list.
1138 EXPECT_EQ(ext1_id
, methods
->at(1).id());
1141 const std::string ext2_id
=
1142 extension_ime_util::GetInputMethodID("cafebabe", "engine_id");
1143 const InputMethodDescriptor
descriptor2(ext2_id
,
1144 "cafebabe input method",
1148 false, // is_login_keyboard
1151 MockInputMethodEngine
engine2(descriptor2
);
1152 manager_
->AddInputMethodExtension(ext2_id
, &engine2
);
1153 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1155 extension_ime_ids
.push_back(ext2_id
);
1156 manager_
->SetEnabledExtensionImes(&extension_ime_ids
);
1157 EXPECT_EQ(3U, manager_
->GetNumActiveInputMethods());
1159 scoped_ptr
<InputMethodDescriptors
> methods(
1160 manager_
->GetActiveInputMethods());
1161 ASSERT_EQ(3U, methods
->size());
1162 // Ext IMEs should be at the end of the list.
1163 EXPECT_EQ(ext1_id
, methods
->at(1).id());
1164 EXPECT_EQ(ext2_id
, methods
->at(2).id());
1168 manager_
->RemoveInputMethodExtension(ext1_id
);
1169 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1170 manager_
->RemoveInputMethodExtension(ext2_id
);
1171 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1174 TEST_F(InputMethodManagerImplTest
, TestAddExtensionInputThenLockScreen
) {
1175 TestObserver observer
;
1176 InitComponentExtension();
1177 manager_
->AddObserver(&observer
);
1178 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1179 std::vector
<std::string
> ids
;
1180 ids
.push_back(XkbId("xkb:us::eng"));
1181 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1182 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1183 EXPECT_EQ(1, observer
.input_method_changed_count_
);
1184 EXPECT_EQ(XkbId(ids
[0]), manager_
->GetCurrentInputMethod().id());
1185 EXPECT_EQ("us", keyboard_
->last_layout_
);
1187 // Add an Extension IME.
1188 std::vector
<std::string
> layouts
;
1189 layouts
.push_back("us(dvorak)");
1190 std::vector
<std::string
> languages
;
1191 languages
.push_back("en-US");
1193 const std::string ext_id
=
1194 extension_ime_util::GetInputMethodID("deadbeef", "engine_id");
1195 const InputMethodDescriptor
descriptor(ext_id
,
1196 "deadbeef input method",
1200 false, // is_login_keyboard
1203 MockInputMethodEngine
engine(descriptor
);
1204 manager_
->AddInputMethodExtension(ext_id
, &engine
);
1206 // Extension IME is not enabled by default.
1207 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1208 EXPECT_EQ(1, observer
.input_method_changed_count_
);
1210 std::vector
<std::string
> extension_ime_ids
;
1211 extension_ime_ids
.push_back(ext_id
);
1212 manager_
->SetEnabledExtensionImes(&extension_ime_ids
);
1213 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1215 // Switch to the IME.
1216 manager_
->SwitchToNextInputMethod();
1217 EXPECT_EQ(3, observer
.input_method_changed_count_
);
1218 EXPECT_EQ(ext_id
, manager_
->GetCurrentInputMethod().id());
1219 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
1221 // Lock the screen. This is for crosbug.com/27049.
1222 manager_
->SetState(InputMethodManager::STATE_LOCK_SCREEN
);
1223 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods()); // Qwerty. No Ext. IME
1224 EXPECT_EQ(XkbId("xkb:us::eng"),
1225 manager_
->GetCurrentInputMethod().id());
1226 EXPECT_EQ("us", keyboard_
->last_layout_
);
1228 // Unlock the screen.
1229 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1230 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1231 EXPECT_EQ(ext_id
, manager_
->GetCurrentInputMethod().id());
1232 EXPECT_EQ("us(dvorak)", keyboard_
->last_layout_
);
1234 // This is for crosbug.com/27052.
1235 scoped_ptr
<InputMethodDescriptors
> methods(
1236 manager_
->GetActiveInputMethods());
1237 ASSERT_EQ(2U, methods
->size());
1238 // Ext. IMEs should be at the end of the list.
1239 EXPECT_EQ(ext_id
, methods
->at(1).id());
1241 manager_
->RemoveObserver(&observer
);
1244 TEST_F(InputMethodManagerImplTest
,
1245 ChangeInputMethodBeforeComponentExtensionInitialization_OneIME
) {
1246 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1247 std::vector
<std::string
> ids
;
1248 ids
.push_back(kNaclMozcUsId
);
1249 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1250 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1251 manager_
->ChangeInputMethod(kNaclMozcUsId
);
1253 InitComponentExtension();
1254 EXPECT_EQ(kNaclMozcUsId
, manager_
->GetCurrentInputMethod().id());
1257 TEST_F(InputMethodManagerImplTest
,
1258 ChangeInputMethodBeforeComponentExtensionInitialization_TwoIME
) {
1259 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1260 std::vector
<std::string
> ids
;
1261 ids
.push_back(kNaclMozcUsId
);
1262 ids
.push_back(kNaclMozcJpId
);
1263 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1264 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1265 manager_
->ChangeInputMethod(kNaclMozcUsId
);
1266 manager_
->ChangeInputMethod(kNaclMozcJpId
);
1268 InitComponentExtension();
1269 EXPECT_EQ(kNaclMozcJpId
, manager_
->GetCurrentInputMethod().id());
1272 TEST_F(InputMethodManagerImplTest
,
1273 ChangeInputMethodBeforeComponentExtensionInitialization_CompOneIME
) {
1274 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1275 const std::string ext_id
= extension_ime_util::GetComponentInputMethodID(
1277 ime_list_
[1].engines
[0].engine_id
);
1278 std::vector
<std::string
> ids
;
1279 ids
.push_back(ext_id
);
1280 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1281 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1282 manager_
->ChangeInputMethod(ext_id
);
1284 InitComponentExtension();
1285 EXPECT_EQ(ext_id
, manager_
->GetCurrentInputMethod().id());
1288 TEST_F(InputMethodManagerImplTest
,
1289 ChangeInputMethodBeforeComponentExtensionInitialization_CompTwoIME
) {
1290 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1291 const std::string ext_id1
= extension_ime_util::GetComponentInputMethodID(
1293 ime_list_
[1].engines
[0].engine_id
);
1294 const std::string ext_id2
= extension_ime_util::GetComponentInputMethodID(
1296 ime_list_
[2].engines
[0].engine_id
);
1297 std::vector
<std::string
> ids
;
1298 ids
.push_back(ext_id1
);
1299 ids
.push_back(ext_id2
);
1300 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1301 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1302 manager_
->ChangeInputMethod(ext_id1
);
1303 manager_
->ChangeInputMethod(ext_id2
);
1305 InitComponentExtension();
1306 EXPECT_EQ(ext_id2
, manager_
->GetCurrentInputMethod().id());
1309 TEST_F(InputMethodManagerImplTest
,
1310 ChangeInputMethod_ComponenteExtensionOneIME
) {
1311 InitComponentExtension();
1312 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1313 const std::string ext_id
= extension_ime_util::GetComponentInputMethodID(
1315 ime_list_
[1].engines
[0].engine_id
);
1316 std::vector
<std::string
> ids
;
1317 ids
.push_back(ext_id
);
1318 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1319 EXPECT_EQ(1U, manager_
->GetNumActiveInputMethods());
1320 EXPECT_EQ(ext_id
, manager_
->GetCurrentInputMethod().id());
1323 TEST_F(InputMethodManagerImplTest
,
1324 ChangeInputMethod_ComponenteExtensionTwoIME
) {
1325 InitComponentExtension();
1326 manager_
->SetState(InputMethodManager::STATE_BROWSER_SCREEN
);
1327 const std::string ext_id1
= extension_ime_util::GetComponentInputMethodID(
1329 ime_list_
[1].engines
[0].engine_id
);
1330 const std::string ext_id2
= extension_ime_util::GetComponentInputMethodID(
1332 ime_list_
[2].engines
[0].engine_id
);
1333 std::vector
<std::string
> ids
;
1334 ids
.push_back(ext_id1
);
1335 ids
.push_back(ext_id2
);
1336 EXPECT_TRUE(manager_
->ReplaceEnabledInputMethods(ids
));
1337 EXPECT_EQ(2U, manager_
->GetNumActiveInputMethods());
1338 EXPECT_EQ(ext_id1
, manager_
->GetCurrentInputMethod().id());
1339 manager_
->ChangeInputMethod(ext_id2
);
1340 EXPECT_EQ(ext_id2
, manager_
->GetCurrentInputMethod().id());
1343 TEST_F(InputMethodManagerImplTest
, MigrateInputMethodTest_1
) {
1344 extension_ime_util::ScopedUseExtensionKeyboardFlagForTesting
1347 std::vector
<std::string
> input_method_ids
;
1348 input_method_ids
.push_back("xkb:us::eng");
1349 input_method_ids
.push_back("xkb:fr::fra");
1350 input_method_ids
.push_back(
1351 std::string("_comp_ime_") + kXkbExtId
+ "xkb:us::eng");
1352 input_method_ids
.push_back("xkb:fr::fra");
1353 input_method_ids
.push_back(
1354 std::string("_comp_ime_") + kXkbExtId
+ "xkb:us::eng");
1355 input_method_ids
.push_back("_comp_ime_asdf_pinyin");
1356 input_method_ids
.push_back(kPinyinImeId
);
1358 manager_
->MigrateXkbInputMethods(&input_method_ids
);
1360 ASSERT_EQ(4U, input_method_ids
.size());
1362 EXPECT_EQ(std::string("_comp_ime_") + kXkbExtId
+ "xkb:us::eng",
1363 input_method_ids
[0]);
1364 EXPECT_EQ(std::string("_comp_ime_") + kXkbExtId
+ "xkb:fr::fra",
1365 input_method_ids
[1]);
1366 EXPECT_EQ("_comp_ime_asdf_pinyin", input_method_ids
[2]);
1367 EXPECT_EQ("_comp_ime_gjaehgfemfahhmlgpdfknkhdnemmolopzh-t-i0-pinyin",
1368 input_method_ids
[3]);
1371 TEST_F(InputMethodManagerImplTest
, MigrateInputMethodTest_2
) {
1372 extension_ime_util::ScopedUseExtensionKeyboardFlagForTesting
1375 std::vector
<std::string
> input_method_ids
;
1376 input_method_ids
.push_back("xkb:us::eng");
1377 input_method_ids
.push_back("xkb:fr::fra");
1378 input_method_ids
.push_back(
1379 std::string("_comp_ime_") + kXkbExtId
+ "xkb:us::eng");
1380 input_method_ids
.push_back("xkb:fr::fra");
1381 input_method_ids
.push_back(
1382 std::string("_comp_ime_") + kXkbExtId
+ "xkb:us::eng");
1383 input_method_ids
.push_back("_comp_ime_asdf_pinyin");
1385 manager_
->MigrateXkbInputMethods(&input_method_ids
);
1387 ASSERT_EQ(3U, input_method_ids
.size());
1389 EXPECT_EQ("xkb:us::eng", input_method_ids
[0]);
1390 EXPECT_EQ("xkb:fr::fra", input_method_ids
[1]);
1391 EXPECT_EQ("_comp_ime_asdf_pinyin", input_method_ids
[2]);
1394 } // namespace input_method
1395 } // namespace chromeos