1a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Copyright 2013 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)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/ime/input_method_menu_item.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ash/ime/input_method_menu_manager.h"
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind_helpers.h"
803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/strings/stringprintf.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h"
1158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "chromeos/ime/component_extension_ime_manager.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/ime/composition_text.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_descriptor.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/public/test/browser_test_utils.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/test/test_utils.h"
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/process_manager.h"
18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/manifest_handlers/background_info.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ime/chromeos/ime_bridge.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/ime/chromeos/mock_ime_candidate_window_handler.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/base/ime/chromeos/mock_ime_input_context_handler.h"
23a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/event.h"
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace chromeos {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace input_method {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace {
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kIdentityIMEID[] =
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpIdentityIME";
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)const char kToUpperIMEID[] =
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpToUpperIME";
3390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)const char kAPIArgumentIMEID[] =
3490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    "_ext_ime_iafoklpfplgfnoimmaejoeondnjnlcfpAPIArgumentIME";
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kExtensionID[] = "iafoklpfplgfnoimmaejoeondnjnlcfp";
3690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// InputMethod extension should work on 1)normal extension, 2)normal extension
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// in incognito mode 3)component extension.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)enum TestType {
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kTestTypeNormal = 0,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kTestTypeIncognito = 1,
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  kTestTypeComponent = 2,
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class InputMethodEngineBrowserTest
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : public ExtensionBrowserTest,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public ::testing::WithParamInterface<TestType> {
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  InputMethodEngineBrowserTest()
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      : ExtensionBrowserTest() {}
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~InputMethodEngineBrowserTest() {}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ExtensionBrowserTest::SetUpInProcessBrowserTestFixture();
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    extension_ = NULL;
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void LoadTestInputMethod() {
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // This will load "chrome/test/data/extensions/input_ime"
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener ime_ready_listener("ReadyToUseImeEvent",
6590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                                    false);
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    extension_ = LoadExtensionWithType("input_ime", GetParam());
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(extension_);
6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(ime_ready_listener.WaitUntilSatisfied());
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Extension IMEs are not enabled by default.
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    std::vector<std::string> extension_ime_ids;
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extension_ime_ids.push_back(kIdentityIMEID);
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extension_ime_ids.push_back(kToUpperIMEID);
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    extension_ime_ids.push_back(kAPIArgumentIMEID);
7503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    InputMethodManager::Get()->GetActiveIMEState()->SetEnabledExtensionImes(
7603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &extension_ime_ids);
7790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    InputMethodDescriptors extension_imes;
7903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    InputMethodManager::Get()->GetActiveIMEState()->GetInputMethodExtensions(
8003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        &extension_imes);
8190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
8290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Test IME has two input methods, thus InputMethodManager should have two
8390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // extension IME.
8490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Note: Even extension is loaded by LoadExtensionAsComponent as above, the
8590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // IME does not managed by ComponentExtensionIMEManager or it's id won't
8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // start with __comp__. The component extension IME is whitelisted and
8790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // managed by ComponentExtensionIMEManager, but its framework is same as
8890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // normal extension IME.
897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    EXPECT_EQ(3U, extension_imes.size());
9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
9190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const extensions::Extension* LoadExtensionWithType(
93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const std::string& extension_name, TestType type) {
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    switch (type) {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case kTestTypeNormal:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return LoadExtension(test_data_dir_.AppendASCII(extension_name));
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case kTestTypeIncognito:
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return LoadExtensionIncognito(
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            test_data_dir_.AppendASCII(extension_name));
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      case kTestTypeComponent:
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        return LoadExtensionAsComponent(
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            test_data_dir_.AppendASCII(extension_name));
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NOTREACHED();
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return NULL;
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const extensions::Extension* extension_;
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class KeyEventDoneCallback {
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit KeyEventDoneCallback(bool expected_argument)
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      : expected_argument_(expected_argument),
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        is_called_(false) {}
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~KeyEventDoneCallback() {}
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Run(bool consumed) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (consumed == expected_argument_) {
12090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::MessageLoop::current()->Quit();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_called_ = true;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void WaitUntilCalled() {
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    while (!is_called_)
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      content::RunMessageLoop();
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool expected_argument_;
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool is_called_;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(KeyEventDoneCallback);
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineBrowserTest,
138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        InputMethodEngineBrowserTest,
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        ::testing::Values(kTestTypeNormal));
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineIncognitoBrowserTest,
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        InputMethodEngineBrowserTest,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        ::testing::Values(kTestTypeIncognito));
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(InputMethodEngineComponentExtensionBrowserTest,
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                        InputMethodEngineBrowserTest,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        ::testing::Values(kTestTypeComponent));
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(InputMethodEngineBrowserTest,
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                       BasicScenarioTest) {
14990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LoadTestInputMethod();
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  InputMethodManager::Get()->GetActiveIMEState()->ChangeInputMethod(
15203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      kIdentityIMEID, false /* show_message */);
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<MockIMEInputContextHandler> mock_input_context(
15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new MockIMEInputContextHandler());
15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<MockIMECandidateWindowHandler> mock_candidate_window(
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new MockIMECandidateWindowHandler());
15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetInputContextHandler(mock_input_context.get());
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetCandidateWindowHandler(mock_candidate_window.get());
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEEngineHandlerInterface* engine_handler =
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEBridge::Get()->GetCurrentEngineHandler();
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(engine_handler);
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onActivate event should be fired if Enable function is called.
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener activated_listener("onActivate", false);
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  engine_handler->Enable("IdentityIME");
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(activated_listener.WaitUntilSatisfied());
17090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(activated_listener.was_satisfied());
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onFocus event should be fired if FocusIn function is called.
173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ExtensionTestMessageListener focus_listener("onFocus:text", false);
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT,
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  ui::TEXT_INPUT_MODE_DEFAULT);
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  engine_handler->FocusIn(context);
177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(focus_listener.was_satisfied());
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onKeyEvent should be fired if ProcessKeyEvent is called.
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  KeyEventDoneCallback callback(false);  // EchoBackIME doesn't consume keys.
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener keyevent_listener("onKeyEvent", false);
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ui::KeyEvent key_event(ui::ET_KEY_PRESSED, ui::VKEY_A, ui::EF_NONE);
184a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  engine_handler->ProcessKeyEvent(key_event,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  base::Bind(&KeyEventDoneCallback::Run,
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                             base::Unretained(&callback)));
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
18890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(keyevent_listener.was_satisfied());
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  callback.WaitUntilCalled();
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onSurroundingTextChange should be fired if SetSurroundingText is called.
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener surrounding_text_listener(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "onSurroundingTextChanged", false);
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  engine_handler->SetSurroundingText("text",  // Surrounding text.
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     0,  // focused position.
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                     1);  // anchor position.
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(surrounding_text_listener.WaitUntilSatisfied());
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(surrounding_text_listener.was_satisfied());
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onMenuItemActivated should be fired if PropertyActivate is called.
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener property_listener("onMenuItemActivated", false);
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  engine_handler->PropertyActivate("property_name");
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(property_listener.WaitUntilSatisfied());
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(property_listener.was_satisfied());
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // onReset should be fired if Reset is called.
20790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ExtensionTestMessageListener reset_listener("onReset", false);
20890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  engine_handler->Reset();
20990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(reset_listener.WaitUntilSatisfied());
21090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(reset_listener.was_satisfied());
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onBlur should be fired if FocusOut is called.
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener blur_listener("onBlur", false);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  engine_handler->FocusOut();
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(blur_listener.WaitUntilSatisfied());
21690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(blur_listener.was_satisfied());
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // onDeactivated should be fired if Disable is called.
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ExtensionTestMessageListener disabled_listener("onDeactivated", false);
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  engine_handler->Disable();
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(disabled_listener.WaitUntilSatisfied());
22290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(disabled_listener.was_satisfied());
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetInputContextHandler(NULL);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetCandidateWindowHandler(NULL);
22690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
22790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)IN_PROC_BROWSER_TEST_P(InputMethodEngineBrowserTest,
22990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       APIArgumentTest) {
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  LoadTestInputMethod();
23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
23203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  InputMethodManager::Get()->GetActiveIMEState()->ChangeInputMethod(
23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      kAPIArgumentIMEID, false /* show_message */);
23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
23558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<MockIMEInputContextHandler> mock_input_context(
23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new MockIMEInputContextHandler());
23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<MockIMECandidateWindowHandler> mock_candidate_window(
23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      new MockIMECandidateWindowHandler());
23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetInputContextHandler(mock_input_context.get());
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetCandidateWindowHandler(mock_candidate_window.get());
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEEngineHandlerInterface* engine_handler =
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEBridge::Get()->GetCurrentEngineHandler();
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  ASSERT_TRUE(engine_handler);
24690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  extensions::ExtensionHost* host =
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      extensions::ExtensionSystem::Get(profile())
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ->process_manager()
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          ->GetBackgroundHostForExtension(extension_->id());
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(host);
252eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  engine_handler->Enable("APIArgumentIME");
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT,
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                  ui::TEXT_INPUT_MODE_DEFAULT);
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  engine_handler->FocusIn(context);
25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:No");
26090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
26190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "onKeyEvent::keydown:a:KeyA:false:false:false:false";
26390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
26490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        ui::ET_KEY_PRESSED, ui::VKEY_A, "KeyA", ui::EF_NONE);
267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
26890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
26990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
27090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:No, Shift:No, Caps:No");
27690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
27790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "onKeyEvent::keydown:a:KeyA:true:false:false:false";
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
282a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_CONTROL_DOWN);
285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
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 =
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "onKeyEvent::keydown:a:KeyA:false:true:false:false";
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
299a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_ALT_DOWN);
303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
30590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
30690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
30790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
30890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
30990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
31190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:No");
31290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
31390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "onKeyEvent::keydown:A:KeyA:false:false:true:false";
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
31690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
317a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
318a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_SHIFT_DOWN);
321a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
32290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
32590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
32690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
32790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
32890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
32990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:No, Caps:Yes");
33090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
33190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "onKeyEvent::keydown:A:KeyA:false:false:false:true";
33390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_CAPS_LOCK_DOWN);
339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
34190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
34390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
34490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
34590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
34690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
34790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:Yes, alt:Yes, Shift:No, Caps:No");
34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "onKeyEvent::keydown:a:KeyA:true:true:false:false";
35190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
355a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN);
357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
36290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
36390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
36490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  {
36590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SCOPED_TRACE("KeyDown, Ctrl:No, alt:No, Shift:Yes, Caps:Yes");
36690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    KeyEventDoneCallback callback(false);
36790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    const std::string expected_value =
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        "onKeyEvent::keydown:a:KeyA:false:false:true:true";
36990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
37090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
371a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           ui::VKEY_A,
373a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                           "KeyA",
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                           ui::EF_SHIFT_DOWN | ui::EF_CAPS_LOCK_DOWN);
375a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
37690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
37790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                                               base::Unretained(&callback)));
37890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
37990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
38090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    callback.WaitUntilCalled();
38190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  }
38203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Media keys cases.
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const struct {
38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ui::KeyboardCode keycode;
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const char* code;
38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const char* key;
38703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  } kMediaKeyCases[] = {
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_BROWSER_BACK, "BrowserBack", "HistoryBack" },
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_BROWSER_FORWARD, "BrowserForward", "HistoryForward" },
39003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_BROWSER_REFRESH, "BrowserRefresh", "BrowserRefresh" },
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_MEDIA_LAUNCH_APP2, "ChromeOSFullscreen", "ChromeOSFullscreen" },
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_MEDIA_LAUNCH_APP1,
39303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      "ChromeOSSwitchWindow", "ChromeOSSwitchWindow" },
39403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_BRIGHTNESS_DOWN, "BrightnessDown", "BrightnessDown" },
39503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_BRIGHTNESS_UP, "BrightnessUp", "BrightnessUp" },
39603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_VOLUME_MUTE, "VolumeMute", "AudioVolumeMute" },
39703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_VOLUME_DOWN, "VolumeDown", "AudioVolumeDown" },
39803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_VOLUME_UP, "VolumeUp", "AudioVolumeUp" },
39903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F1, "F1", "HistoryBack" },
40003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F2, "F2", "HistoryForward" },
40103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F3, "F3", "BrowserRefresh" },
40203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F4, "F4", "ChromeOSFullscreen" },
40303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F5, "F5", "ChromeOSSwitchWindow" },
40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F6, "F6", "BrightnessDown" },
40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F7, "F7", "BrightnessUp" },
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F8, "F8", "AudioVolumeMute" },
40703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F9, "F9", "AudioVolumeDown" },
40803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    { ui::VKEY_F10, "F10", "AudioVolumeUp" },
40903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  };
41003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  for (size_t i = 0; i < arraysize(kMediaKeyCases); ++i) {
41103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    SCOPED_TRACE(std::string("KeyDown, ") + kMediaKeyCases[i].code);
41203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    KeyEventDoneCallback callback(false);
41303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const std::string expected_value =
41403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)        base::StringPrintf("onKeyEvent::keydown:%s:%s:false:false:false:false",
41503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           kMediaKeyCases[i].key, kMediaKeyCases[i].code);
41603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ExtensionTestMessageListener keyevent_listener(expected_value, false);
41703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
41803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ui::KeyEvent key_event(ui::ET_KEY_PRESSED,
41903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           kMediaKeyCases[i].keycode,
42003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           kMediaKeyCases[i].code,
42103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                           ui::EF_NONE);
42203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    engine_handler->ProcessKeyEvent(key_event,
42303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                    base::Bind(&KeyEventDoneCallback::Run,
42403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                               base::Unretained(&callback)));
42503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ASSERT_TRUE(keyevent_listener.WaitUntilSatisfied());
42603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    EXPECT_TRUE(keyevent_listener.was_satisfied());
42703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    callback.WaitUntilCalled();
42803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // TODO(nona): Add browser tests for other API as well.
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("commitText test");
43258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
43358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
43458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char commit_text_test_script[] =
436eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.commitText({"
437eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
438eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  text:'COMMIT_TEXT'"
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       commit_text_test_script));
44358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_input_context->commit_text_call_count());
44458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ("COMMIT_TEXT", mock_input_context->last_commit_text());
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SCOPED_TRACE("sendKeyEvents test");
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    mock_input_context->Reset();
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    mock_candidate_window->Reset();
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const char send_key_events_test_script[] =
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "chrome.input.ime.sendKeyEvents({"
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "  contextID: engineBridge.getFocusedContextID().contextID,"
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "  keyData : [{"
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    type : 'keydown',"
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    requestId : '0',"
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    key : 'z',"
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    code : 'KeyZ',"
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "  },{"
4605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    type : 'keyup',"
4615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    requestId : '1',"
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    key : 'z',"
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "    code : 'KeyZ',"
4645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "  }]"
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        "});";
4665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExtensionTestMessageListener keyevent_listener_down(
4685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::string("onKeyEvent:") + kExtensionID +
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ":keydown:z:KeyZ:false:false:false:false",
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        false);
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ExtensionTestMessageListener keyevent_listener_up(
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        std::string("onKeyEvent:") + kExtensionID +
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        ":keyup:z:KeyZ:false:false:false:false",
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        false);
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       send_key_events_test_script));
4785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(keyevent_listener_down.WaitUntilSatisfied());
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(keyevent_listener_down.was_satisfied());
4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ASSERT_TRUE(keyevent_listener_up.WaitUntilSatisfied());
4825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(keyevent_listener_up.was_satisfied());
4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
4845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  {
4856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    SCOPED_TRACE("sendKeyEvents test with keyCode");
4866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    mock_input_context->Reset();
4876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    mock_candidate_window->Reset();
4886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    const char send_key_events_test_script[] =
4906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "chrome.input.ime.sendKeyEvents({"
4916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "  contextID: engineBridge.getFocusedContextID().contextID,"
4926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "  keyData : [{"
4936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    type : 'keydown',"
4946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    requestId : '2',"
4956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    key : 'a',"
4966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    code : 'KeyQ',"
4976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    keyCode : 0x41,"
4986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "  },{"
4996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    type : 'keyup',"
5006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    requestId : '3',"
5016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    key : 'a',"
5026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    code : 'KeyQ',"
5036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "    keyCode : 0x41,"
5046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "  }]"
5056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        "});";
5066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ExtensionTestMessageListener keyevent_listener_down(
5086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        std::string("onKeyEvent:") + kExtensionID +
5096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ":keydown:a:KeyQ:false:false:false:false",
5106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        false);
5116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ExtensionTestMessageListener keyevent_listener_up(
5126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        std::string("onKeyEvent:") + kExtensionID +
5136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ":keyup:a:KeyQ:false:false:false:false",
5146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        false);
5156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
5176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                       send_key_events_test_script));
5186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(keyevent_listener_down.WaitUntilSatisfied());
5206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(keyevent_listener_down.was_satisfied());
5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ASSERT_TRUE(keyevent_listener_up.WaitUntilSatisfied());
5226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(keyevent_listener_up.was_satisfied());
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
5246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  {
525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setComposition test");
52658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
52758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
52858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_composition_test_script[] =
530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setComposition({"
531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  text:'COMPOSITION_TEXT',"
533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  cursor:4,"
534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  segments : [{"
535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    start: 0,"
536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    end: 5,"
537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    style: 'underline'"
538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  },{"
539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    start: 6,"
540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    end: 10,"
541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    style: 'doubleUnderline'"
542eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }]"
543eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
544eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
545eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
546eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       set_composition_test_script));
54758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_input_context->update_preedit_text_call_count());
548eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(4U,
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              mock_input_context->last_update_composition_arg().cursor_pos);
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(mock_input_context->last_update_composition_arg().is_visible);
552eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CompositionText& composition_text =
5545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_input_context->last_update_composition_arg().composition_text;
5555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("COMPOSITION_TEXT"), composition_text.text());
5565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::vector<CompositionText::UnderlineAttribute>& underlines =
5575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        composition_text.underline_attributes();
558eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
559eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(2U, underlines.size());
5605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(CompositionText::COMPOSITION_TEXT_UNDERLINE_SINGLE,
5615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              underlines[0].type);
562eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(0U, underlines[0].start_index);
563eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(5U, underlines[0].end_index);
564eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(CompositionText::COMPOSITION_TEXT_UNDERLINE_DOUBLE,
5665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              underlines[1].type);
567eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(6U, underlines[1].start_index);
568eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(10U, underlines[1].end_index);
569eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
570eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
571eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("clearComposition test");
57258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
57358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
57458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
575eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char commite_text_test_script[] =
576eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.clearComposition({"
577eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
578eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
579eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
580eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
581eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       commite_text_test_script));
58258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_input_context->update_preedit_text_call_count());
5835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_FALSE(
5845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_input_context->last_update_composition_arg().is_visible);
5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const CompositionText& composition_text =
5865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_input_context->last_update_composition_arg().composition_text;
5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(composition_text.text().empty());
588eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
589eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
590eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:visibility test");
59158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
59258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
59358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
594eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
595eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
596eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
597eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
598eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    visible: true,"
599eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
600eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
602eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
603eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
60458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
60558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
60658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
607eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
608eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
609eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:cursor_visibility test");
61058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
61158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
61258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
613eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
614eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
615eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
616eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
617eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    cursorVisible: true,"
618eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
619eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
621eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
622eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
62358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
624eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
625eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window visibility is kept as before.
62658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
62758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
628eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
63058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
631eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(table.is_cursor_visible());
632eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
633eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
634eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:vertical test");
63558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
63658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
63758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
638eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
639eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
640eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
641eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
642eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    vertical: true,"
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
644eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
645eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
646eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
647eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
64858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
650eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window visibility is kept as before.
65158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
65258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
653eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
65558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
656eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
657eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // cursor visibility is kept as before.
658eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(table.is_cursor_visible());
659eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(ui::CandidateWindow::VERTICAL, table.orientation());
661eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
662eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:pageSize test");
66458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
66558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
66658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
667eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
668eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
669eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
670eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
671eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    pageSize: 7,"
672eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
673eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
674eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
675eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
676eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
67758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
678eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
679eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window visibility is kept as before.
68058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
68158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
682eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
68458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
685eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
686eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // cursor visibility is kept as before.
687eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(table.is_cursor_visible());
688eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
689eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // oritantation is kept as before.
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(ui::CandidateWindow::VERTICAL, table.orientation());
691eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
692eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(7U, table.page_size());
693eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
694eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
695eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:auxTextVisibility test");
69658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
69758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
69858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
699eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
700eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
701eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
702eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
703eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    auxiliaryTextVisible: true"
704eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
705eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
706eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
707eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
708eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
7105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(table.is_auxiliary_text_visible());
714eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
715eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
716eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidateWindowProperties:auxText test");
71758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
71858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
71958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
720eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidate_window_properties_test_script[] =
721eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidateWindowProperties({"
722eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
723eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  properties: {"
724eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    auxiliaryText: 'AUXILIARY_TEXT'"
725eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }"
726eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
727eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
728eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(),
729eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        set_candidate_window_properties_test_script));
7305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
731eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
732eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // aux text visibility is kept as before.
7335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
7345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
7355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_TRUE(table.is_auxiliary_text_visible());
7365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ("AUXILIARY_TEXT", table.auxiliary_text());
737eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
738eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
739eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCandidates test");
74058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
74158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
74258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
743eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_candidates_test_script[] =
744eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCandidates({"
745eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
746eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  candidates: [{"
747eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    candidate: 'CANDIDATE_1',"
748eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 1,"
749eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    },{"
750eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    candidate: 'CANDIDATE_2',"
751eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 2,"
752eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL_2',"
753eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    },{"
754eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    candidate: 'CANDIDATE_3',"
755eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 3,"
756eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL_3',"
757eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    annotation: 'ANNOTACTION_3'"
758eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    },{"
759eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    candidate: 'CANDIDATE_4',"
760eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 4,"
761eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL_4',"
762eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    annotation: 'ANNOTACTION_4',"
763eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    usage: {"
764eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "      title: 'TITLE_4',"
765eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "      body: 'BODY_4'"
766eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    }"
767eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }]"
768eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
769eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(host->host_contents(),
770eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                       set_candidates_test_script));
771eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
772eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window visibility is kept as before.
77358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
77458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
775eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
77758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
778eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
779eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // cursor visibility is kept as before.
780eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(table.is_cursor_visible());
781eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
782eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // oritantation is kept as before.
7835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(ui::CandidateWindow::VERTICAL, table.orientation());
784eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
785eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // page size is kept as before.
786eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(7U, table.page_size());
787eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
788eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(4U, table.candidates().size());
789eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("CANDIDATE_1"),
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(0).value);
7925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("CANDIDATE_2"),
7945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(1).value);
7955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("LABEL_2"), table.candidates().at(1).label);
7965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("CANDIDATE_3"),
7985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(2).value);
7995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("LABEL_3"), table.candidates().at(2).label);
8005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("ANNOTACTION_3"),
8015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(2).annotation);
8025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
8035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("CANDIDATE_4"),
8045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(3).value);
8055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("LABEL_4"), table.candidates().at(3).label);
8065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("ANNOTACTION_4"),
8075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(3).annotation);
8085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("TITLE_4"),
8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(3).description_title);
8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("BODY_4"),
8115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              table.candidates().at(3).description_body);
812eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
813eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
814eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setCursorPosition test");
81558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
81658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
81758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
818eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_cursor_position_test_script[] =
819eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setCursorPosition({"
820eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
821eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  candidateID: 2"
822eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
823eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
824eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(), set_cursor_position_test_script));
82558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_candidate_window->update_lookup_table_call_count());
826eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
827eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // window visibility is kept as before.
82858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_TRUE(
82958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().is_visible);
830eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const ui::CandidateWindow& table =
83258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)        mock_candidate_window->last_update_lookup_table_arg().lookup_table;
833eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
834eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // cursor visibility is kept as before.
835eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_TRUE(table.is_cursor_visible());
836eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
837eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // oritantation is kept as before.
8385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(ui::CandidateWindow::VERTICAL, table.orientation());
839eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
840eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // page size is kept as before.
841eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(7U, table.page_size());
842eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
843eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // candidates are same as before.
844eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(4U, table.candidates().size());
845eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
846eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Candidate ID == 2 is 1 in index.
847eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    EXPECT_EQ(1U, table.cursor_position());
848eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
849eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
850eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("setMenuItem test");
85158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
85258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
85358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
854eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char set_menu_item_test_script[] =
855eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.setMenuItems({"
856eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
857eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  items: [{"
858eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 'ID0',"
859eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  },{"
860eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 'ID1',"
861eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL1',"
862eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  },{"
863eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 'ID2',"
864eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL2',"
865eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    style: 'radio',"
866eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  },{"
867eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 'ID3',"
868eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL3',"
869eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    style: 'check',"
870eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    visible: true,"
871eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  },{"
872eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    id: 'ID4',"
873eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    label: 'LABEL4',"
874eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    style: 'separator',"
875eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    visible: true,"
876eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "    checked: true"
877eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  }]"
878eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
879eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
880eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(), set_menu_item_test_script));
881eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
882a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const ash::ime::InputMethodMenuItemList& props =
883a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        ash::ime::InputMethodMenuManager::GetInstance()->
884a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)        GetCurrentInputMethodMenuItemList();
885eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_EQ(5U, props.size());
886eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
88768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("ID0", props[0].key);
88868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("ID1", props[1].key);
88968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("ID2", props[2].key);
89068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("ID3", props[3].key);
89168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("ID4", props[4].key);
892eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("LABEL1", props[1].label);
89468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("LABEL2", props[2].label);
89568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("LABEL3", props[3].label);
89668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_EQ("LABEL4", props[4].label);
897eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
89868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(props[2].is_selection_item);
89968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // TODO(nona): Add tests for style: ["toggle" and "separator"]
90068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // and visible:, when implement them.
901eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    EXPECT_TRUE(props[4].is_selection_item_checked);
903eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
904eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  {
905eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    SCOPED_TRACE("deleteSurroundingText test");
90658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_input_context->Reset();
90758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    mock_candidate_window->Reset();
90858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const char delete_surrounding_text_test_script[] =
910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "chrome.input.ime.deleteSurroundingText({"
911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  engineID: engineBridge.getActiveEngineID(),"
912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  contextID: engineBridge.getFocusedContextID().contextID,"
913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  offset: 5,"
914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "  length: 3"
915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        "});";
916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ASSERT_TRUE(content::ExecuteScript(
917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        host->host_contents(), delete_surrounding_text_test_script));
918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
91958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(1, mock_input_context->delete_surrounding_text_call_count());
92058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(5, mock_input_context->last_delete_surrounding_text_arg().offset);
92158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(3U,
92258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)              mock_input_context->last_delete_surrounding_text_arg().length);
923eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  {
925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    SCOPED_TRACE("onFocus test");
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    mock_input_context->Reset();
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    mock_candidate_window->Reset();
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:text", false);
9315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_TEXT, ui::TEXT_INPUT_MODE_DEFAULT);
933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:search", false);
9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_SEARCH, ui::TEXT_INPUT_MODE_DEFAULT);
941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:tel", false);
9475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_TELEPHONE, ui::TEXT_INPUT_MODE_DEFAULT);
949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:url", false);
9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_URL, ui::TEXT_INPUT_MODE_DEFAULT);
957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:email", false);
9635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_EMAIL, ui::TEXT_INPUT_MODE_DEFAULT);
965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
968f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
969f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    {
970f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ExtensionTestMessageListener focus_listener("onFocus:number", false);
9715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      IMEEngineHandlerInterface::InputContext context(
972f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)          ui::TEXT_INPUT_TYPE_NUMBER, ui::TEXT_INPUT_MODE_DEFAULT);
973f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      engine_handler->FocusIn(context);
974f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.WaitUntilSatisfied());
975f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      ASSERT_TRUE(focus_listener.was_satisfied());
976f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
977f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
978f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetInputContextHandler(NULL);
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  IMEBridge::Get()->SetCandidateWindowHandler(NULL);
981c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
982c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
983c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace
984c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace input_method
985c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace chromeos
986