15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_manager_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <algorithm>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/basictypes.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
139ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_candidate_window_controller.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_ibus_controller.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/ibus/mock_ibus_client.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/ibus/mock_ibus_input_context_client.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/extension_ime_util.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/fake_input_method_delegate.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/mock_component_extension_ime_manager_delegate.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chromeos/ime/mock_ibus_daemon_controller.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/mock_xkeyboard.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/accelerators/accelerator.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/keycodes/keyboard_codes.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace input_method {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char nacl_mozc_us_id[] =
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "_comp_ime_fpfbhcjppmaeaijcidgiibchfbnhbeljnacl_mozc_us";
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char nacl_mozc_jp_id[] =
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "_comp_ime_fpfbhcjppmaeaijcidgiibchfbnhbeljnacl_mozc_jp";
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Returns true if |descriptors| contain |target|.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool Contain(const InputMethodDescriptors& descriptors,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             const InputMethodDescriptor& target) {
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for (size_t i = 0; i < descriptors.size(); ++i) {
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (descriptors[i].id() == target.id())
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return true;
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return false;
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethodManagerImplTest :  public testing::Test {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodManagerImplTest()
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : delegate_(NULL),
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        controller_(NULL),
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        candidate_window_controller_(NULL),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        xkeyboard_(NULL) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~InputMethodManagerImplTest() {}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUp() OVERRIDE {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_ibus_daemon_controller_ = new chromeos::MockIBusDaemonController();
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::IBusDaemonController::InitializeForTesting(
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_ibus_daemon_controller_);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    mock_dbus_thread_manager_ =
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        new chromeos::MockDBusThreadManagerWithoutGMock();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::DBusThreadManager::InitializeForTesting(
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        mock_dbus_thread_manager_);
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_ = new FakeInputMethodDelegate();
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset(new InputMethodManagerImpl(
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        scoped_ptr<InputMethodDelegate>(delegate_)));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_ = new MockIBusController;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->SetIBusControllerForTesting(controller_);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    candidate_window_controller_ = new MockCandidateWindowController;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->SetCandidateWindowControllerForTesting(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        candidate_window_controller_);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xkeyboard_ = new MockXKeyboard;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    manager_->SetXKeyboardForTesting(xkeyboard_);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ime_list_.clear();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentExtensionIME ext1;
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1.id = "fpfbhcjppmaeaijcidgiibchfbnhbelj";
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1.description = "ext1_description";
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1.path = base::FilePath("ext1_file_path");
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentExtensionEngine ext1_engine1;
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine1.engine_id = "nacl_mozc_us";
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine1.display_name = "ext1_engine_1_display_name";
87a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ext1_engine1.language_codes.push_back("ja");
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine1.layouts.push_back("us");
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1.engines.push_back(ext1_engine1);
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentExtensionEngine ext1_engine2;
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine2.engine_id = "nacl_mozc_jp";
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine2.display_name = "ext1_engine_1_display_name";
94a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ext1_engine2.language_codes.push_back("ja");
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1_engine2.layouts.push_back("jp");
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext1.engines.push_back(ext1_engine2);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ime_list_.push_back(ext1);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentExtensionIME ext2;
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ext2.id = "nmblnjkfdkabgdofidlkienfnnbjhnab";
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2.description = "ext2_description";
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2.path = base::FilePath("ext2_file_path");
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ComponentExtensionEngine ext2_engine1;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2_engine1.engine_id = "ext2_engine1_engine_id";
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2_engine1.display_name = "ext2_engine_1_display_name";
108a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ext2_engine1.language_codes.push_back("en");
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2_engine1.layouts.push_back("us");
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ext2.engines.push_back(ext2_engine1);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ComponentExtensionEngine ext2_engine2;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ext2_engine2.engine_id = "ext2_engine2_engine_id";
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ext2_engine2.display_name = "ext2_engine_2_display_name";
115a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch    ext2_engine2.language_codes.push_back("en");
116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ext2_engine2.layouts.push_back("us(dvorak)");
117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ext2.engines.push_back(ext2_engine2);
118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ime_list_.push_back(ext2);
120a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
121a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    mock_ibus_daemon_controller_->EmulateConnect();
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void TearDown() OVERRIDE {
125a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    mock_ibus_daemon_controller_->EmulateDisconnect();
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    delegate_ = NULL;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    controller_ = NULL;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    candidate_window_controller_ = NULL;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    xkeyboard_ = NULL;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    manager_.reset();
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::DBusThreadManager::Shutdown();
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    chromeos::IBusDaemonController::Shutdown();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
136b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Helper function to initialize component extension stuff for testing.
137b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void InitComponentExtension() {
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_delegate_ = new MockComponentExtIMEManagerDelegate();
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    mock_delegate_->set_ime_list(ime_list_);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    scoped_ptr<ComponentExtensionIMEManagerDelegate> delegate(mock_delegate_);
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    manager_->InitializeComponentExtensionForTesting(delegate.Pass());
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Helper function to initialize IBus bus connection for testing. Do not use
145b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // ibus related mocks before calling this function.
146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  void InitIBusBus() {
147b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    mock_dbus_thread_manager_->InitIBusBus("dummy address",
148b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                                           base::Bind(&base::DoNothing));
149b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    mock_ibus_client_ = mock_dbus_thread_manager_->mock_ibus_client();
150b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    mock_ibus_input_context_client_ =
151b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)        mock_dbus_thread_manager_->mock_ibus_input_context_client();
152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    mock_ibus_daemon_controller_->EmulateConnect();
153b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  }
154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InputMethodManagerImpl> manager_;
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeInputMethodDelegate* delegate_;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockIBusController* controller_;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockCandidateWindowController* candidate_window_controller_;
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockIBusDaemonController* mock_ibus_daemon_controller_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockIBusInputContextClient* mock_ibus_input_context_client_;
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockIBusClient* mock_ibus_client_;
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_;
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MockXKeyboard* xkeyboard_;
16490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  base::MessageLoop message_loop_;
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MockComponentExtIMEManagerDelegate* mock_delegate_;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<ComponentExtensionIME> ime_list_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(InputMethodManagerImplTest);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TestableComponentExtensionIMEManager
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ComponentExtensionIMEManager {
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  using ComponentExtensionIMEManager::GetComponentExtensionIMEId;
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestObserver : public InputMethodManager::Observer {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver()
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : input_method_changed_count_(0),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input_method_property_changed_count_(0),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        last_show_message_(false) {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestObserver() {}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InputMethodChanged(InputMethodManager* manager,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  bool show_message) OVERRIDE {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++input_method_changed_count_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    last_show_message_ = show_message;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InputMethodPropertyChanged(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InputMethodManager* manager) OVERRIDE {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++input_method_property_changed_count_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int input_method_changed_count_;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int input_method_property_changed_count_;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool last_show_message_;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestObserver);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestCandidateWindowObserver
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public InputMethodManager::CandidateWindowObserver {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCandidateWindowObserver()
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : candidate_window_opened_count_(0),
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        candidate_window_closed_count_(0) {
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TestCandidateWindowObserver() {}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CandidateWindowOpened(InputMethodManager* manager) OVERRIDE {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++candidate_window_opened_count_;
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CandidateWindowClosed(InputMethodManager* manager) OVERRIDE {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ++candidate_window_closed_count_;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int candidate_window_opened_count_;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int candidate_window_closed_count_;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestCandidateWindowObserver);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestGetXKeyboard) {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetXKeyboard());
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(xkeyboard_, manager_->GetXKeyboard());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestCandidateWindowObserver) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCandidateWindowObserver observer;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowOpened();  // nop
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowClosed();  // nop
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddCandidateWindowObserver(&observer);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowOpened();
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.candidate_window_opened_count_);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowClosed();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.candidate_window_closed_count_);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowOpened();
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.candidate_window_opened_count_);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  candidate_window_controller_->NotifyCandidateWindowClosed();
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.candidate_window_closed_count_);
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveCandidateWindowObserver(&observer);
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestObserver) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (3). browser_state_monitor_unittest.cc is
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // also for the scenario.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
255b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
256b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, observer.input_method_changed_count_);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "xkb:us::eng");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_property_changed_count_);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ChangeInputMethod("xkb:us:dvorak:eng");
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.last_show_message_);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_property_changed_count_);
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ChangeInputMethod("xkb:us:dvorak:eng");
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.last_show_message_);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The observer is always notified even when the same input method ID is
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // passed to ChangeInputMethod() more than twice.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, observer.input_method_changed_count_);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, observer.input_method_property_changed_count_);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, observer.input_method_property_changed_count_);
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, observer.input_method_property_changed_count_);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestGetSupportedInputMethods) {
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitComponentExtension();
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  InitIBusBus();
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InputMethodDescriptors> methods(
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->GetSupportedInputMethods());
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(methods.get());
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Try to find random 4-5 layuts and IMEs to make sure the returned list is
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // correct.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* id_to_find =
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          nacl_mozc_us_id);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id_to_find = manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us::eng");
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Contain(*methods.get(), *id_to_find));
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id_to_find = manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us:dvorak:eng");
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Contain(*methods.get(), *id_to_find));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id_to_find = manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:fr::fra");
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Contain(*methods.get(), *id_to_find));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableLayouts) {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently 5 keyboard layouts are supported for en-US, and 1 for ja. See
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ibus_input_method.txt.
305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "");
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, manager_->GetNumActiveInputMethods());
309a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (size_t i = 0; i < manager_->GetActiveInputMethodIds().size(); ++i)
310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    LOG(ERROR) << manager_->GetActiveInputMethodIds().at(i);
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (2)
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->start_count());
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (5)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The hardware keyboard layout "xkb:us::eng" is always active, hence 2U.
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("ja", "");  // Japanese
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->start_count());
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableLayoutsNonUsHardwareKeyboard) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The physical layout is French.
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_->set_hardware_keyboard_layout("xkb:fr::fra");
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "");
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6U, manager_->GetNumActiveInputMethods());  // 5 + French
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The physical layout is Japanese.
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  delegate_->set_hardware_keyboard_layout("xkb:jp::jpn");
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("ja", "");
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "xkb:us::eng" is not needed, hence 1.
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestActiveInputMethods) {
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  manager_->EnableLayouts("ja", "");  // Japanese
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<InputMethodDescriptors> methods(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->GetActiveInputMethods());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(methods.get());
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, methods->size());
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* id_to_find =
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "xkb:us::eng");
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Contain(*methods.get(), *id_to_find));
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  id_to_find = manager_->GetInputMethodUtil()->GetInputMethodDescriptorFromId(
345eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      "xkb:jp::jpn");
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(Contain(*methods.get(), *id_to_find));
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestSetInputMethodConfig) {
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodConfigValue config;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config.type = InputMethodConfigValue::kValueTypeString;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  config.string_value = "string";
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, controller_->set_input_method_config_internal_count_);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SetInputMethodConfig("section", "name", config));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, controller_->set_input_method_config_internal_count_);
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("section",
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            controller_->set_input_method_config_internal_key_.first);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("name",
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            controller_->set_input_method_config_internal_key_.second);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(config.type,
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            controller_->set_input_method_config_internal_value_.type);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(config.string_value,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            controller_->set_input_method_config_internal_value_.string_value);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetInputMethodConfig should be no-op in STATE_TERMINATING.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_TERMINATING);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->SetInputMethodConfig("section", "name", config));
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, controller_->set_input_method_config_internal_count_);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableTwoLayouts) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (8), step 6.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
375b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
376b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:colemak:eng");
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since all the IDs added avobe are keyboard layouts, Start() should not be
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // called.
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->start_count());
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Dvorak.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.erase(ids.begin());
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0],  // colemak
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(colemak)", xkeyboard_->last_layout_);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableThreeLayouts) {
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (9).
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
404b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
405b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us::eng");
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:colemak:eng");
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, manager_->GetNumActiveInputMethods());
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to Dvorak.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Dvorak.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.erase(ids.begin() + 1);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, observer.input_method_changed_count_);
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0],  // US Qwerty
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableLayoutAndIme) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (10).
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
436b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
437b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
441c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_daemon_controller_->start_count());
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to Mozc
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Mozc.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.erase(ids.begin() + 1);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, to work around  a crash issue at crosbug.com/27051,
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // controller_->Stop(); is NOT called when all IMEs are disabled
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or on shutdown.
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->stop_count());
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_TERMINATING);
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->stop_count());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableLayoutAndIme2) {
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (11).
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
472b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
473b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
477c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_daemon_controller_->start_count());
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Dvorak.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.erase(ids.begin());
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0],  // Mozc
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableImes) {
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
497b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
498b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ids.push_back("_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabext2_engine1_engine_id");
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("mozc-dv");
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_daemon_controller_->start_count());
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableUnknownIds) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:tl::tlh");  // Klingon, which is not supported.
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("unknown-super-cool-ime");
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->EnableInputMethods(ids));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Should we fall back to the hardware keyboard layout in this
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // case?
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0, observer.input_method_changed_count_);
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestEnableLayoutsThenLock) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (14).
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
531b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
532b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us::eng");
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to Dvorak.
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock screen
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_LOCK_SCREEN);
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1],  // still Dvorak
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch back to Qwerty.
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock screen. The original state, Dvorak, is restored.
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(InputMethodManagerImplTest, SwithchInputMethodTest) {
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (15).
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
573b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
574b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ids.push_back("_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabext2_engine2_engine_id");
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ids.push_back("_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabext2_engine1_engine_id");
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, manager_->GetNumActiveInputMethods());
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to Mozc.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, observer.input_method_changed_count_);
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock screen
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_LOCK_SCREEN);
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());  // Qwerty+Dvorak.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:dvorak:eng",
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // controller_->Stop() should never be called when the screen is locked even
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after crosbug.com/27051 is fixed.
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->stop_count());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng",  // The hardware keyboard layout.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Unlock screen. The original state, pinyin-dv, is restored.
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, manager_->GetNumActiveInputMethods());  // Dvorak and 2 IMEs.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[1], manager_->GetCurrentInputMethod().id());
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestXkbSetting) {
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (8), step 7-11.
617b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
618b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:colemak:eng");
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_jp_id);
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4U, manager_->GetNumActiveInputMethods());
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See input_methods.txt for an expected XKB layout name.
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(colemak)", xkeyboard_->last_layout_);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(4, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable Dvorak.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.erase(ids.begin());
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, manager_->GetNumActiveInputMethods());
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(6, xkeyboard_->set_current_keyboard_layout_by_name_count_);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(colemak)", xkeyboard_->last_layout_);
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestActivateInputMethodProperty) {
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ActivateInputMethodProperty("key");
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, controller_->activate_input_method_property_count_);
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key", controller_->activate_input_method_property_key_);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ActivateInputMethodProperty("key2");
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2, controller_->activate_input_method_property_count_);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key2", controller_->activate_input_method_property_key_);
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestGetCurrentInputMethodProperties) {
660b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
661b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us::eng");
667c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
671c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(nacl_mozc_us_id);
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodPropertyList current_property_list;
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_property_list.push_back(InputMethodProperty("key",
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "label",
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      false,
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      false));
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->SetCurrentPropertiesForTesting(current_property_list);
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, manager_->GetCurrentInputMethodProperties().size());
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key", manager_->GetCurrentInputMethodProperties().at(0).key);
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ChangeInputMethod("xkb:us::eng");
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delayed asynchronous property update signal from the Mozc IME.
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When XKB layout is in use, GetCurrentInputMethodProperties() should always
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // return an empty list.
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestGetCurrentInputMethodPropertiesTwoImes) {
695b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
696b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);  // Japanese
702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ids.push_back("_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabext2_engine1_engine_id");  // T-Chinese
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodPropertyList current_property_list;
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_property_list.push_back(InputMethodProperty("key-mozc",
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "label",
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      false,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      false));
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->SetCurrentPropertiesForTesting(current_property_list);
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, manager_->GetCurrentInputMethodProperties().size());
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key-mozc", manager_->GetCurrentInputMethodProperties().at(0).key);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  manager_->ChangeInputMethod("_comp_ime_nmblnjkfdkabgdofidlkienfnnbjhnabext2_engine1_engine_id");
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Since the IME is changed, the property for mozc Japanese should be hidden.
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->GetCurrentInputMethodProperties().empty());
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Asynchronous property update signal from mozc-chewing.
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_property_list.clear();
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  current_property_list.push_back(InputMethodProperty("key-chewing",
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      "label",
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                      false,
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                                      false));
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->SetCurrentPropertiesForTesting(current_property_list);
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller_->NotifyPropertyChangedForTesting();
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, manager_->GetCurrentInputMethodProperties().size());
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("key-chewing",
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethodProperties().at(0).key);
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestNextInputMethod) {
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
738b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
739b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For http://crbug.com/19655#c11 - (1)
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "xkb:us::eng");
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, manager_->GetNumActiveInputMethods());
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id());
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(intl)", xkeyboard_->last_layout_);
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:altgr-intl:eng", manager_->GetCurrentInputMethod().id());
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(altgr-intl)", xkeyboard_->last_layout_);
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:dvorak:eng", manager_->GetCurrentInputMethod().id());
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:colemak:eng", manager_->GetCurrentInputMethod().id());
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(colemak)", xkeyboard_->last_layout_);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestPreviousInputMethod) {
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
772b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
773b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
774a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
775a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
776a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keydown_accelerator.set_type(ui::ET_KEY_PRESSED);
777a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
778a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keyup_accelerator.set_type(ui::ET_KEY_RELEASED);
779a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "xkb:us::eng");
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, manager_->GetNumActiveInputMethods());
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
784a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToNextInputMethod());
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id());
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(intl)", xkeyboard_->last_layout_);
788a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
789a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
793a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
794a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id());
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(intl)", xkeyboard_->last_layout_);
798a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
799a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
803a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToNextInputMethod());
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id());
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(intl)", xkeyboard_->last_layout_);
807a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToNextInputMethod());
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:altgr-intl:eng", manager_->GetCurrentInputMethod().id());
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(altgr-intl)", xkeyboard_->last_layout_);
811a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
812a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:intl:eng", manager_->GetCurrentInputMethod().id());
8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(intl)", xkeyboard_->last_layout_);
816a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
817a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(observer.last_show_message_);
8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us:altgr-intl:eng", manager_->GetCurrentInputMethod().id());
8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(altgr-intl)", xkeyboard_->last_layout_);
8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825a3f7b4e666c476898878fa745f637129375cd889Ben MurdochTEST_F(InputMethodManagerImplTest,
826a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch       TestSwitchToPreviousInputMethodForOneActiveInputMethod) {
827a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  TestObserver observer;
828a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  manager_->AddObserver(&observer);
829a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  InitComponentExtension();
830a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  InitIBusBus();
831a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
832a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
833a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keydown_accelerator.set_type(ui::ET_KEY_PRESSED);
834a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
835a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keyup_accelerator.set_type(ui::ET_KEY_RELEASED);
836a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
837a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  std::vector<std::string> ids;
838a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ids.push_back("xkb:us:dvorak:eng");
839a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->EnableInputMethods(ids));
840a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
841a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
842a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // Ctrl+Space accelerator should not be consumed if there is only one active
843a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  // input method.
844a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_FALSE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
845a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_FALSE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
846a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
847a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  manager_->RemoveObserver(&observer);
848a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}
849a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithUsLayouts) {
8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
853b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
854b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("en-US", "xkb:us::eng");
8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(5U, manager_->GetNumActiveInputMethods());
8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Henkan, Muhenkan, ZenkakuHankaku should be ignored when no Japanese IMEs
8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and keyboards are enabled.
8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->SwitchInputMethod(
8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_CONVERT, ui::EF_NONE)));
8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(observer.last_show_message_);
8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->SwitchInputMethod(
8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_NONCONVERT, ui::EF_NONE)));
8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->SwitchInputMethod(
8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE)));
8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(manager_->SwitchInputMethod(
8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_DBCSCHAR, ui::EF_NONE)));
8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithJpLayout) {
8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Enable "xkb:jp::jpn" and press Muhenkan/ZenkakuHankaku.
885b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
886b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
887a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
888a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keydown_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
889a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keydown_accelerator.set_type(ui::ET_KEY_PRESSED);
890a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  ui::Accelerator keyup_accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN);
891a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  keyup_accelerator.set_type(ui::ET_KEY_RELEASED);
892a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->EnableLayouts("ja", "xkb:us::eng");
8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_NONCONVERT, ui::EF_NONE)));
8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
901a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
902a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE)));
9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
909a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keydown_accelerator));
910a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_TRUE(manager_->SwitchToPreviousInputMethod(keyup_accelerator));
9115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng", manager_->GetCurrentInputMethod().id());
9125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
9135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_DBCSCHAR, ui::EF_NONE)));
9155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestSwitchInputMethodWithJpIme) {
920b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
921b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:jp::jpn");
925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_jp_id);
9265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
9275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_DBCSCHAR, ui::EF_NONE)));
931c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_jp_id, manager_->GetCurrentInputMethod().id());
9325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_DBCSCHAR, ui::EF_NONE)));
9355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_CONVERT, ui::EF_NONE)));
939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_jp_id, manager_->GetCurrentInputMethod().id());
9405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_CONVERT, ui::EF_NONE)));
943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_jp_id, manager_->GetCurrentInputMethod().id());
9445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_NONCONVERT, ui::EF_NONE)));
9475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_NONCONVERT, ui::EF_NONE)));
9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add Dvorak.
9555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE)));
961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_jp_id, manager_->GetCurrentInputMethod().id());
9625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->SwitchInputMethod(
9645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::Accelerator(ui::VKEY_DBE_SBCSCHAR, ui::EF_NONE)));
9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp::jpn", manager_->GetCurrentInputMethod().id());
9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("jp", xkeyboard_->last_layout_);
9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestAddRemoveExtensionInputMethods) {
9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
972b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
973b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us:dvorak:eng");
9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
9792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->start_count());
9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0],
9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add two Extension IMEs.
9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> layouts;
9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layouts.push_back("us");
9887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<std::string> languages;
9897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  languages.push_back("en-US");
9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddInputMethodExtension(
991c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "deadbeef input method",
9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layouts,
9947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      languages,
99590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(),
9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
997b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
998b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Extension IMEs are not enabled by default.
999b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
1000b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1001b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<std::string> extension_ime_ids;
1002b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  extension_ime_ids.push_back(
1003b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      extension_ime_util::GetInputMethodID("deadbeef", "engine_id"));
1004b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->SetEnabledExtensionImes(&extension_ime_ids);
10055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
10062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
10072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should be started.
10082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_daemon_controller_->start_count());
10095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<InputMethodDescriptors> methods(
10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->GetActiveInputMethods());
10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, methods->size());
1013c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              // Ext IMEs should be at the end of the list.
10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              methods->at(1).id());
10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddInputMethodExtension(
1018c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_ime_util::GetInputMethodID("cafebabe", "engine_id"),
10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "cafebabe input method",
10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layouts,
10217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      languages,
102290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(),
10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
1024b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1025b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1026b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  extension_ime_ids.push_back(
1027b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      extension_ime_util::GetInputMethodID("cafebabe", "engine_id"));
1028b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->SetEnabledExtensionImes(&extension_ime_ids);
10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, manager_->GetNumActiveInputMethods());
10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<InputMethodDescriptors> methods(
10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->GetActiveInputMethods());
10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(3U, methods->size());
1034c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              // Ext IMEs should be at the end of the list.
10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              methods->at(1).id());
10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove them.
10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveInputMethodExtension(
1041c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_ime_util::GetInputMethodID("deadbeef", "engine_id"));
10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveInputMethodExtension(
1044c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_ime_util::GetInputMethodID("cafebabe", "engine_id"));
10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Currently, to work around  a crash issue at crosbug.com/27051,
10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // controller_->Stop(); is NOT called when all (extension) IMEs are disabled.
10482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->stop_count());
10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestAddExtensionInputThenLockScreen) {
10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestObserver observer;
1055b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1056b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddObserver(&observer);
10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us::eng");
10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
10625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
10635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ids[0], manager_->GetCurrentInputMethod().id());
10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add an Extension IME.
10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> layouts;
10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  layouts.push_back("us(dvorak)");
10707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  std::vector<std::string> languages;
10717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  languages.push_back("en-US");
10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->AddInputMethodExtension(
1073c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "deadbeef input method",
10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      layouts,
10767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      languages,
107790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      GURL(),
10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NULL);
1079b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Extension IME is not enabled by default.
1080b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1, observer.input_method_changed_count_);
10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1083b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<std::string> extension_ime_ids;
1084b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  extension_ime_ids.push_back(
1085b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      extension_ime_util::GetInputMethodID("deadbeef", "engine_id"));
1086b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->SetEnabledExtensionImes(&extension_ime_ids);
1087b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1088b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Switch to the IME.
10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SwitchToNextInputMethod();
1091b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(3, observer.input_method_changed_count_);
1092c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Lock the screen. This is for crosbug.com/27049.
10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_LOCK_SCREEN);
10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());  // Qwerty. No Ext. IME
10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:us::eng",
11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us", xkeyboard_->last_layout_);
11022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(0, mock_ibus_daemon_controller_->stop_count());
11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unlock the screen.
11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            manager_->GetCurrentInputMethod().id());
11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", xkeyboard_->last_layout_);
11105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
11115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is for crosbug.com/27052.
11125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<InputMethodDescriptors> methods(
11135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        manager_->GetActiveInputMethods());
11145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_EQ(2U, methods->size());
1115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXPECT_EQ(extension_ime_util::GetInputMethodID("deadbeef", "engine_id"),
11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              // Ext. IMEs should be at the end of the list.
11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              methods->at(1).id());
11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->RemoveObserver(&observer);
11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodManagerImplTest, TestReset) {
1123b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1124b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> ids;
11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ids.push_back("xkb:us::eng");
1128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
11312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_input_context_client_->reset_call_count());
1132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(nacl_mozc_us_id);
1133a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1134a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_us_id, mock_ibus_client_->latest_global_engine_name());
11352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_input_context_client_->reset_call_count());
11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  manager_->ChangeInputMethod("xkb:us::eng");
1137a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(2, mock_ibus_client_->set_global_engine_call_count());
1138a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_us_id, mock_ibus_client_->latest_global_engine_name());
11392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_input_context_client_->reset_call_count());
11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethodBeforeComponentExtensionInitialization_OneIME) {
1144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
1147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
1149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(nacl_mozc_us_id);
1150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1151a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  InitIBusBus();
1152b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1153a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(nacl_mozc_us_id, mock_ibus_client_->latest_global_engine_name());
1155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethodBeforeComponentExtensionInitialization_TwoIME) {
1159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(nacl_mozc_us_id);
1162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  ids.push_back(nacl_mozc_jp_id);
1163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(nacl_mozc_us_id);
1166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  manager_->ChangeInputMethod(nacl_mozc_jp_id);
1167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1168b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1169b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1170a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(nacl_mozc_jp_id, mock_ibus_client_->latest_global_engine_name());
1172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethodBeforeComponentExtensionInitialization_CompOneIME) {
1176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id =
1178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].id,
1180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].engines[0].engine_id);
1181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id);
1183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
1185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(ext_id);
1186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1187b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1188b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1189a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1190a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(ext_id, mock_ibus_client_->latest_global_engine_name());
1191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethodBeforeComponentExtensionInitialization_CompTwoIME) {
1195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id1 =
1197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].id,
1199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].engines[0].engine_id);
1200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id2 =
1201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[1].id,
1203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[1].engines[0].engine_id);
1204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id1);
1206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id2);
1207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(ext_id1);
1210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(ext_id2);
1211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1212b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1213b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1214a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1215a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(ext_id2, mock_ibus_client_->latest_global_engine_name());
1216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethod_ComponenteExtensionOneIME) {
1220b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1221b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id =
1224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].id,
1226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].engines[0].engine_id);
1227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id);
1229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(1U, manager_->GetNumActiveInputMethods());
1231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1232a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(ext_id, mock_ibus_client_->latest_global_engine_name());
1233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       ChangeInputMethod_ComponenteExtensionTwoIME) {
1237b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1238b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->SetState(InputMethodManager::STATE_BROWSER_SCREEN);
1240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id1 =
1241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].id,
1243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[0].engines[0].engine_id);
1244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const std::string ext_id2 =
1245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      TestableComponentExtensionIMEManager::GetComponentExtensionIMEId(
1246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[1].id,
1247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ime_list_[1].engines[0].engine_id);
1248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> ids;
1249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id1);
1250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ids.push_back(ext_id2);
1251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(2U, manager_->GetNumActiveInputMethods());
1253a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(1, mock_ibus_client_->set_global_engine_call_count());
1254a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(ext_id1, mock_ibus_client_->latest_global_engine_name());
1255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->ChangeInputMethod(ext_id2);
1256a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(2, mock_ibus_client_->set_global_engine_call_count());
1257a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  EXPECT_EQ(ext_id2, mock_ibus_client_->latest_global_engine_name());
1258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)       MigrateOldInputMethodTest) {
1262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::vector<std::string> input_method_ids;
1263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  input_method_ids.push_back("mozc");
1264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  input_method_ids.push_back("mozc-jp");
1265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  input_method_ids.push_back("xkb:us::eng");
1266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  input_method_ids.push_back(nacl_mozc_us_id);
1267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  manager_->MigrateOldInputMethods(&input_method_ids);
1269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_EQ(4U, input_method_ids.size());
1271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(input_method_ids.end(),
1272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            std::find(input_method_ids.begin(), input_method_ids.end(),
1273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "mozc"));
1274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ(input_method_ids.end(),
1275c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            std::find(input_method_ids.begin(), input_method_ids.end(),
1276c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "mozc-jp"));
1277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(input_method_ids.end(),
1278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            std::find(input_method_ids.begin(), input_method_ids.end(),
1279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                      "xkb:us::eng"));
1280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_NE(input_method_ids.end(),
1281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            std::find(input_method_ids.begin(), input_method_ids.end(),
1282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                      nacl_mozc_us_id));
1283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
1285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1286b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1287b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       AsyncComponentExtentionInitializeBeforeIBusDaemonConnection) {
1288b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const std::string xkb_id = "xkb:cz::cze";
1289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string ime_id = nacl_mozc_us_id;
1290b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const std::string fallback_id = "xkb:us::eng";
1291b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<std::string> ids;
1292b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ids.push_back(xkb_id);
1293b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ids.push_back(ime_id);
1294b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1295b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1296b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If component extension IME is not initialized, even XKB layout cannot be
1297b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // enabled.
1298b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->ChangeInputMethod(xkb_id);
1299b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(fallback_id, manager_->GetCurrentInputMethod().id());
1300b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1301b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // After component extension IME is initialized, previous input method should
1302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // be automatically enabled.
1303b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1304b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(xkb_id, manager_->GetCurrentInputMethod().id());
1305b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1306b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // However input method should not be enabled before establishment of
1307b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // connection with ibus-daemon.
1308b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->ChangeInputMethod(ime_id);
1309b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // TODO(nona): Write expectation, GetCurrentInputMethod returns |ime_id| even
1310b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  //             the actual input method is not changed.
1311b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1312b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // After connection with ibus-daemon is established, previous specified input
1313b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // method should be enabled automatically.
1314b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1315b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(ime_id, manager_->GetCurrentInputMethod().id());
1316b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1317b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1318b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)TEST_F(InputMethodManagerImplTest,
1319b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)       AsyncComponentExtentionInitializeAfterIBusDaemonConnection) {
1320b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const std::string xkb_id = "xkb:cz::cze";
1321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const std::string ime_id = nacl_mozc_us_id;
1322b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  const std::string fallback_id = "xkb:us::eng";
1323b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<std::string> ids;
1324b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ids.push_back(xkb_id);
1325b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  ids.push_back(ime_id);
1326b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_TRUE(manager_->EnableInputMethods(ids));
1327b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1328b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // If component extension IME is not initialized, even XKB layout cannot be
1329b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // enabled.
1330b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  manager_->ChangeInputMethod(xkb_id);
1331b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(fallback_id, manager_->GetCurrentInputMethod().id());
1332b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1333b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Even after connection with ibus-daemon is established, ChangeInputMethod do
1334b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // nothing without component extension IME initialization.
1335b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitIBusBus();
1336b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(fallback_id, manager_->GetCurrentInputMethod().id());
1337b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
1338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // After component extension IME is initialized, previous specified input
1339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // method should be automatically enabled.
1340b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  InitComponentExtension();
1341b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  EXPECT_EQ(xkb_id, manager_->GetCurrentInputMethod().id());
1342b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)}
1343b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace input_method
13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
1346