Skip to content

Commit

Permalink
Reland "Fling bubbles from OOPIF properly" without the tests.
Browse files Browse the repository at this point in the history
This cl relands the following cl after excluding the added tests.
https://chromium-review.googlesource.com/c/chromium/src/+/1278963

This gives the solution more time to bake on ToT without getting
reverted due to flaky tests.

Meanwhile I will work on the tests to deflake them.

TBR=mcnee@chromium.org,creis@chromium.org

Bug: 884728, 249063
Change-Id: Icc1e32ffe493f85d0ee74b0aff37ccdf078d0e8f
Reviewed-on: https://chromium-review.googlesource.com/c/1281687
Commit-Queue: Charlie Reis <creis@chromium.org>
Reviewed-by: Kevin McNee <mcnee@chromium.org>
Reviewed-by: Charlie Reis <creis@chromium.org>
Cr-Commit-Position: refs/heads/master@{#599781}
  • Loading branch information
Sahel Sharify authored and Commit Bot committed Oct 15, 2018
1 parent aa646be commit abad218
Show file tree
Hide file tree
Showing 4 changed files with 61 additions and 4 deletions.
7 changes: 5 additions & 2 deletions content/browser/frame_host/cross_process_frame_connector.cc
Original file line number Diff line number Diff line change
Expand Up @@ -279,7 +279,8 @@ void CrossProcessFrameConnector::BubbleScrollEvent(
DCHECK(event.GetType() == blink::WebInputEvent::kGestureScrollBegin ||
event.GetType() == blink::WebInputEvent::kGestureScrollUpdate ||
event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
event.GetType() == blink::WebInputEvent::kGestureFlingStart);
event.GetType() == blink::WebInputEvent::kGestureFlingStart ||
event.GetType() == blink::WebInputEvent::kGestureFlingCancel);
auto* parent_view = GetParentRenderWidgetHostView();

if (!parent_view)
Expand All @@ -302,7 +303,9 @@ void CrossProcessFrameConnector::BubbleScrollEvent(
if (event.GetType() == blink::WebInputEvent::kGestureScrollBegin) {
event_router->BubbleScrollEvent(parent_view, resent_gesture_event, view_);
is_scroll_bubbling_ = true;
} else if (is_scroll_bubbling_) {
} else if (is_scroll_bubbling_ ||
event.GetType() == blink::WebInputEvent::kGestureFlingCancel) {
// For GFC events the router decides whether to bubble them or not.
event_router->BubbleScrollEvent(parent_view, resent_gesture_event, view_);
}
if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,9 @@ void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed(
if (view == last_fling_start_target_)
last_fling_start_target_ = nullptr;

if (view == last_fling_start_bubbled_target_)
last_fling_start_bubbled_target_ = nullptr;

event_targeter_->ViewWillBeDestroyed(view);
}

Expand Down Expand Up @@ -1002,7 +1005,8 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
DCHECK(event.GetType() == blink::WebInputEvent::kGestureScrollBegin ||
event.GetType() == blink::WebInputEvent::kGestureScrollUpdate ||
event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
event.GetType() == blink::WebInputEvent::kGestureFlingStart);
event.GetType() == blink::WebInputEvent::kGestureFlingStart ||
event.GetType() == blink::WebInputEvent::kGestureFlingCancel);

ui::LatencyInfo latency_info =
ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
Expand Down Expand Up @@ -1031,7 +1035,26 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
}

bubbling_gesture_scroll_target_.target = target_view;
} else if (event.GetType() == blink::WebInputEvent::kGestureFlingCancel) {
// TODO(828422): Remove once this issue no longer occurs.
if (resending_view == last_fling_start_bubbled_target_) {
ReportBubblingScrollToSameView(event, resending_view);
last_fling_start_bubbled_target_ = nullptr;
return;
}
// GFC event must get bubbled to the same target view that the last GFS has
// been bubbled.
if (last_fling_start_bubbled_target_) {
last_fling_start_bubbled_target_->ProcessGestureEvent(
GestureEventInTarget(event, last_fling_start_bubbled_target_),
latency_info);
last_fling_start_bubbled_target_ = nullptr;
}
return;
} else { // !(event.GetType() == blink::WebInputEvent::kGestureScrollBegin)
// && !(event.GetType() ==
// blink::WebInputEvent::kGestureFlingCancel)

if (!bubbling_gesture_scroll_target_.target) {
// The GestureScrollBegin event is not bubbled, don't bubble the rest of
// the scroll events.
Expand Down Expand Up @@ -1063,6 +1086,12 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
bubbling_gesture_scroll_target_.target->ProcessGestureEvent(
GestureEventInTarget(event, bubbling_gesture_scroll_target_.target),
latency_info);

// The GFC should be sent to the view that handles the GFS.
if (event.GetType() == blink::WebInputEvent::kGestureFlingStart) {
last_fling_start_bubbled_target_ = bubbling_gesture_scroll_target_.target;
}

if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
event.GetType() == blink::WebInputEvent::kGestureFlingStart) {
first_bubbling_scroll_target_.target = nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -317,6 +317,12 @@ class CONTENT_EXPORT RenderWidgetHostInputEventRouter
// Tracked for the purpose of targeting subsequent fling cancel events.
RenderWidgetHostViewBase* last_fling_start_target_ = nullptr;

// During scroll bubbling we bubble the GFS to the target view so that its
// fling controller takes care of flinging. In this case we should also send
// the GFC to the bubbling target so that the fling controller currently in
// charge of the fling progress could handle the fling cancellelation as well.
RenderWidgetHostViewBase* last_fling_start_bubbled_target_ = nullptr;

// Tracked for the purpose of providing a root_view when dispatching emulated
// touch/gesture events.
RenderWidgetHostViewBase* last_emulated_event_root_view_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -528,6 +528,24 @@ void RenderWidgetHostViewChildFrame::GestureEventAck(
ack_result == INPUT_EVENT_ACK_STATE_NO_CONSUMER_EXISTS ||
ack_result == INPUT_EVENT_ACK_STATE_CONSUMED_SHOULD_BUBBLE;

// The inertial events on Mac should still get bubbled since there is no GFS to
// bubble and the inertial events are received from the OS.
#if !defined(OS_MACOSX)
// When a GFS is bubbled, we still send it to the fling controller of the
// child view to finish the scroll sequence. However the GSU and GSE events
// that are generated by the child view's fling controller do not need to get
// bubbled since the GFS event itself is bubbled and the target's fling
// controller will take care of flinging.
if ((event.GetType() == blink::WebInputEvent::kGestureScrollEnd &&
event.data.scroll_end.inertial_phase ==
blink::WebGestureEvent::kMomentumPhase) ||
(event.GetType() == blink::WebInputEvent::kGestureScrollUpdate &&
event.data.scroll_update.inertial_phase ==
blink::WebGestureEvent::kMomentumPhase)) {
return;
}
#endif // defined(OS_MACOSX)

if ((event.GetType() == blink::WebInputEvent::kGestureScrollBegin) &&
should_bubble) {
DCHECK(!is_scroll_sequence_bubbling_);
Expand All @@ -546,7 +564,8 @@ void RenderWidgetHostViewChildFrame::GestureEventAck(
should_bubble) ||
event.GetType() == blink::WebInputEvent::kGestureScrollUpdate ||
event.GetType() == blink::WebInputEvent::kGestureScrollEnd ||
event.GetType() == blink::WebInputEvent::kGestureFlingStart) {
event.GetType() == blink::WebInputEvent::kGestureFlingStart ||
event.GetType() == blink::WebInputEvent::kGestureFlingCancel) {
frame_connector_->BubbleScrollEvent(event);
}
}
Expand Down

0 comments on commit abad218

Please sign in to comment.