1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/browser/renderer_host/input/touchscreen_tap_suppression_controller.h"
6
7#include "content/browser/renderer_host/input/gesture_event_queue.h"
8
9using blink::WebInputEvent;
10
11namespace content {
12
13TouchscreenTapSuppressionController::TouchscreenTapSuppressionController(
14    GestureEventQueue* geq,
15    const TapSuppressionController::Config& config)
16    : gesture_event_queue_(geq), controller_(this, config) {
17}
18
19TouchscreenTapSuppressionController::~TouchscreenTapSuppressionController() {}
20
21void TouchscreenTapSuppressionController::GestureFlingCancel() {
22  controller_.GestureFlingCancel();
23}
24
25void TouchscreenTapSuppressionController::GestureFlingCancelAck(
26    bool processed) {
27  controller_.GestureFlingCancelAck(processed);
28}
29
30bool TouchscreenTapSuppressionController::FilterTapEvent(
31    const GestureEventWithLatencyInfo& event) {
32  switch (event.event.type) {
33    case WebInputEvent::GestureTapDown:
34      if (!controller_.ShouldDeferTapDown())
35        return false;
36      stashed_tap_down_.reset(new GestureEventWithLatencyInfo(event));
37      return true;
38
39    case WebInputEvent::GestureShowPress:
40      if (!stashed_tap_down_)
41        return false;
42      stashed_show_press_.reset(new GestureEventWithLatencyInfo(event));
43      return true;
44
45    case WebInputEvent::GestureTapUnconfirmed:
46      return stashed_tap_down_;
47
48    case WebInputEvent::GestureTapCancel:
49    case WebInputEvent::GestureTap:
50    case WebInputEvent::GestureDoubleTap:
51      return controller_.ShouldSuppressTapEnd();
52
53    default:
54      break;
55  }
56  return false;
57}
58
59void TouchscreenTapSuppressionController::DropStashedTapDown() {
60  stashed_tap_down_.reset();
61  stashed_show_press_.reset();
62}
63
64void TouchscreenTapSuppressionController::ForwardStashedTapDown() {
65  DCHECK(stashed_tap_down_);
66  ScopedGestureEvent tap_down = stashed_tap_down_.Pass();
67  ScopedGestureEvent show_press = stashed_show_press_.Pass();
68  gesture_event_queue_->ForwardGestureEvent(*tap_down);
69  if (show_press)
70    gesture_event_queue_->ForwardGestureEvent(*show_press);
71}
72
73}  // namespace content
74