| Index: content/renderer/render_widget_fullscreen_pepper.cc
|
| diff --git a/content/renderer/render_widget_fullscreen_pepper.cc b/content/renderer/render_widget_fullscreen_pepper.cc
|
| index aa6d5ff9c0b9229dc712151eac051b21b5d59f03..c1cba49147252be613660999230350eff3597404 100644
|
| --- a/content/renderer/render_widget_fullscreen_pepper.cc
|
| +++ b/content/renderer/render_widget_fullscreen_pepper.cc
|
| @@ -65,6 +65,56 @@ class FullscreenMouseLockDispatcher : public MouseLockDispatcher {
|
| DISALLOW_COPY_AND_ASSIGN(FullscreenMouseLockDispatcher);
|
| };
|
|
|
| +WebMouseEvent WebMouseEventFromGestureEvent(const WebGestureEvent& gesture) {
|
| + WebMouseEvent mouse;
|
| +
|
| + switch (gesture.type) {
|
| + case WebInputEvent::GestureScrollBegin:
|
| + mouse.type = WebInputEvent::MouseDown;
|
| + break;
|
| +
|
| + case WebInputEvent::GestureScrollUpdate:
|
| + mouse.type = WebInputEvent::MouseMove;
|
| + break;
|
| +
|
| + case WebInputEvent::GestureFlingStart:
|
| + if (gesture.sourceDevice == WebGestureEvent::Touchscreen) {
|
| + // A scroll gesture on the touchscreen may end with a GestureScrollEnd
|
| + // when there is no velocity, or a GestureFlingStart when it has a
|
| + // velocity. In both cases, it should end the drag that was initiated by
|
| + // the GestureScrollBegin (and subsequent GestureScrollUpdate) events.
|
| + mouse.type = WebInputEvent::MouseUp;
|
| + break;
|
| + } else {
|
| + return mouse;
|
| + }
|
| + case WebInputEvent::GestureScrollEnd:
|
| + mouse.type = WebInputEvent::MouseUp;
|
| + break;
|
| +
|
| + default:
|
| + break;
|
| + }
|
| +
|
| + if (mouse.type == WebInputEvent::Undefined)
|
| + return mouse;
|
| +
|
| + mouse.timeStampSeconds = gesture.timeStampSeconds;
|
| + mouse.modifiers = gesture.modifiers | WebInputEvent::LeftButtonDown;
|
| + mouse.button = WebMouseEvent::ButtonLeft;
|
| + mouse.clickCount = (mouse.type == WebInputEvent::MouseDown ||
|
| + mouse.type == WebInputEvent::MouseUp);
|
| +
|
| + mouse.x = gesture.x;
|
| + mouse.y = gesture.y;
|
| + mouse.windowX = gesture.globalX;
|
| + mouse.windowY = gesture.globalY;
|
| + mouse.globalX = gesture.globalX;
|
| + mouse.globalY = gesture.globalY;
|
| +
|
| + return mouse;
|
| +}
|
| +
|
| FullscreenMouseLockDispatcher::FullscreenMouseLockDispatcher(
|
| RenderWidgetFullscreenPepper* widget) : widget_(widget) {
|
| }
|
| @@ -152,76 +202,54 @@ class PepperWidget : public WebWidget {
|
| // This cursor info is ignored, we always set the cursor directly from
|
| // RenderWidgetFullscreenPepper::DidChangeCursor.
|
| WebCursorInfo cursor;
|
| - bool result = widget_->plugin()->HandleInputEvent(event, &cursor);
|
|
|
| - // For normal web pages, WebCore::EventHandler converts selected
|
| - // gesture events into mouse and wheel events. We don't have a WebView
|
| - // so do this translation here.
|
| - if (!result && WebInputEvent::isGestureEventType(event.type)) {
|
| + // Pepper plugins do not accept gesture events. So do not send the gesture
|
| + // events directly to the plugin. Instead, try to convert them to equivalent
|
| + // mouse events, and then send to the plugin.
|
| + if (WebInputEvent::isGestureEventType(event.type)) {
|
| + bool result = false;
|
| + const WebGestureEvent* gesture_event =
|
| + static_cast<const WebGestureEvent*>(&event);
|
| switch (event.type) {
|
| - case WebInputEvent::GestureScrollUpdate: {
|
| - const WebGestureEvent* gesture_event =
|
| - static_cast<const WebGestureEvent*>(&event);
|
| - WebMouseWheelEvent wheel_event;
|
| - wheel_event.timeStampSeconds = gesture_event->timeStampSeconds;
|
| - wheel_event.type = WebInputEvent::MouseWheel;
|
| - wheel_event.modifiers = gesture_event->modifiers;
|
| -
|
| - wheel_event.x = gesture_event->x;
|
| - wheel_event.y = gesture_event->y;
|
| - wheel_event.windowX = gesture_event->globalX;
|
| - wheel_event.windowY = gesture_event->globalX;
|
| - wheel_event.globalX = gesture_event->globalX;
|
| - wheel_event.globalY = gesture_event->globalY;
|
| - wheel_event.movementX = 0;
|
| - wheel_event.movementY = 0;
|
| -
|
| - wheel_event.deltaX = gesture_event->data.scrollUpdate.deltaX;
|
| - wheel_event.deltaY = gesture_event->data.scrollUpdate.deltaY;
|
| - wheel_event.wheelTicksX =
|
| - gesture_event->data.scrollUpdate.deltaX / kTickDivisor;
|
| - wheel_event.wheelTicksY =
|
| - gesture_event->data.scrollUpdate.deltaY / kTickDivisor;
|
| - wheel_event.hasPreciseScrollingDeltas = 1;
|
| - wheel_event.phase = WebMouseWheelEvent::PhaseNone;
|
| - wheel_event.momentumPhase = WebMouseWheelEvent::PhaseNone;
|
| -
|
| - result |= widget_->plugin()->HandleInputEvent(wheel_event, &cursor);
|
| - break;
|
| - }
|
| case WebInputEvent::GestureTap: {
|
| - const WebGestureEvent* gesture_event =
|
| - static_cast<const WebGestureEvent*>(&event);
|
| - WebMouseEvent mouseEvent;
|
| -
|
| - mouseEvent.timeStampSeconds = gesture_event->timeStampSeconds;
|
| - mouseEvent.type = WebInputEvent::MouseMove;
|
| - mouseEvent.modifiers = gesture_event->modifiers;
|
| -
|
| - mouseEvent.x = gesture_event->x;
|
| - mouseEvent.y = gesture_event->y;
|
| - mouseEvent.windowX = gesture_event->globalX;
|
| - mouseEvent.windowY = gesture_event->globalX;
|
| - mouseEvent.globalX = gesture_event->globalX;
|
| - mouseEvent.globalY = gesture_event->globalY;
|
| - mouseEvent.movementX = 0;
|
| - mouseEvent.movementY = 0;
|
| - result |= widget_->plugin()->HandleInputEvent(mouseEvent, &cursor);
|
| -
|
| - mouseEvent.type = WebInputEvent::MouseDown;
|
| - mouseEvent.button = WebMouseEvent::ButtonLeft;
|
| - mouseEvent.clickCount = gesture_event->data.tap.tapCount;
|
| - result |= widget_->plugin()->HandleInputEvent(mouseEvent, &cursor);
|
| -
|
| - mouseEvent.type = WebInputEvent::MouseUp;
|
| - result |= widget_->plugin()->HandleInputEvent(mouseEvent, &cursor);
|
| + WebMouseEvent mouse;
|
| +
|
| + mouse.timeStampSeconds = gesture_event->timeStampSeconds;
|
| + mouse.type = WebInputEvent::MouseMove;
|
| + mouse.modifiers = gesture_event->modifiers;
|
| +
|
| + mouse.x = gesture_event->x;
|
| + mouse.y = gesture_event->y;
|
| + mouse.windowX = gesture_event->globalX;
|
| + mouse.windowY = gesture_event->globalY;
|
| + mouse.globalX = gesture_event->globalX;
|
| + mouse.globalY = gesture_event->globalY;
|
| + mouse.movementX = 0;
|
| + mouse.movementY = 0;
|
| + result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
|
| +
|
| + mouse.type = WebInputEvent::MouseDown;
|
| + mouse.button = WebMouseEvent::ButtonLeft;
|
| + mouse.clickCount = gesture_event->data.tap.tapCount;
|
| + result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
|
| +
|
| + mouse.type = WebInputEvent::MouseUp;
|
| + result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
|
| break;
|
| }
|
| - default:
|
| +
|
| + default: {
|
| + WebMouseEvent mouse = WebMouseEventFromGestureEvent(*gesture_event);
|
| + if (mouse.type != WebInputEvent::Undefined)
|
| + result |= widget_->plugin()->HandleInputEvent(mouse, &cursor);
|
| break;
|
| + }
|
| }
|
| + return result;
|
| }
|
|
|
| + bool result = widget_->plugin()->HandleInputEvent(event, &cursor);
|
| +
|
| // For normal web pages, WebViewImpl does input event translations and
|
| // generates context menu events. Since we don't have a WebView, we need to
|
| // do the necessary translation ourselves.
|
|
|