Chromium Code Reviews| Index: content/browser/renderer_host/gesture_event_filter.cc |
| diff --git a/content/browser/renderer_host/gesture_event_filter.cc b/content/browser/renderer_host/gesture_event_filter.cc |
| index 98227a96d90e662a4bae83f4b067648c6802d971..0f70a7f4b189d1eb410aa015ef82426184a0bbf4 100644 |
| --- a/content/browser/renderer_host/gesture_event_filter.cc |
| +++ b/content/browser/renderer_host/gesture_event_filter.cc |
| @@ -7,7 +7,8 @@ |
| #include "base/command_line.h" |
| #include "base/string_number_conversions.h" |
| #include "content/browser/renderer_host/render_widget_host_impl.h" |
| -#include "content/browser/renderer_host/tap_suppression_controller.h" |
| +#include "content/browser/renderer_host/touchpad_tap_suppression_controller.h" |
| +#include "content/browser/renderer_host/touchscreen_tap_suppression_controller.h" |
| #include "content/public/common/content_switches.h" |
| using WebKit::WebGestureEvent; |
| @@ -61,7 +62,10 @@ GestureEventFilter::GestureEventFilter(RenderWidgetHostImpl* rwhv) |
| : render_widget_host_(rwhv), |
| fling_in_progress_(false), |
| scrolling_in_progress_(false), |
| - tap_suppression_controller_(new TapSuppressionController(rwhv)), |
| + touchpad_tap_suppression_controller_( |
| + new TouchpadTapSuppressionController(rwhv)), |
| + touchscreen_tap_suppression_controller_( |
| + new TouchscreenTapSuppressionController(rwhv, this)), |
| maximum_tap_gap_time_ms_(GetTapDownDeferralTimeMs()), |
| debounce_interval_time_ms_(kDebouncingIntervalTimeMs) { |
| } |
| @@ -129,7 +133,44 @@ bool GestureEventFilter::ShouldForward(const WebGestureEvent& gesture_event) { |
| if (debounce_interval_time_ms_ == 0 || |
| ShouldForwardForBounceReduction(gesture_event)) |
| - return ShouldForwardForTapDeferral(gesture_event); |
| + return ShouldForwardForGFCFiltering(gesture_event) && |
| + ShouldForwardForTapSuppression(gesture_event) && |
| + ShouldForwardForTapDeferral(gesture_event); |
| + return false; |
| +} |
| + |
| +bool GestureEventFilter::ShouldForwardForGFCFiltering( |
| + const WebGestureEvent& gesture_event) { |
|
mohsen
2013/02/04 15:09:05
I have extracted GFC filtering into this method to
rjkroege
2013/02/05 16:00:07
sgtm
|
| + return gesture_event.type != WebInputEvent::GestureFlingCancel || |
| + !ShouldDiscardFlingCancelEvent(gesture_event); |
| +} |
| + |
| +bool GestureEventFilter::ShouldForwardForTapSuppression( |
|
rjkroege
2013/02/05 16:00:07
say what it does?
mohsen
2013/02/06 16:13:06
There is a comment in .h file above this method. I
|
| + const WebGestureEvent& gesture_event) { |
| + switch (gesture_event.type) { |
| + case WebInputEvent::GestureFlingCancel: |
| + if (gesture_event.sourceDevice == WebGestureEvent::Touchscreen) |
| + touchscreen_tap_suppression_controller_->GestureFlingCancel( |
| + gesture_event.timeStampSeconds); |
| + else |
| + touchpad_tap_suppression_controller_->GestureFlingCancel( |
| + gesture_event.timeStampSeconds); |
| + last_gfc_source_device_ = gesture_event.sourceDevice; |
| + return true; |
| + case WebInputEvent::GestureTapDown: |
| + return !touchscreen_tap_suppression_controller_-> |
|
rjkroege
2013/02/05 16:00:07
I am sad that ShouldForwardForTapSuppression inver
mohsen
2013/02/06 16:13:06
What convention does it invert? There were some Sh
|
| + ShouldDeferGestureTapDown(gesture_event); |
| + case WebInputEvent::GestureTapCancel: |
| + return !touchscreen_tap_suppression_controller_-> |
| + ShouldSuppressGestureTapCancel(); |
| + case WebInputEvent::GestureTap: |
| + return !touchscreen_tap_suppression_controller_-> |
| + ShouldSuppressGestureTap(); |
| + default: |
| + return true; |
| + } |
| + |
| + NOTREACHED(); |
| return false; |
| } |
| @@ -138,14 +179,9 @@ bool GestureEventFilter::ShouldForwardForTapDeferral( |
| const WebGestureEvent& gesture_event) { |
| switch (gesture_event.type) { |
| case WebInputEvent::GestureFlingCancel: |
| - if (!ShouldDiscardFlingCancelEvent(gesture_event)) { |
| - coalesced_gesture_events_.push_back(gesture_event); |
| - fling_in_progress_ = false; |
| - tap_suppression_controller_->GestureFlingCancel( |
| - gesture_event.timeStampSeconds); |
| - return ShouldHandleEventNow(); |
| - } |
| - return false; |
| + coalesced_gesture_events_.push_back(gesture_event); |
| + fling_in_progress_ = false; |
| + return ShouldHandleEventNow(); |
| case WebInputEvent::GestureTapDown: |
| // GestureTapDown is always paired with either a Tap, or TapCancel, so it |
| // should be impossible to have more than one outstanding at a time. |
| @@ -170,10 +206,7 @@ bool GestureEventFilter::ShouldForwardForTapDeferral( |
| case WebInputEvent::GestureTap: |
| send_gtd_timer_.Stop(); |
| if (deferred_tap_down_event_.type != WebInputEvent::Undefined) { |
| - coalesced_gesture_events_.push_back(deferred_tap_down_event_); |
| - if (ShouldHandleEventNow()) |
| - render_widget_host_->ForwardGestureEventImmediately( |
| - deferred_tap_down_event_); |
| + TryForwardGestureEvent(deferred_tap_down_event_); |
| deferred_tap_down_event_.type = WebInputEvent::Undefined; |
| coalesced_gesture_events_.push_back(gesture_event); |
| return false; |
| @@ -200,6 +233,13 @@ bool GestureEventFilter::ShouldForwardForTapDeferral( |
| return false; |
| } |
| +void GestureEventFilter::TryForwardGestureEvent( |
| + const WebGestureEvent& gesture_event) { |
| + coalesced_gesture_events_.push_back(gesture_event); |
| + if (ShouldHandleEventNow()) |
| + render_widget_host_->ForwardGestureEventImmediately(gesture_event); |
| +} |
| + |
| void GestureEventFilter::Reset() { |
| fling_in_progress_ = false; |
| scrolling_in_progress_ = false; |
| @@ -218,16 +258,20 @@ void GestureEventFilter::ProcessGestureAck(bool processed, int type) { |
| } |
| DCHECK_EQ(coalesced_gesture_events_.front().type, type); |
| coalesced_gesture_events_.pop_front(); |
| - if (type == WebInputEvent::GestureFlingCancel) |
| - tap_suppression_controller_->GestureFlingCancelAck(processed); |
| + if (type == WebInputEvent::GestureFlingCancel) { |
| + if (last_gfc_source_device_ == WebGestureEvent::Touchscreen) |
|
rjkroege
2013/02/05 16:00:07
I suspect that this might not be robust unless the
mohsen
2013/02/06 16:13:06
Since GEF fowards events one by one, i.e. waits fo
|
| + touchscreen_tap_suppression_controller_->GestureFlingCancelAck(processed); |
| + else |
| + touchpad_tap_suppression_controller_->GestureFlingCancelAck(processed); |
| + } |
| if (!coalesced_gesture_events_.empty()) { |
| WebGestureEvent next_gesture_event = coalesced_gesture_events_.front(); |
| render_widget_host_->ForwardGestureEventImmediately(next_gesture_event); |
| } |
| } |
| -TapSuppressionController* GestureEventFilter::GetTapSuppressionController() { |
| - return tap_suppression_controller_.get(); |
| +TouchpadTapSuppressionController* GestureEventFilter::GetTouchpadTapSuppressionController() { |
|
mohsen
2013/02/04 15:09:05
Does this line need to be broken?
rjkroege
2013/02/05 16:00:07
yes
mohsen
2013/02/06 16:13:06
Done.
|
| + return touchpad_tap_suppression_controller_.get(); |
| } |
| bool GestureEventFilter::HasQueuedGestureEvents() const { |
| @@ -248,16 +292,23 @@ bool GestureEventFilter::ShouldHandleEventNow() { |
| return coalesced_gesture_events_.size() == 1; |
| } |
| +void GestureEventFilter::ForwardGestureEventForDeferral( |
| + const WebGestureEvent& gesture_event) { |
| + if (ShouldForwardForTapDeferral(gesture_event)) |
| + TryForwardGestureEvent(gesture_event); |
| +} |
| + |
| +void GestureEventFilter::ForwardGestureEventSkipDeferral( |
| + const WebGestureEvent& gesture_event) { |
| + TryForwardGestureEvent(gesture_event); |
| +} |
| + |
| void GestureEventFilter::SendGestureTapDownNow() { |
| // We must not have already sent the deferred TapDown (if we did, we would |
| // have stopped the timer, which prevents this task from running - even if |
| // it's time had already elapsed). |
| DCHECK_EQ(deferred_tap_down_event_.type, WebInputEvent::GestureTapDown); |
| - coalesced_gesture_events_.push_back(deferred_tap_down_event_); |
| - if (ShouldHandleEventNow()) { |
| - render_widget_host_->ForwardGestureEventImmediately( |
| - deferred_tap_down_event_); |
| - } |
| + TryForwardGestureEvent(deferred_tap_down_event_); |
| deferred_tap_down_event_.type = WebInputEvent::Undefined; |
| } |
| @@ -266,7 +317,9 @@ void GestureEventFilter::SendScrollEndingEventsNow() { |
| for (GestureEventQueue::iterator it = |
| debouncing_deferral_queue_.begin(); |
| it != debouncing_deferral_queue_.end(); it++) { |
| - if (ShouldForwardForTapDeferral(*it)) { |
| + if (ShouldForwardForGFCFiltering(*it) && |
| + ShouldForwardForTapSuppression(*it) && |
| + ShouldForwardForTapDeferral(*it)) { |
| render_widget_host_->ForwardGestureEventImmediately(*it); |
| } |
| } |
| @@ -295,4 +348,4 @@ void GestureEventFilter::MergeOrInsertScrollEvent( |
| } |
| } |
| -} // namespace content |
| +} // namespace content |