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