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