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