15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_ime_input_event.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_errors.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_input_event.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/input_event.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_utils.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(ImeInputEvent);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)// Japanese Kanji letters
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kCompositionChar[] = {
20424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "\xE6\x96\x87",  // An example character of normal unicode.
21424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "\xF0\xA0\xAE\x9F", // An example character of surrogate pair.
22424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)    "\xF0\x9F\x98\x81"  // An example character of surrogate pair(emoji).
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)const char kCompositionText[] = "\xE6\x96\x87\xF0\xA0\xAE\x9F\xF0\x9F\x98\x81";
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FINISHED_WAITING_MESSAGE "TEST_IME_INPUT_EVENT_FINISHED_WAITING"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestImeInputEvent::TestImeInputEvent(TestingInstance* instance)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestCase(instance),
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_event_interface_(NULL),
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_input_event_interface_(NULL),
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ime_input_event_interface_(NULL),
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      received_unexpected_event_(true),
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      received_finish_message_(false) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestImeInputEvent::~TestImeInputEvent() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the special listener that only responds to a
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FINISHED_WAITING_MESSAGE string. See Init for where it gets added.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string js_code;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_code = "var plugin = document.getElementById('plugin');"
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "plugin.removeEventListener('message',"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "                           plugin.wait_for_messages_handler);"
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "delete plugin.wait_for_messages_handler;";
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(js_code);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestImeInputEvent::RunTests(const std::string& filter) {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(ImeCommit, filter);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(ImeCancel, filter);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(ImeUnawareCommit, filter);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(ImeUnawareCancel, filter);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestImeInputEvent::Init() {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_ = static_cast<const PPB_InputEvent*>(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_INPUT_EVENT_INTERFACE));
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyboard_input_event_interface_ =
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<const PPB_KeyboardInputEvent*>(
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::Module::Get()->GetBrowserInterface(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PPB_KEYBOARD_INPUT_EVENT_INTERFACE));
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ime_input_event_interface_ = static_cast<const PPB_IMEInputEvent*>(
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)          PPB_IME_INPUT_EVENT_INTERFACE));
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success =
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_event_interface_ &&
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_input_event_interface_ &&
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ime_input_event_interface_ &&
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckTestingInterface();
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a listener for our message that signals that all input events have
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been received.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note the following code is dependent on some features of test_case.html.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // E.g., it is assumed that the DOM element where the plugin is embedded has
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an id of 'plugin', and there is a function 'IsTestingMessage' that allows
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // us to ignore the messages that are intended for use by the testing
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // framework itself.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string js_code =
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "var plugin = document.getElementById('plugin');"
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "var wait_for_messages_handler = function(message_event) {"
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  if (!IsTestingMessage(message_event.data) &&"
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "      message_event.data === '" FINISHED_WAITING_MESSAGE "') {"
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "    plugin.postMessage('" FINISHED_WAITING_MESSAGE "');"
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  }"
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "};"
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "plugin.addEventListener('message', wait_for_messages_handler);"
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Stash it on the plugin so we can remove it in the destructor.
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "plugin.wait_for_messages_handler = wait_for_messages_handler;";
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(js_code);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return success;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestImeInputEvent::HandleInputEvent(const pp::InputEvent& input_event) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check whether the IME related events comes in the expected order.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (input_event.GetType()) {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_TEXT:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_CHAR:
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (expected_events_.empty()) {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        received_unexpected_event_ = true;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      } else {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        received_unexpected_event_ =
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !AreEquivalentEvents(input_event.pp_resource(),
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               expected_events_.front().pp_resource());
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_events_.erase(expected_events_.begin());
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Don't care for any other input event types for this test.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle all input events.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestImeInputEvent::HandleMessage(const pp::Var& message_data) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_data.is_string() &&
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (message_data.AsString() == FINISHED_WAITING_MESSAGE)) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing_interface_->QuitMessageLoop(instance_->pp_instance());
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_finish_message_ = true;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestImeInputEvent::DidChangeView(const pp::View& view) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_rect_ = view.GetRect();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestImeInputEvent::CreateImeCompositionStartEvent() {
138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return pp::IMEInputEvent(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_IME_COMPOSITION_START,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100, // time_stamp
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Var(""),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<uint32_t>(),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      -1, // target_segment
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(0U, 0U) // selection
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestImeInputEvent::CreateImeCompositionUpdateEvent(
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& text,
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::vector<uint32_t>& segments,
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int32_t target_segment,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::pair<uint32_t, uint32_t>& selection) {
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return pp::IMEInputEvent(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100, // time_stamp
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      text,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      segments,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_segment,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      selection
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestImeInputEvent::CreateImeCompositionEndEvent(
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& text) {
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return pp::IMEInputEvent(
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_IME_COMPOSITION_END,
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100, // time_stamp
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Var(text),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<uint32_t>(),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      -1, // target_segment
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(0U, 0U) // selection
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestImeInputEvent::CreateImeTextEvent(const std::string& text) {
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return pp::IMEInputEvent(
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_IME_TEXT,
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100, // time_stamp
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Var(text),
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<uint32_t>(),
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      -1, // target_segment
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(0U, 0U) // selection
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  );
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestImeInputEvent::CreateCharEvent(const std::string& text) {
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::KeyboardInputEvent(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_CHAR,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // keycode
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Var(text));
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestImeInputEvent::GetFocusBySimulatingMouseClick() {
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For receiving IME events, the plugin DOM node needs to be focused.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following code is for achieving that by simulating a mouse click event.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateInputEvent(pp::MouseInputEvent(
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_MOUSEDOWN,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_MOUSEBUTTON_LEFT,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Point(
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          view_rect_.x() + view_rect_.width() / 2,
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          view_rect_.y() + view_rect_.height() / 2),
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,  // click count
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Point()));  // movement
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates the input event and calls PostMessage to let us know when
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we have received all resulting events from the browser.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestImeInputEvent::SimulateInputEvent(const pp::InputEvent& input_event) {
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_unexpected_event_ = false;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_finish_message_ = false;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing_interface_->SimulateInputEvent(instance_->pp_instance(),
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         input_event.pp_resource());
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->PostMessage(pp::Var(FINISHED_WAITING_MESSAGE));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing_interface_->RunMessageLoop(instance_->pp_instance());
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return received_finish_message_ && !received_unexpected_event_;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestImeInputEvent::AreEquivalentEvents(PP_Resource received,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            PP_Resource expected) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input_event_interface_->IsInputEvent(received) ||
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !input_event_interface_->IsInputEvent(expected)) {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test common fields, except modifiers and time stamp, which may be changed
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by the browser.
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t received_type = input_event_interface_->GetType(received);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t expected_type = input_event_interface_->GetType(expected);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (received_type != expected_type)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test event type-specific fields.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (received_type) {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_START:
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // COMPOSITION_START does not convey further information.
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_END:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_TEXT:
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For COMPOSITION_END and TEXT, GetText() has meaning.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return pp::Var(pp::PASS_REF,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ime_input_event_interface_->GetText(received)) ==
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             pp::Var(pp::PASS_REF,
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ime_input_event_interface_->GetText(expected));
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE:
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // For COMPOSITION_UPDATE, all fields must be checked.
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t received_segment_number =
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ime_input_event_interface_->GetSegmentNumber(received);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t expected_segment_number =
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            ime_input_event_interface_->GetSegmentNumber(expected);
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (received_segment_number != expected_segment_number)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // The "<=" is not a bug. i-th segment is represented as the pair of
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        // i-th and (i+1)-th offsets in Pepper IME API.
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        for (uint32_t i = 0; i <= received_segment_number; ++i) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          if (ime_input_event_interface_->GetSegmentOffset(received, i) !=
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              ime_input_event_interface_->GetSegmentOffset(expected, i))
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            return false;
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t received_selection_start = 0;
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t received_selection_end = 0;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t expected_selection_start = 0;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        uint32_t expected_selection_end = 0;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ime_input_event_interface_->GetSelection(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            received, &received_selection_start, &received_selection_end);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        ime_input_event_interface_->GetSelection(
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            expected, &expected_selection_start, &expected_selection_end);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (received_selection_start != expected_selection_start ||
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            received_selection_end != expected_selection_end) {
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return true;
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return pp::Var(pp::PASS_REF,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ime_input_event_interface_->GetText(received)) ==
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               pp::Var(pp::PASS_REF,
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       ime_input_event_interface_->GetText(expected)) &&
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ime_input_event_interface_->GetTargetSegment(received) ==
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ime_input_event_interface_->GetTargetSegment(expected);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_CHAR:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(received) ==
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(expected) &&
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::Var(pp::PASS_REF,
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              keyboard_input_event_interface_->GetCharacterText(received)) ==
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::Var(pp::PASS_REF,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              keyboard_input_event_interface_->GetCharacterText(expected));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestImeInputEvent::TestImeCommit() {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFocusBySimulatingMouseClick();
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD |
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_IME);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint32_t> segments;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(0U);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(3U);
322424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(7U);
323424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(11U);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent update_event = CreateImeCompositionUpdateEvent(
325424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kCompositionText, segments, 1, std::make_pair(3U, 7U));
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.clear();
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateImeCompositionStartEvent());
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(update_event);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateImeCompositionEndEvent(kCompositionText));
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateImeTextEvent(kCompositionText));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the case when IME successfully committed some text.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(update_event));
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateImeTextEvent(kCompositionText)));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(expected_events_.empty());
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestImeInputEvent::TestImeCancel() {
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFocusBySimulatingMouseClick();
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD |
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_IME);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint32_t> segments;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(0U);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(3U);
351424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(7U);
352424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(11U);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent update_event = CreateImeCompositionUpdateEvent(
354424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kCompositionText, segments, 1, std::make_pair(3U, 7U));
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.clear();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateImeCompositionStartEvent());
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(update_event);
359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  expected_events_.push_back(CreateImeCompositionEndEvent(std::string()));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the case when IME canceled composition.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(update_event));
363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateImeCompositionEndEvent(std::string())));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(expected_events_.empty());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestImeInputEvent::TestImeUnawareCommit() {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFocusBySimulatingMouseClick();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->ClearInputEventRequest(instance_->pp_instance(),
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 PP_INPUTEVENT_CLASS_IME);
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint32_t> segments;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(0U);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(3U);
380424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(7U);
381424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(11U);
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent update_event = CreateImeCompositionUpdateEvent(
383424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kCompositionText, segments, 1, std::make_pair(3U, 7U));
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.clear();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateCharEvent(kCompositionChar[0]));
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateCharEvent(kCompositionChar[1]));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.push_back(CreateCharEvent(kCompositionChar[2]));
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test for IME-unaware plugins. Commit event is translated to char events.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(update_event));
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateImeTextEvent(kCompositionText)));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(expected_events_.empty());
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestImeInputEvent::TestImeUnawareCancel() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetFocusBySimulatingMouseClick();
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->ClearInputEventRequest(instance_->pp_instance(),
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 PP_INPUTEVENT_CLASS_IME);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<uint32_t> segments;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(0U);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  segments.push_back(3U);
410424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(7U);
411424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)  segments.push_back(11U);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::InputEvent update_event = CreateImeCompositionUpdateEvent(
413424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)      kCompositionText, segments, 1, std::make_pair(3U, 7U));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_events_.clear();
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test for IME-unaware plugins. Cancel won't issue any events.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(update_event));
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateImeCompositionEndEvent(std::string())));
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(expected_events_.empty());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425