1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Use of this source code is governed by a BSD-style license that can be
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// found in the LICENSE file.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ppapi/shared_impl/ppb_input_event_shared.h"
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ppapi/shared_impl/ppapi_globals.h"
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "ppapi/shared_impl/var.h"
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing ppapi::thunk::PPB_InputEvent_API;
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace ppapi {
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgInputEventData::InputEventData()
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    : is_filtered(false),
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type(PP_INPUTEVENT_TYPE_UNDEFINED),
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_time_stamp(0.0),
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_modifiers(0),
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mouse_button(PP_INPUTEVENT_MOUSEBUTTON_NONE),
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mouse_position(PP_MakePoint(0, 0)),
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mouse_click_count(0),
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      mouse_movement(PP_MakePoint(0, 0)),
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wheel_delta(PP_MakeFloatPoint(0.0f, 0.0f)),
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wheel_ticks(PP_MakeFloatPoint(0.0f, 0.0f)),
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      wheel_scroll_by_page(false),
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      key_code(0),
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      code(),
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      character_text(),
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      composition_target_segment(-1),
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      composition_selection_start(0),
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      composition_selection_end(0),
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      touches(),
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      changed_touches(),
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      target_touches() {}
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgInputEventData::~InputEventData() {}
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPPB_InputEvent_Shared::PPB_InputEvent_Shared(ResourceObjectType type,
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             PP_Instance instance,
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                             const InputEventData& data)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    : Resource(type, instance), data_(data) {}
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPPB_InputEvent_API* PPB_InputEvent_Shared::AsPPB_InputEvent_API() {
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return this;
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst InputEventData& PPB_InputEvent_Shared::GetInputEventData() const {
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_;
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_InputEvent_Type PPB_InputEvent_Shared::GetType() { return data_.event_type; }
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_TimeTicks PPB_InputEvent_Shared::GetTimeStamp() {
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.event_time_stamp;
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t PPB_InputEvent_Shared::GetModifiers() { return data_.event_modifiers; }
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_InputEvent_MouseButton PPB_InputEvent_Shared::GetMouseButton() {
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.mouse_button;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Point PPB_InputEvent_Shared::GetMousePosition() {
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.mouse_position;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint32_t PPB_InputEvent_Shared::GetMouseClickCount() {
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.mouse_click_count;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Point PPB_InputEvent_Shared::GetMouseMovement() {
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.mouse_movement;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_FloatPoint PPB_InputEvent_Shared::GetWheelDelta() {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.wheel_delta;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_FloatPoint PPB_InputEvent_Shared::GetWheelTicks() {
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.wheel_ticks;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Bool PPB_InputEvent_Shared::GetWheelScrollByPage() {
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return PP_FromBool(data_.wheel_scroll_by_page);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t PPB_InputEvent_Shared::GetKeyCode() { return data_.key_code; }
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Var PPB_InputEvent_Shared::GetCharacterText() {
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return StringVar::StringToPPVar(data_.character_text);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Var PPB_InputEvent_Shared::GetCode() {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return StringVar::StringToPPVar(data_.code);
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t PPB_InputEvent_Shared::GetIMESegmentNumber() {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (data_.composition_segment_offsets.empty())
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return static_cast<uint32_t>(data_.composition_segment_offsets.size() - 1);
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t PPB_InputEvent_Shared::GetIMESegmentOffset(uint32_t index) {
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (index >= data_.composition_segment_offsets.size())
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.composition_segment_offsets[index];
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint32_t PPB_InputEvent_Shared::GetIMETargetSegment() {
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return data_.composition_target_segment;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid PPB_InputEvent_Shared::GetIMESelection(uint32_t* start, uint32_t* end) {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (start)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *start = data_.composition_selection_start;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (end)
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *end = data_.composition_selection_end;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid PPB_InputEvent_Shared::AddTouchPoint(PP_TouchListType list,
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          const PP_TouchPoint& point) {
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  switch (list) {
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TOUCHES:
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      data_.touches.push_back(point);
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      data_.changed_touches.push_back(point);
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      data_.target_touches.push_back(point);
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orguint32_t PPB_InputEvent_Shared::GetTouchCount(PP_TouchListType list) {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  switch (list) {
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TOUCHES:
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return static_cast<uint32_t>(data_.touches.size());
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return static_cast<uint32_t>(data_.changed_touches.size());
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return static_cast<uint32_t>(data_.target_touches.size());
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return 0;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_TouchPoint PPB_InputEvent_Shared::GetTouchByIndex(PP_TouchListType list,
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     uint32_t index) {
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  std::vector<PP_TouchPoint>* points;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  switch (list) {
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TOUCHES:
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.touches;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.changed_touches;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.target_touches;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PP_MakeTouchPoint();
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (index >= points->size()) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return PP_MakeTouchPoint();
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return points->at(index);
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_TouchPoint PPB_InputEvent_Shared::GetTouchById(PP_TouchListType list,
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  uint32_t id) {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  const std::vector<PP_TouchPoint>* points;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  switch (list) {
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TOUCHES:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.touches;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_CHANGEDTOUCHES:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.changed_touches;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    case PP_TOUCHLIST_TYPE_TARGETTOUCHES:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      points = &data_.target_touches;
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    default:
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return PP_MakeTouchPoint();
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  for (size_t i = 0; i < points->size(); i++) {
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (points->at(i).id == id)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return points->at(i);
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return PP_MakeTouchPoint();
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Bool PPB_InputEvent_Shared::TraceInputLatency(PP_Bool has_damage) {
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  ui::LatencyInfo latency = data_.latency_info;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (!latency.FindLatency(ui::INPUT_EVENT_LATENCY_BEGIN_PLUGIN_COMPONENT,
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           0, NULL))
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return PP_FALSE;
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (has_damage) {
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PpapiGlobals::Get()->AddLatencyInfo(latency, pp_instance());
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  } else {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    latency.AddLatencyNumber(
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        ui::INPUT_EVENT_LATENCY_TERMINATED_PLUGIN_COMPONENT, 0, 0);
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return PP_TRUE;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// static
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Resource PPB_InputEvent_Shared::CreateIMEInputEvent(
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ResourceObjectType type,
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Instance instance,
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_InputEvent_Type event_type,
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_TimeTicks time_stamp,
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct PP_Var text,
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t segment_number,
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const uint32_t* segment_offsets,
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int32_t target_segment,
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t selection_start,
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t selection_end) {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_START &&
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_UPDATE &&
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_IME_COMPOSITION_END &&
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_IME_TEXT)
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InputEventData data;
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_type = event_type;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_time_stamp = time_stamp;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (text.type == PP_VARTYPE_STRING) {
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    StringVar* text_str = StringVar::FromPPVar(text);
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!text_str)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    data.character_text = text_str->value();
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.composition_target_segment = target_segment;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (segment_number != 0) {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    data.composition_segment_offsets.assign(
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        &segment_offsets[0], &segment_offsets[segment_number + 1]);
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.composition_selection_start = selection_start;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.composition_selection_end = selection_end;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// static
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Resource PPB_InputEvent_Shared::CreateKeyboardInputEvent(
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ResourceObjectType type,
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Instance instance,
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_InputEvent_Type event_type,
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_TimeTicks time_stamp,
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t modifiers,
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t key_code,
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct PP_Var character_text,
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct PP_Var code) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (event_type != PP_INPUTEVENT_TYPE_RAWKEYDOWN &&
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_KEYDOWN &&
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_KEYUP &&
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_CHAR)
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InputEventData data;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_type = event_type;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_time_stamp = time_stamp;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_modifiers = modifiers;
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.key_code = key_code;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (character_text.type == PP_VARTYPE_STRING) {
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    StringVar* text_str = StringVar::FromPPVar(character_text);
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!text_str)
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    data.character_text = text_str->value();
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (code.type == PP_VARTYPE_STRING) {
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    StringVar* code_str = StringVar::FromPPVar(code);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    if (!code_str)
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    data.code = code_str->value();
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  }
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// static
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Resource PPB_InputEvent_Shared::CreateMouseInputEvent(
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ResourceObjectType type,
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Instance instance,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_InputEvent_Type event_type,
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_TimeTicks time_stamp,
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t modifiers,
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_InputEvent_MouseButton mouse_button,
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const PP_Point* mouse_position,
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    int32_t click_count,
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const PP_Point* mouse_movement) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (event_type != PP_INPUTEVENT_TYPE_MOUSEDOWN &&
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_MOUSEUP &&
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_MOUSEMOVE &&
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_MOUSEENTER &&
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_MOUSELEAVE)
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InputEventData data;
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_type = event_type;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_time_stamp = time_stamp;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_modifiers = modifiers;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.mouse_button = mouse_button;
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.mouse_position = *mouse_position;
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.mouse_click_count = click_count;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.mouse_movement = *mouse_movement;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// static
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Resource PPB_InputEvent_Shared::CreateWheelInputEvent(
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ResourceObjectType type,
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Instance instance,
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_TimeTicks time_stamp,
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t modifiers,
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const PP_FloatPoint* wheel_delta,
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const PP_FloatPoint* wheel_ticks,
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Bool scroll_by_page) {
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InputEventData data;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_type = PP_INPUTEVENT_TYPE_WHEEL;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_time_stamp = time_stamp;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_modifiers = modifiers;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.wheel_delta = *wheel_delta;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.wheel_ticks = *wheel_ticks;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.wheel_scroll_by_page = PP_ToBool(scroll_by_page);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// static
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgPP_Resource PPB_InputEvent_Shared::CreateTouchInputEvent(
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    ResourceObjectType type,
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_Instance instance,
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_InputEvent_Type event_type,
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    PP_TimeTicks time_stamp,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    uint32_t modifiers) {
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  if (event_type != PP_INPUTEVENT_TYPE_TOUCHSTART &&
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_TOUCHMOVE &&
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_TOUCHEND &&
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      event_type != PP_INPUTEVENT_TYPE_TOUCHCANCEL)
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    return 0;
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  InputEventData data;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_type = event_type;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_time_stamp = time_stamp;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  data.event_modifiers = modifiers;
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  return (new PPB_InputEvent_Shared(type, instance, data))->GetReference();
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}  // namespace ppapi
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org