| Index: remoting/client/plugin/pepper_input_handler.cc
 | 
| diff --git a/remoting/client/plugin/pepper_input_handler.cc b/remoting/client/plugin/pepper_input_handler.cc
 | 
| index 157efe5eaba5253a699addc563c6799a95ae28d4..a9eb4208ea12b1eb34cb9ae38ec494dfa69b877d 100644
 | 
| --- a/remoting/client/plugin/pepper_input_handler.cc
 | 
| +++ b/remoting/client/plugin/pepper_input_handler.cc
 | 
| @@ -10,6 +10,7 @@
 | 
|  #include "ppapi/cpp/module_impl.h"
 | 
|  #include "ppapi/cpp/mouse_cursor.h"
 | 
|  #include "ppapi/cpp/point.h"
 | 
| +#include "ppapi/cpp/touch_point.h"
 | 
|  #include "ppapi/cpp/var.h"
 | 
|  #include "remoting/proto/event.pb.h"
 | 
|  #include "ui/events/keycodes/dom4/keycode_converter.h"
 | 
| @@ -18,6 +19,52 @@ namespace remoting {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| +void SetTouchEventType(PP_InputEvent_Type pp_type,
 | 
| +                       protocol::TouchEvent* touch_event) {
 | 
| +  DCHECK(touch_event);
 | 
| +  switch (pp_type) {
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHSTART:
 | 
| +      touch_event->set_event_type(protocol::TouchEvent::TOUCH_POINT_START);
 | 
| +      return;
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
 | 
| +      touch_event->set_event_type(protocol::TouchEvent::TOUCH_POINT_MOVE);
 | 
| +      return;
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHEND:
 | 
| +      touch_event->set_event_type(protocol::TouchEvent::TOUCH_POINT_END);
 | 
| +      return;
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHCANCEL:
 | 
| +      touch_event->set_event_type(protocol::TouchEvent::TOUCH_POINT_CANCEL);
 | 
| +      return;
 | 
| +    default:
 | 
| +      NOTREACHED() << "Unknown event type: " << pp_type;
 | 
| +      return;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +// Creates a protocol::TouchEvent instance from |pp_touch_event|.
 | 
| +// Note that only the changed touches are added to the TouchEvent.
 | 
| +protocol::TouchEvent MakeTouchEvent(const pp::TouchInputEvent& pp_touch_event) {
 | 
| +  protocol::TouchEvent touch_event;
 | 
| +  SetTouchEventType(pp_touch_event.GetType(), &touch_event);
 | 
| +  DCHECK(touch_event.has_event_type());
 | 
| +
 | 
| +  for (uint32_t i = 0;
 | 
| +       i < pp_touch_event.GetTouchCount(PP_TOUCHLIST_TYPE_CHANGEDTOUCHES);
 | 
| +       ++i) {
 | 
| +    pp::TouchPoint pp_point =
 | 
| +        pp_touch_event.GetTouchByIndex(PP_TOUCHLIST_TYPE_CHANGEDTOUCHES, i);
 | 
| +    protocol::TouchEventPoint* point = touch_event.add_touch_points();
 | 
| +    point->set_id(pp_point.id());
 | 
| +    point->set_x(pp_point.position().x());
 | 
| +    point->set_y(pp_point.position().y());
 | 
| +    point->set_radius_x(pp_point.radii().x());
 | 
| +    point->set_radius_y(pp_point.radii().y());
 | 
| +    point->set_angle(pp_point.rotation_angle());
 | 
| +  }
 | 
| +
 | 
| +  return touch_event;
 | 
| +}
 | 
| +
 | 
|  // Builds the Chromotocol lock states flags for the PPAPI |event|.
 | 
|  uint32_t MakeLockStates(const pp::InputEvent& event) {
 | 
|    uint32_t modifiers = event.GetModifiers();
 | 
| @@ -72,6 +119,18 @@ PepperInputHandler::PepperInputHandler()
 | 
|  
 | 
|  bool PepperInputHandler::HandleInputEvent(const pp::InputEvent& event) {
 | 
|    switch (event.GetType()) {
 | 
| +    // Touch input cases.
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHSTART:
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHMOVE:
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHEND:
 | 
| +    case PP_INPUTEVENT_TYPE_TOUCHCANCEL: {
 | 
| +      if (!input_stub_)
 | 
| +        return true;
 | 
| +      pp::TouchInputEvent pp_touch_event(event);
 | 
| +      input_stub_->InjectTouchEvent(MakeTouchEvent(pp_touch_event));
 | 
| +      return true;
 | 
| +    }
 | 
| +
 | 
|      case PP_INPUTEVENT_TYPE_CONTEXTMENU: {
 | 
|        // We need to return true here or else we'll get a local (plugin) context
 | 
|        // menu instead of the mouseup event for the right click.
 | 
| 
 |