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_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(InputEvent);
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const uint32_t kSpaceChar = 0x20;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kSpaceString = " ";
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char* kSpaceCode = "Space";
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define FINISHED_WAITING_MESSAGE "TEST_INPUT_EVENT_FINISHED_WAITING"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::Point GetCenter(const pp::Rect& rect) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::Point(
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rect.x() + rect.width() / 2,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rect.y() + rect.height() / 2);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestInputEvent::RunTests(const std::string& filter) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RUN_TEST(Events, filter);
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  RUN_TEST(EventsLatencyTracking, filter);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The AcceptTouchEvent_N tests should not be run when the filter is empty;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // they can only be run one at a time.
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(dmichael): Figure out a way to make these run in the same test fixture
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //                 instance.
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!ShouldRunAllTests(filter)) {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RUN_TEST(AcceptTouchEvent_1, filter);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RUN_TEST(AcceptTouchEvent_2, filter);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RUN_TEST(AcceptTouchEvent_3, filter);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RUN_TEST(AcceptTouchEvent_4, filter);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestInputEvent::TestInputEvent(TestingInstance* instance)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : TestCase(instance),
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_event_interface_(NULL),
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_input_event_interface_(NULL),
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wheel_input_event_interface_(NULL),
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_input_event_interface_(NULL),
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_input_event_interface_(NULL),
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      nested_event_(instance->pp_instance()),
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_rect_(),
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      expected_input_event_(0),
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      received_expected_event_(false),
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      received_finish_message_(false),
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      enable_latency_tracking_(false),
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      last_latency_tracking_successful_(false) {
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TestInputEvent::~TestInputEvent() {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remove the special listener that only responds to a
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FINISHED_WAITING_MESSAGE string. See Init for where it gets added.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string js_code;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_code += "var plugin = document.getElementById('plugin');"
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "plugin.removeEventListener('message',"
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "                           plugin.wait_for_messages_handler);"
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "delete plugin.wait_for_messages_handler;";
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(js_code);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestInputEvent::Init() {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_ = static_cast<const PPB_InputEvent*>(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_INPUT_EVENT_INTERFACE));
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_event_private_interface_ = static_cast<const PPB_InputEvent_Private*>(
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(PPB_INPUTEVENT_PRIVATE_INTERFACE));
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  mouse_input_event_interface_ = static_cast<const PPB_MouseInputEvent*>(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PPB_MOUSE_INPUT_EVENT_INTERFACE));
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  wheel_input_event_interface_ = static_cast<const PPB_WheelInputEvent*>(
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PPB_WHEEL_INPUT_EVENT_INTERFACE));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  keyboard_input_event_interface_ = static_cast<const PPB_KeyboardInputEvent*>(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PPB_KEYBOARD_INPUT_EVENT_INTERFACE));
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch_input_event_interface_ = static_cast<const PPB_TouchInputEvent*>(
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Module::Get()->GetBrowserInterface(
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          PPB_TOUCH_INPUT_EVENT_INTERFACE));
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool success =
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      input_event_interface_ &&
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      input_event_private_interface_ &&
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      mouse_input_event_interface_ &&
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      wheel_input_event_interface_ &&
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyboard_input_event_interface_ &&
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_input_event_interface_ &&
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CheckTestingInterface();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set up a listener for our message that signals that all input events have
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been received.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string js_code;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Note the following code is dependent on some features of test_case.html.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // E.g., it is assumed that the DOM element where the plugin is embedded has
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // an id of 'plugin', and there is a function 'IsTestingMessage' that allows
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // us to ignore the messages that are intended for use by the testing
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // framework itself.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_code += "var plugin = document.getElementById('plugin');"
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "var wait_for_messages_handler = function(message_event) {"
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "  if (!IsTestingMessage(message_event.data) &&"
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "      message_event.data === '" FINISHED_WAITING_MESSAGE "') {"
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "    plugin.postMessage('" FINISHED_WAITING_MESSAGE "');"
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "  }"
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "};"
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "plugin.addEventListener('message', wait_for_messages_handler);"
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             // Stash it on the plugin so we can remove it in the destructor.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             "plugin.wait_for_messages_handler = wait_for_messages_handler;";
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->EvalScript(js_code);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return success;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestInputEvent::CreateMouseEvent(
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_InputEvent_Type type,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PP_InputEvent_MouseButton buttons) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::MouseInputEvent(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      buttons,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCenter(view_rect_),
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1,  // click count
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::Point());  // movement
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestInputEvent::CreateWheelEvent() {
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::WheelInputEvent(
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::FloatPoint(1, 2),
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pp::FloatPoint(3, 4),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_TRUE);  // scroll_by_page
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestInputEvent::CreateKeyEvent(PP_InputEvent_Type type,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              uint32_t key_code,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                              const std::string& code) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::KeyboardInputEvent(
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pp::Var(),
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pp::Var(code));
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestInputEvent::CreateCharEvent(const std::string& text) {
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pp::KeyboardInputEvent(
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      instance_,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_TYPE_CHAR,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      100,  // time_stamp
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // modifiers
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      0,  // keycode
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pp::Var(text),
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pp::Var());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)pp::InputEvent TestInputEvent::CreateTouchEvent(PP_InputEvent_Type type,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                const pp::FloatPoint& point) {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_TouchPoint touch_point = PP_MakeTouchPoint();
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch_point.position = point;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pp::TouchInputEvent touch_event(instance_, type, 100, 0);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch_event.AddTouchPoint(PP_TOUCHLIST_TYPE_TOUCHES, touch_point);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch_event.AddTouchPoint(PP_TOUCHLIST_TYPE_CHANGEDTOUCHES, touch_point);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  touch_event.AddTouchPoint(PP_TOUCHLIST_TYPE_TARGETTOUCHES, touch_point);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return touch_event;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void TestInputEvent::PostMessageBarrier() {
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  received_finish_message_ = false;
1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  instance_->PostMessage(pp::Var(FINISHED_WAITING_MESSAGE));
1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  testing_interface_->RunMessageLoop(instance_->pp_instance());
1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  nested_event_.Wait();
1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Simulates the input event and calls PostMessage to let us know when
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we have received all resulting events from the browser.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestInputEvent::SimulateInputEvent(
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const pp::InputEvent& input_event) {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_input_event_ = pp::InputEvent(input_event.pp_resource());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  received_expected_event_ = false;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  testing_interface_->SimulateInputEvent(instance_->pp_instance(),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         input_event.pp_resource());
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostMessageBarrier();
2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  return received_expected_event_;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestInputEvent::AreEquivalentEvents(PP_Resource received,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         PP_Resource expected) {
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!input_event_interface_->IsInputEvent(received) ||
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !input_event_interface_->IsInputEvent(expected)) {
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test common fields, except modifiers and time stamp, which may be changed
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // by the browser.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t received_type = input_event_interface_->GetType(received);
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t expected_type = input_event_interface_->GetType(expected);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (received_type != expected_type) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow key down events to match "raw" key down events.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (expected_type != PP_INPUTEVENT_TYPE_KEYDOWN &&
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        received_type != PP_INPUTEVENT_TYPE_RAWKEYDOWN) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test event type-specific fields.
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (input_event_interface_->GetType(received)) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_MOUSEDOWN:
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_MOUSEUP:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_MOUSEMOVE:
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_MOUSEENTER:
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_MOUSELEAVE:
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Check mouse fields, except position and movement, which may be
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // modified by the renderer.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_input_event_interface_->GetButton(received) ==
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_input_event_interface_->GetButton(expected) &&
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_input_event_interface_->GetClickCount(received) ==
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          mouse_input_event_interface_->GetClickCount(expected);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_WHEEL:
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::FloatPoint(wheel_input_event_interface_->GetDelta(received)) ==
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::FloatPoint(wheel_input_event_interface_->GetDelta(expected)) &&
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::FloatPoint(wheel_input_event_interface_->GetTicks(received)) ==
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::FloatPoint(wheel_input_event_interface_->GetTicks(expected)) &&
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          wheel_input_event_interface_->GetScrollByPage(received) ==
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          wheel_input_event_interface_->GetScrollByPage(expected);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_RAWKEYDOWN:
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_KEYDOWN:
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_KEYUP:
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(received) ==
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(expected);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_CHAR:
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(received) ==
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          keyboard_input_event_interface_->GetKeyCode(expected) &&
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::Var(pp::PASS_REF,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              keyboard_input_event_interface_->GetCharacterText(received)) ==
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          pp::Var(pp::PASS_REF,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              keyboard_input_event_interface_->GetCharacterText(expected));
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_TOUCHSTART:
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_TOUCHEND:
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case PP_INPUTEVENT_TYPE_TOUCHCANCEL: {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (!touch_input_event_interface_->IsTouchInputEvent(received) ||
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          !touch_input_event_interface_->IsTouchInputEvent(expected))
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      uint32_t touch_count = touch_input_event_interface_->GetTouchCount(
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          received, PP_TOUCHLIST_TYPE_TOUCHES);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (touch_count <= 0 ||
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          touch_count != touch_input_event_interface_->GetTouchCount(expected,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              PP_TOUCHLIST_TYPE_TOUCHES))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return false;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (uint32_t i = 0; i < touch_count; ++i) {
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PP_TouchPoint expected_point = touch_input_event_interface_->
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetTouchByIndex(expected, PP_TOUCHLIST_TYPE_TOUCHES, i);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        PP_TouchPoint received_point = touch_input_event_interface_->
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            GetTouchByIndex(received, PP_TOUCHLIST_TYPE_TOUCHES, i);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (expected_point.id != received_point.id ||
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            expected_point.radius != received_point.radius ||
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            expected_point.rotation_angle != received_point.rotation_angle ||
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            expected_point.pressure != received_point.pressure)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (expected_point.position.x != received_point.position.x ||
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            expected_point.position.y != received_point.position.y)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return false;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return true;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestInputEvent::HandleInputEvent(const pp::InputEvent& input_event) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Some events may cause extra events to be generated, so look for the
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first one that matches.
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!received_expected_event_) {
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_expected_event_ = AreEquivalentEvents(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        input_event.pp_resource(),
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        expected_input_event_.pp_resource());
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Handle all input events.
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (enable_latency_tracking_) {
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    pp::InputEventPrivate private_event(input_event);
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    last_latency_tracking_successful_ = private_event.TraceInputLatency(true);
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestInputEvent::HandleMessage(const pp::Var& message_data) {
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (message_data.is_string() &&
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (message_data.AsString() == FINISHED_WAITING_MESSAGE)) {
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    testing_interface_->QuitMessageLoop(instance_->pp_instance());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    received_finish_message_ = true;
3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    nested_event_.Signal();
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestInputEvent::DidChangeView(const pp::View& view) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view_rect_ = view.GetRect();
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string TestInputEvent::TestEventsLatencyTracking() {
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  enable_latency_tracking_ = true;
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_TOUCH);
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PostMessageBarrier();
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateTouchEvent(PP_INPUTEVENT_TYPE_TOUCHSTART,
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  pp::FloatPoint(12, 23))));
342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Without calling StartTrackingLatency() first, TraceInputLatency() won't
343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // take effect and will return false;
344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_FALSE(last_latency_tracking_successful_);
345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_event_private_interface_->StartTrackingLatency(
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      instance_->pp_instance());
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateTouchEvent(PP_INPUTEVENT_TYPE_TOUCHSTART,
350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                                  pp::FloatPoint(12, 23))));
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(last_latency_tracking_successful_);
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  PASS();
354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestInputEvent::TestEvents() {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request all input event classes.
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE |
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_WHEEL |
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD |
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_TOUCH);
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostMessageBarrier();
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Send the events and check that we received them.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateMouseEvent(PP_INPUTEVENT_TYPE_MOUSEDOWN,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PP_INPUTEVENT_MOUSEBUTTON_LEFT)));
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateWheelEvent()));
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateKeyEvent(PP_INPUTEVENT_TYPE_KEYDOWN,
3735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        kSpaceChar, kSpaceCode)));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateCharEvent(kSpaceString)));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(SimulateInputEvent(CreateTouchEvent(PP_INPUTEVENT_TYPE_TOUCHSTART,
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  pp::FloatPoint(12, 23))));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Request only mouse events.
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->ClearInputEventRequest(instance_->pp_instance(),
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 PP_INPUTEVENT_CLASS_WHEEL |
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 PP_INPUTEVENT_CLASS_KEYBOARD);
3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  PostMessageBarrier();
3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check that we only receive mouse events.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateMouseEvent(PP_INPUTEVENT_TYPE_MOUSEDOWN,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          PP_INPUTEVENT_MOUSEBUTTON_LEFT)));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateWheelEvent()));
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateKeyEvent(PP_INPUTEVENT_TYPE_KEYDOWN,
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        kSpaceChar, kSpaceCode)));
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      SimulateInputEvent(CreateCharEvent(kSpaceString)));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestInputEvent::TestAcceptTouchEvent_1() {
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The browser normally sends touch-events to the renderer only if the page
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // has touch-event handlers. Since test-case.html does not have any
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // touch-event handler, it would normally not receive any touch events from
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the browser. However, if a plugin in the page does accept touch events,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // then the browser should start sending touch-events to the page. In this
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test, the plugin simply registers for touch-events. The real test is to
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // verify that the browser knows to send touch-events to the renderer.
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If the plugin is removed from the page, then there are no more touch-event
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // handlers in the page, and browser stops sending touch-events. So to make
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it possible to test this properly, the plugin is not removed from the page
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // at the end of the test.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->set_remove_plugin(false);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE |
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_WHEEL |
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD |
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_TOUCH);
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestInputEvent::TestAcceptTouchEvent_2() {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment in TestAcceptTouchEvent_1.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->set_remove_plugin(false);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE |
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_WHEEL |
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD |
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_TOUCH);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->ClearInputEventRequest(instance_->pp_instance(),
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 PP_INPUTEVENT_CLASS_TOUCH);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestInputEvent::TestAcceptTouchEvent_3() {
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment in TestAcceptTouchEvent_1.
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->set_remove_plugin(false);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE |
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_WHEEL |
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestFilteringInputEvents(instance_->pp_instance(),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_INPUTEVENT_CLASS_TOUCH);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestInputEvent::TestAcceptTouchEvent_4() {
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See comment in TestAcceptTouchEvent_1.
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_->set_remove_plugin(false);
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_MOUSE |
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_WHEEL |
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_KEYBOARD);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_event_interface_->RequestInputEvents(instance_->pp_instance(),
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             PP_INPUTEVENT_CLASS_TOUCH);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PASS();
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
456