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