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