1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind_helpers.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_message_listener.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/common/extensions/background_info.h" 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/dbus_thread_manager.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/ibus/mock_ibus_client.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/ibus/mock_ibus_engine_factory_service.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/dbus/ibus/mock_ibus_engine_service.h" 13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_descriptor.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/browser_test_utils.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h" 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "dbus/mock_bus.h" 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace input_method { 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kIdentityIMEID[] = 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME"; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kToUpperIMEID[] = 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME"; 2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAPIArgumentIMEID[] = 2990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME"; 3090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 3190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const uint32 kAltKeyMask = 1 << 3; 3290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const uint32 kCtrlKeyMask = 1 << 2; 3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const uint32 kShiftKeyMask = 1 << 0; 3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const uint32 kCapsLockMask = 1 << 1; 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// InputMethod extension should work on 1)normal extension, 2)normal extension 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// in incognito mode 3)component extension. 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TestType { 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kTestTypeNormal = 0, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kTestTypeIncognito = 1, 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kTestTypeComponent = 2, 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void OnRegisterComponent(const IBusComponent& ibus_component, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IBusClient::RegisterComponentCallback& callback, 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const IBusClient::ErrorCallback& error_callback) { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.Run(); 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class InputMethodEngineIBusBrowserTest 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : public ExtensionBrowserTest, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public ::testing::WithParamInterface<TestType> { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodEngineIBusBrowserTest() 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : ExtensionBrowserTest(), 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_dbus_thread_manager_(NULL) {} 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~InputMethodEngineIBusBrowserTest() {} 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 60b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) mock_dbus_thread_manager_ = new MockDBusThreadManagerWithoutGMock(); 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager_); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionBrowserTest::SetUpInProcessBrowserTestFixture(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DBusThreadManager::Shutdown(); 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extension_ = NULL; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) void LoadTestInputMethod() { 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MockIBusClient* ibus_client = mock_dbus_thread_manager_->mock_ibus_client(); 7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ibus_client->set_register_component_handler( 7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&OnRegisterComponent)); 7590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 7690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // This will load "chrome/test/data/extensions/input_ime" 7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener ime_ready_listener("ReadyToUseImeEvent", 7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) false); 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extension_ = LoadExtensionWithType("input_ime", GetParam()); 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(extension_); 8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(ime_ready_listener.WaitUntilSatisfied()); 8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // The reason why not EXPECT_EQ is that extension will be reloaded in the 8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // case of incognito mode switching. Thus registeration will be happend 8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // multiple times. Calling at least once per engine is sufficient for IBus 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // component. Here, there is two engine, thus expectation is at least 4 8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // times. 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_LE(3, ibus_client->register_component_call_count()); 8990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Extension IMEs are not enabled by default. 9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) std::vector<std::string> extension_ime_ids; 9290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_ime_ids.push_back(kIdentityIMEID); 9390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_ime_ids.push_back(kToUpperIMEID); 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) extension_ime_ids.push_back(kAPIArgumentIMEID); 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMethodManager::Get()->SetEnabledExtensionImes(&extension_ime_ids); 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 9790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMethodDescriptors extension_imes; 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) InputMethodManager::Get()->GetInputMethodExtensions(&extension_imes); 9990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 10090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Test IME has two input methods, thus InputMethodManager should have two 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // extension IME. 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // Note: Even extension is loaded by LoadExtensionAsComponent as above, the 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // IME does not managed by ComponentExtensionIMEManager or it's id won't 10490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // start with __comp__. The component extension IME is whitelisted and 10590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // managed by ComponentExtensionIMEManager, but its framework is same as 10690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // normal extension IME. 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_EQ(3U, extension_imes.size()); 10890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const extensions::Extension* LoadExtensionWithType( 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::string& extension_name, TestType type) { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) switch (type) { 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kTestTypeNormal: 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LoadExtension(test_data_dir_.AppendASCII(extension_name)); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kTestTypeIncognito: 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LoadExtensionIncognito( 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_data_dir_.AppendASCII(extension_name)); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) case kTestTypeComponent: 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return LoadExtensionAsComponent( 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) test_data_dir_.AppendASCII(extension_name)); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NOTREACHED(); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return NULL; 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const extensions::Extension* extension_; 127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager_; 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<dbus::MockBus> mock_bus_; 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class KeyEventDoneCallback { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) explicit KeyEventDoneCallback(bool expected_argument) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : expected_argument_(expected_argument), 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_called_(false) {} 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ~KeyEventDoneCallback() {} 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void Run(bool consumed) { 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (consumed == expected_argument_) { 14090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) is_called_ = true; 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void WaitUntilCalled() { 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) while (!is_called_) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::RunMessageLoop(); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool expected_argument_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_called_; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KeyEventDoneCallback); 155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineIBusBrowserTest, 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodEngineIBusBrowserTest, 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::testing::Values(kTestTypeNormal)); 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineIBusIncognitoBrowserTest, 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodEngineIBusBrowserTest, 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::testing::Values(kTestTypeIncognito)); 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineIBusComponentExtensionBrowserTest, 164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodEngineIBusBrowserTest, 165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ::testing::Values(kTestTypeComponent)); 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BasicScenarioTest) { 16990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTestInputMethod(); 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIBusEngineFactoryService* factory_service = 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_dbus_thread_manager_->mock_ibus_engine_factory_service(); 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) factory_service->CallCreateEngine(kIdentityIMEID); 174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MockIBusEngineService* engine_service = 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) mock_dbus_thread_manager_->mock_ibus_engine_service(); 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) IBusEngineHandlerInterface* engine_handler = engine_service->GetEngine(); 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(engine_handler); 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onActivate event should be fired if Enable function is called. 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener activated_listener("onActivate", false); 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->Enable(); 183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(activated_listener.WaitUntilSatisfied()); 18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(activated_listener.was_satisfied()); 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onFocus event should be fired if FocusIn function is called. 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener focus_listener("onFocus", false);; 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->FocusIn(); 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(focus_listener.WaitUntilSatisfied()); 19090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(focus_listener.was_satisfied()); 191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onKeyEvent should be fired if ProcessKeyEvent is called. 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) KeyEventDoneCallback callback(false); // EchoBackIME doesn't consume keys. 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener("onKeyEvent", false); 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0x26, // KeyCode for 'a'. 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // No modifiers. 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::Unretained(&callback))); 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.was_satisfied()); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback.WaitUntilCalled(); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onSurroundingTextChange should be fired if SetSurroundingText is called. 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener surrounding_text_listener( 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "onSurroundingTextChanged", false); 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->SetSurroundingText("text", // Surrounding text. 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 0, // focused position. 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1); // anchor position. 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(surrounding_text_listener.WaitUntilSatisfied()); 21190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(surrounding_text_listener.was_satisfied()); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onMenuItemActivated should be fired if PropertyActivate is called. 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener property_listener("onMenuItemActivated", false); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->PropertyActivate("property_name", 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ibus::IBUS_PROPERTY_STATE_CHECKED); 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(property_listener.WaitUntilSatisfied()); 21890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(property_listener.was_satisfied()); 21990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 22090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // onReset should be fired if Reset is called. 22190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener reset_listener("onReset", false); 22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->Reset(); 22390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(reset_listener.WaitUntilSatisfied()); 22490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(reset_listener.was_satisfied()); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onBlur should be fired if FocusOut is called. 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener blur_listener("onBlur", false); 228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->FocusOut(); 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(blur_listener.WaitUntilSatisfied()); 23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(blur_listener.was_satisfied()); 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // onDeactivated should be fired if Disable is called. 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExtensionTestMessageListener disabled_listener("onDeactivated", false); 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) engine_handler->Disable(); 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(disabled_listener.WaitUntilSatisfied()); 23690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(disabled_listener.was_satisfied()); 23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 23890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)IN_PROC_BROWSER_TEST_P(InputMethodEngineIBusBrowserTest, 24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) APIArgumentTest) { 24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) LoadTestInputMethod(); 24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MockIBusEngineFactoryService* factory_service = 24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mock_dbus_thread_manager_->mock_ibus_engine_factory_service(); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) factory_service->CallCreateEngine(kAPIArgumentIMEID); 24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 24790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) MockIBusEngineService* engine_service = 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) mock_dbus_thread_manager_->mock_ibus_engine_service(); 24990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) IBusEngineHandlerInterface* engine_handler = engine_service->GetEngine(); 25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(engine_handler); 25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extensions::ExtensionHost* host = FindHostWithPath( 253eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extensions::ExtensionSystem::Get(profile())->process_manager(), 254eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch extensions::BackgroundInfo::GetBackgroundURL(extension_).path(), 255eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 1); 256eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->Enable(); 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->FocusIn(); 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No"); 26290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:false:false:false:false"; 26590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 26690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 26790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0, // No modifiers. 27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:No, Shift:No, Caps:No"); 27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:true:false:false:false"; 28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 28390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kCtrlKeyMask, 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:No, alt:Yes, Shift:No, Caps:No"); 29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:false:true:false:false"; 29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kAltKeyMask, 30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:No"); 31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:false:false:true:false"; 31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 31790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kShiftKeyMask, 31890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 31990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 32090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 32190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:Yes"); 32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:false:false:false:true"; 32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 33290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kCapsLockMask, 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 33590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:Yes, Shift:No, Caps:No"); 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:true:true:false:false"; 34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kAltKeyMask | kCtrlKeyMask, 35090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 35390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 35490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 35590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) { 35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:Yes"); 35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) KeyEventDoneCallback callback(false); 35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const std::string expected_value = 36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) "onKeyEvent:keydown:a:KeyA:false:false:true:true"; 36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ExtensionTestMessageListener keyevent_listener(expected_value, false); 36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) engine_handler->ProcessKeyEvent(0x61, // KeySym for 'a'. 36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 0x26, // KeyCode for 'a'. 36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) kShiftKeyMask | kCapsLockMask, 36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Bind(&KeyEventDoneCallback::Run, 36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::Unretained(&callback))); 36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied()); 36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(keyevent_listener.was_satisfied()); 37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) callback.WaitUntilCalled(); 37190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) } 37290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // TODO(nona): Add browser tests for other API as well. 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("commitText test"); 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char commit_text_test_script[] = 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.commitText({" 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " text:'COMMIT_TEXT'" 379eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 380eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 382eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript(host->host_contents(), 383eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch commit_text_test_script)); 384eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->commit_text_call_count()); 385eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("COMMIT_TEXT", engine_service->last_commit_text()); 386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setComposition test"); 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_composition_test_script[] = 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setComposition({" 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " text:'COMPOSITION_TEXT'," 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " cursor:4," 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " segments : [{" 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " start: 0," 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " end: 5," 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " style: 'underline'" 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " start: 6," 400eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " end: 10," 401eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " style: 'doubleUnderline'" 402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }]" 403eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 404eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript(host->host_contents(), 407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_composition_test_script)); 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_preedit_call_count()); 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(4U, engine_service->last_update_preedit_arg().cursor_pos); 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_preedit_arg().is_visible); 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusText& ibus_text = 414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_preedit_arg().ibus_text; 415eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("COMPOSITION_TEXT", ibus_text.text()); 416eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<IBusText::UnderlineAttribute>& underlines = 417eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ibus_text.underline_attributes(); 418eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(2U, underlines.size()); 420eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusText::IBUS_TEXT_UNDERLINE_SINGLE, underlines[0].type); 421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(0U, underlines[0].start_index); 422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(5U, underlines[0].end_index); 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusText::IBUS_TEXT_UNDERLINE_DOUBLE, underlines[1].type); 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(6U, underlines[1].start_index); 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(10U, underlines[1].end_index); 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("clearComposition test"); 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char commite_text_test_script[] = 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.clearComposition({" 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript(host->host_contents(), 437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch commite_text_test_script)); 438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_preedit_call_count()); 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(engine_service->last_update_preedit_arg().is_visible); 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusText& ibus_text = 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_preedit_arg().ibus_text; 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(ibus_text.text().empty()); 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:visibility test"); 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " visible: true," 451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 452eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 453eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 454eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 455eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 456eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 457eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_lookup_table_call_count()); 458eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 459eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 460eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 461eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:cursor_visibility test"); 462eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 463eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " cursorVisible: true," 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 470eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_lookup_table_call_count()); 474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // window visibility is kept as before. 476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusLookupTable& table = 479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_lookup_table_arg().lookup_table; 480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(table.is_cursor_visible()); 481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:vertical test"); 484eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 485eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 486eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 487eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 488eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " vertical: true," 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_lookup_table_call_count()); 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // window visibility is kept as before. 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusLookupTable& table = 501eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_lookup_table_arg().lookup_table; 502eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 503eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cursor visibility is kept as before. 504eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(table.is_cursor_visible()); 505eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 506eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusLookupTable::VERTICAL, table.orientation()); 507eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 508eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 509eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:pageSize test"); 510eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 511eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 512eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 513eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 514eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " pageSize: 7," 515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 516eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 517eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 518eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 521eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_lookup_table_call_count()); 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // window visibility is kept as before. 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusLookupTable& table = 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_lookup_table_arg().lookup_table; 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cursor visibility is kept as before. 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(table.is_cursor_visible()); 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // oritantation is kept as before. 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusLookupTable::VERTICAL, table.orientation()); 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(7U, table.page_size()); 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:auxTextVisibility test"); 539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " auxiliaryTextVisible: true" 544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 547eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 549eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 550eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_auxiliary_text_call_count()); 551eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_aux_text_arg().is_visible); 552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 553eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 554eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidateWindowProperties:auxText test"); 555eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidate_window_properties_test_script[] = 556eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidateWindowProperties({" 557eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " properties: {" 559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " auxiliaryText: 'AUXILIARY_TEXT'" 560eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 561eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), 565eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidate_window_properties_test_script)); 566eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_auxiliary_text_call_count()); 567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // aux text visibility is kept as before. 569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_aux_text_arg().is_visible); 570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("AUXILIARY_TEXT", 572eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_aux_text_arg().ibus_text.text()); 573eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 574eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCandidates test"); 576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_candidates_test_script[] = 577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCandidates({" 578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidates: [{" 580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidate: 'CANDIDATE_1'," 581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 1," 582eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 583eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidate: 'CANDIDATE_2'," 584eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 2," 585eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL_2'," 586eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 587eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidate: 'CANDIDATE_3'," 588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 3," 589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL_3'," 590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " annotation: 'ANNOTACTION_3'" 591eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 592eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidate: 'CANDIDATE_4'," 593eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 4," 594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL_4'," 595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " annotation: 'ANNOTACTION_4'," 596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " usage: {" 597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " title: 'TITLE_4'," 598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " body: 'BODY_4'" 599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }" 600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }]" 601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript(host->host_contents(), 604eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch set_candidates_test_script)); 605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // window visibility is kept as before. 607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusLookupTable& table = 610eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_lookup_table_arg().lookup_table; 611eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 612eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cursor visibility is kept as before. 613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(table.is_cursor_visible()); 614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // oritantation is kept as before. 616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusLookupTable::VERTICAL, table.orientation()); 617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // page size is kept as before. 619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(7U, table.page_size()); 620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(4U, table.candidates().size()); 622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 623eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("CANDIDATE_1", table.candidates().at(0).value); 624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("CANDIDATE_2", table.candidates().at(1).value); 626eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL_2", table.candidates().at(1).label); 627eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("CANDIDATE_3", table.candidates().at(2).value); 629eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL_3", table.candidates().at(2).label); 630eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ANNOTACTION_3", table.candidates().at(2).annotation); 631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("CANDIDATE_4", table.candidates().at(3).value); 633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL_4", table.candidates().at(3).label); 634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ANNOTACTION_4", table.candidates().at(3).annotation); 635eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("TITLE_4", table.candidates().at(3).description_title); 636eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("BODY_4", table.candidates().at(3).description_body); 637eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setCursorPosition test"); 640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_cursor_position_test_script[] = 641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setCursorPosition({" 642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " candidateID: 2" 644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), set_cursor_position_test_script)); 648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->update_lookup_table_call_count()); 649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // window visibility is kept as before. 651eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(engine_service->last_update_lookup_table_arg().is_visible); 652eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusLookupTable& table = 654eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_update_lookup_table_arg().lookup_table; 655eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // cursor visibility is kept as before. 657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(table.is_cursor_visible()); 658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // oritantation is kept as before. 660eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusLookupTable::VERTICAL, table.orientation()); 661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // page size is kept as before. 663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(7U, table.page_size()); 664eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 665eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // candidates are same as before. 666eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(4U, table.candidates().size()); 667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Candidate ID == 2 is 1 in index. 669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1U, table.cursor_position()); 670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("setMenuItem test"); 673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char set_menu_item_test_script[] = 674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.setMenuItems({" 675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " items: [{" 677eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 'ID0'," 678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 'ID1'," 680eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL1'," 681eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 'ID2'," 683eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL2'," 684eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " style: 'radio'," 685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 'ID3'," 687eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL3'," 688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " style: 'check'," 689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " visible: true," 690eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " },{" 691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " id: 'ID4'," 692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " label: 'LABEL4'," 693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " style: 'separator'," 694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " visible: true," 695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " checked: true" 696eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " }]" 697eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 698eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), set_menu_item_test_script)); 701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->register_properties_call_count()); 702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const IBusPropertyList& props = 704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->last_registered_properties(); 705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_EQ(5U, props.size()); 706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ID0", props[0]->key()); 708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ID1", props[1]->key()); 709eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ID2", props[2]->key()); 710eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ID3", props[3]->key()); 711eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("ID4", props[4]->key()); 712eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 713eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL1", props[1]->label()); 714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL2", props[2]->label()); 715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL3", props[3]->label()); 716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ("LABEL4", props[4]->label()); 717eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 718eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusProperty::IBUS_PROPERTY_TYPE_RADIO, props[2]->type()); 719eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusProperty::IBUS_PROPERTY_TYPE_TOGGLE, props[3]->type()); 720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(IBusProperty::IBUS_PROPERTY_TYPE_SEPARATOR, props[4]->type()); 721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(props[3]->visible()); 723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(props[4]->visible()); 724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(props[4]->checked()); 726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch { 728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch SCOPED_TRACE("deleteSurroundingText test"); 729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char delete_surrounding_text_test_script[] = 730eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "chrome.input.ime.deleteSurroundingText({" 731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " engineID: engineBridge.getActiveEngineID()," 732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " contextID: engineBridge.getFocusedContextID().contextID," 733eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " offset: 5," 734eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch " length: 3" 735eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch "});"; 736eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch engine_service->Clear(); 737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ASSERT_TRUE(content::ExecuteScript( 738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch host->host_contents(), delete_surrounding_text_test_script)); 739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 740eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(1, engine_service->delete_surrounding_text_call_count()); 741eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(5, engine_service->last_delete_surrounding_text_arg().offset); 742eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(3U, engine_service->last_delete_surrounding_text_arg().length); 743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace input_method 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace chromeos 749