Index: content/browser/renderer_host/render_widget_host_impl.cc |
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc |
index a4b3eda71ad9ff4919d3ab0323a72b21cc5cc29e..a9bdce33a347709510420e3751ad1b4dfce1ca65 100644 |
--- a/content/browser/renderer_host/render_widget_host_impl.cc |
+++ b/content/browser/renderer_host/render_widget_host_impl.cc |
@@ -138,6 +138,30 @@ class RenderWidgetHostIteratorImpl : public RenderWidgetHostIterator { |
DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostIteratorImpl); |
}; |
+inline blink::WebGestureEvent CreateScrollBeginForWrapping( |
+ const blink::WebGestureEvent& gesture_event) { |
+ DCHECK(gesture_event.type == blink::WebInputEvent::GestureScrollUpdate); |
+ |
+ blink::WebGestureEvent wrap_gesture_scroll_begin; |
+ wrap_gesture_scroll_begin.type = blink::WebInputEvent::GestureScrollBegin; |
+ wrap_gesture_scroll_begin.data.scrollBegin.deltaXHint = 0; |
+ wrap_gesture_scroll_begin.data.scrollBegin.deltaYHint = 0; |
+ wrap_gesture_scroll_begin.resendingPluginId = gesture_event.resendingPluginId; |
+ |
+ return wrap_gesture_scroll_begin; |
+} |
+ |
+inline blink::WebGestureEvent CreateScrollEndForWrapping( |
+ const blink::WebGestureEvent& gesture_event) { |
+ DCHECK(gesture_event.type == blink::WebInputEvent::GestureScrollUpdate); |
+ |
+ blink::WebGestureEvent wrap_gesture_scroll_end; |
+ wrap_gesture_scroll_end.type = blink::WebInputEvent::GestureScrollEnd; |
+ wrap_gesture_scroll_end.resendingPluginId = gesture_event.resendingPluginId; |
+ |
+ return wrap_gesture_scroll_end; |
+} |
+ |
} // namespace |
/////////////////////////////////////////////////////////////////////////////// |
@@ -177,6 +201,7 @@ RenderWidgetHostImpl::RenderWidgetHostImpl(RenderWidgetHostDelegate* delegate, |
pending_mouse_lock_request_(false), |
allow_privileged_mouse_lock_(false), |
has_touch_handler_(false), |
+ is_in_gesture_scroll_(false), |
next_browser_snapshot_id_(1), |
owned_by_render_frame_host_(false), |
is_focused_(false), |
@@ -998,12 +1023,41 @@ void RenderWidgetHostImpl::ForwardGestureEventWithLatencyInfo( |
if (IgnoreInputEvents()) |
return; |
+ // TODO(wjmaclean) Remove the code for supporting resending gesture events |
+ // when WebView transitions to OOPIF and BrowserPlugin is removed. |
+ // http://crbug.com/533069 |
+ if (gesture_event.type == blink::WebInputEvent::GestureScrollBegin) { |
+ DCHECK(!is_in_gesture_scroll_); |
+ is_in_gesture_scroll_ = true; |
+ } else if (gesture_event.type == blink::WebInputEvent::GestureScrollEnd || |
+ gesture_event.type == blink::WebInputEvent::GestureFlingStart) { |
+ DCHECK(is_in_gesture_scroll_ || |
+ (gesture_event.type == blink::WebInputEvent::GestureFlingStart && |
+ gesture_event.sourceDevice == |
+ blink::WebGestureDevice::WebGestureDeviceTouchpad)); |
+ is_in_gesture_scroll_ = false; |
+ } |
+ |
+ bool scroll_update_needs_wrapping = |
+ gesture_event.type == blink::WebInputEvent::GestureScrollUpdate && |
+ gesture_event.resendingPluginId != -1 && !is_in_gesture_scroll_; |
+ |
+ if (scroll_update_needs_wrapping) { |
+ ForwardGestureEventWithLatencyInfo( |
+ CreateScrollBeginForWrapping(gesture_event), ui::LatencyInfo()); |
+ } |
+ |
if (delegate_->PreHandleGestureEvent(gesture_event)) |
return; |
GestureEventWithLatencyInfo gesture_with_latency(gesture_event, ui_latency); |
latency_tracker_.OnInputEvent(gesture_event, &gesture_with_latency.latency); |
input_router_->SendGestureEvent(gesture_with_latency); |
+ |
+ if (scroll_update_needs_wrapping) { |
+ ForwardGestureEventWithLatencyInfo( |
+ CreateScrollEndForWrapping(gesture_event), ui::LatencyInfo()); |
+ } |
} |
void RenderWidgetHostImpl::ForwardEmulatedTouchEvent( |