@@ -293,6 +293,9 @@ void RenderWidgetHostInputEventRouter::OnRenderWidgetHostViewBaseDestroyed(
293
293
if (view == last_fling_start_target_)
294
294
last_fling_start_target_ = nullptr ;
295
295
296
+ if (view == last_fling_start_bubbled_target_)
297
+ last_fling_start_bubbled_target_ = nullptr ;
298
+
296
299
event_targeter_->ViewWillBeDestroyed (view);
297
300
}
298
301
@@ -1001,7 +1004,8 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
1001
1004
DCHECK (event.GetType () == blink::WebInputEvent::kGestureScrollBegin ||
1002
1005
event.GetType () == blink::WebInputEvent::kGestureScrollUpdate ||
1003
1006
event.GetType () == blink::WebInputEvent::kGestureScrollEnd ||
1004
- event.GetType () == blink::WebInputEvent::kGestureFlingStart );
1007
+ event.GetType () == blink::WebInputEvent::kGestureFlingStart ||
1008
+ event.GetType () == blink::WebInputEvent::kGestureFlingCancel );
1005
1009
1006
1010
ui::LatencyInfo latency_info =
1007
1011
ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent (event);
@@ -1030,7 +1034,26 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
1030
1034
}
1031
1035
1032
1036
bubbling_gesture_scroll_target_.target = target_view;
1037
+ } else if (event.GetType () == blink::WebInputEvent::kGestureFlingCancel ) {
1038
+ // TODO(828422): Remove once this issue no longer occurs.
1039
+ if (resending_view == last_fling_start_bubbled_target_) {
1040
+ ReportBubblingScrollToSameView (event, resending_view);
1041
+ last_fling_start_bubbled_target_ = nullptr ;
1042
+ return ;
1043
+ }
1044
+ // GFC event must get bubbled to the same target view that the last GFS has
1045
+ // been bubbled.
1046
+ if (last_fling_start_bubbled_target_) {
1047
+ last_fling_start_bubbled_target_->ProcessGestureEvent (
1048
+ GestureEventInTarget (event, last_fling_start_bubbled_target_),
1049
+ latency_info);
1050
+ last_fling_start_bubbled_target_ = nullptr ;
1051
+ }
1052
+ return ;
1033
1053
} else { // !(event.GetType() == blink::WebInputEvent::kGestureScrollBegin)
1054
+ // && !(event.GetType() ==
1055
+ // blink::WebInputEvent::kGestureFlingCancel)
1056
+
1034
1057
if (!bubbling_gesture_scroll_target_.target ) {
1035
1058
// The GestureScrollBegin event is not bubbled, don't bubble the rest of
1036
1059
// the scroll events.
@@ -1062,6 +1085,12 @@ void RenderWidgetHostInputEventRouter::BubbleScrollEvent(
1062
1085
bubbling_gesture_scroll_target_.target ->ProcessGestureEvent (
1063
1086
GestureEventInTarget (event, bubbling_gesture_scroll_target_.target ),
1064
1087
latency_info);
1088
+
1089
+ // The GFC should be sent to the view that handles the GFS.
1090
+ if (event.GetType () == blink::WebInputEvent::kGestureFlingStart ) {
1091
+ last_fling_start_bubbled_target_ = bubbling_gesture_scroll_target_.target ;
1092
+ }
1093
+
1065
1094
if (event.GetType () == blink::WebInputEvent::kGestureScrollEnd ||
1066
1095
event.GetType () == blink::WebInputEvent::kGestureFlingStart ) {
1067
1096
first_bubbling_scroll_target_.target = nullptr ;
0 commit comments