Prevent flings without a matching scroll

A fling gesture should only be generated after a scroll ends.  We use
the did_generate_scroll_ flag to track if there has been a scroll since
the last fling.  However, this flag is never set to false when a fling
is generated, so it is possible to send fling events without a matching
scroll event.

This CL sets the did_generate_scroll_ flag to false after a fling is
generated.

BUG=chromium:811855
TEST=created a test in touchtests with multiple flings without matching
scrolls.  This CL prevents the extra flings.

Change-Id: I9b8b791b71b906e9579849e93d327359df876ddc
Reviewed-on: https://chromium-review.googlesource.com/916629
Commit-Ready: Sean O'Brien <seobrien@chromium.org>
Tested-by: Sean O'Brien <seobrien@chromium.org>
Reviewed-by: Andrew de los Reyes <adlr@chromium.org>
diff --git a/include/immediate_interpreter.h b/include/immediate_interpreter.h
index 00bd840..4eb7e1d 100644
--- a/include/immediate_interpreter.h
+++ b/include/immediate_interpreter.h
@@ -175,8 +175,8 @@
       const HardwareStateBuffer& state_buffer,
       const FingerState& current) const;
 
-  // Compute a scroll result.  Return false when something goes wrong.
-  bool ComputeScroll(const HardwareStateBuffer& state_buffer,
+  // Compute a scroll and fill result.  Return false when something goes wrong.
+  bool FillResultScroll(const HardwareStateBuffer& state_buffer,
                      const FingerMap& prev_gs_fingers,
                      const FingerMap& gs_fingers,
                      GestureType prev_gesture_type,
@@ -184,10 +184,10 @@
                      Gesture* result,
                      ScrollEventBuffer* scroll_buffer);
 
-  // Compute a ScrollEvent that can be turned directly into a fling.
-  void ComputeFling(const HardwareStateBuffer& state_buffer,
+  // Compute a fling and fill result.
+  void FillResultFling(const HardwareStateBuffer& state_buffer,
                     const ScrollEventBuffer& scroll_buffer,
-                    Gesture* result) const;
+                    Gesture* result);
 
   // Update ScrollEventBuffer when the current gesture type is not scroll.
   void UpdateScrollEventBuffer(GestureType gesture_type,
diff --git a/src/immediate_interpreter.cc b/src/immediate_interpreter.cc
index cc2b5d3..31343d6 100644
--- a/src/immediate_interpreter.cc
+++ b/src/immediate_interpreter.cc
@@ -439,7 +439,7 @@
   return dp > dp_thresh;
 }
 
-bool ScrollManager::ComputeScroll(
+bool ScrollManager::FillResultScroll(
     const HardwareStateBuffer& state_buffer,
     const FingerMap& prev_gs_fingers,
     const FingerMap& gs_fingers,
@@ -658,9 +658,9 @@
   return true;
 }
 
-void ScrollManager::ComputeFling(const HardwareStateBuffer& state_buffer,
+void ScrollManager::FillResultFling(const HardwareStateBuffer& state_buffer,
                                  const ScrollEventBuffer& scroll_buffer,
-                                 Gesture* result) const {
+                                 Gesture* result) {
   if (!did_generate_scroll_)
     return;
   ScrollEvent out = { 0.0, 0.0, 0.0 };
@@ -704,6 +704,7 @@
                     vx,
                     vy,
                     GESTURES_FLING_START);
+  did_generate_scroll_ = false;
 }
 
 FingerButtonClick::FingerButtonClick(const ImmediateInterpreter* interpreter)
@@ -3196,7 +3197,7 @@
       break;
     }
     case kGestureTypeScroll: {
-      if (!scroll_manager_.ComputeScroll(state_buffer_,
+      if (!scroll_manager_.FillResultScroll(state_buffer_,
                                          prev_active_gs_fingers_,
                                          fingers,
                                          prev_gesture_type_,
@@ -3207,7 +3208,7 @@
       break;
     }
     case kGestureTypeFling: {
-      scroll_manager_.ComputeFling(state_buffer_, scroll_buffer_, &result_);
+      scroll_manager_.FillResultFling(state_buffer_, scroll_buffer_, &result_);
       break;
     }
     case kGestureTypeSwipe:
diff --git a/src/multitouch_mouse_interpreter.cc b/src/multitouch_mouse_interpreter.cc
index 6ae1480..4cd5af7 100644
--- a/src/multitouch_mouse_interpreter.cc
+++ b/src/multitouch_mouse_interpreter.cc
@@ -173,7 +173,7 @@
   if (should_fling_ && AnyGesturingFingerLeft(*state_buffer_.Get(0),
                                               prev_gs_fingers_)) {
     current_gesture_type_ = kGestureTypeFling;
-    scroll_manager_.ComputeFling(state_buffer_, scroll_buffer_, &result);
+    scroll_manager_.FillResultFling(state_buffer_, scroll_buffer_, &result);
     if (result.type == kGestureTypeFling)
       result.details.fling.vx = 0.0;
     if (result.details.fling.vy == 0.0)
@@ -194,7 +194,7 @@
     // * Finger movements after button goes up
 
     bool update_scroll_buffer =
-        scroll_manager_.ComputeScroll(state_buffer_,
+        scroll_manager_.FillResultScroll(state_buffer_,
                                       prev_gs_fingers_,
                                       gs_fingers_,
                                       prev_gesture_type_,