Chromium Code Reviews| Index: content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| diff --git a/content/browser/renderer_host/input/synthetic_gesture_controller.cc b/content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| index 9e5bc84403eb18e01f09e43b26b9db51fbd20211..6b2155ec495168a5f17e9df9ae79acdcc1b5f6da 100644 |
| --- a/content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| +++ b/content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| @@ -6,6 +6,7 @@ |
| #include <utility> |
| +#include "base/threading/thread_task_runner_handle.h" |
| #include "base/trace_event/trace_event.h" |
| #include "content/browser/renderer_host/input/synthetic_gesture_target.h" |
| #include "content/common/input/synthetic_smooth_scroll_gesture_params.h" |
| @@ -15,8 +16,11 @@ |
| namespace content { |
| SyntheticGestureController::SyntheticGestureController( |
| - std::unique_ptr<SyntheticGestureTarget> gesture_target) |
| - : gesture_target_(std::move(gesture_target)) {} |
| + std::unique_ptr<SyntheticGestureTarget> gesture_target, |
| + BeginFrameRequestCallback begin_frame_callback) |
| + : gesture_target_(std::move(gesture_target)), |
| + begin_frame_callback_(std::move(begin_frame_callback)), |
| + weak_ptr_factory_(this) {} |
| SyntheticGestureController::~SyntheticGestureController() {} |
| @@ -34,51 +38,44 @@ void SyntheticGestureController::QueueSyntheticGesture( |
| StartGesture(*pending_gesture_queue_.FrontGesture()); |
| } |
| -void SyntheticGestureController::Flush(base::TimeTicks timestamp) { |
| +void SyntheticGestureController::OnBeginFrame() { |
| + // TODO(sad): Instead of dispatching the events immediately, dispatch after an |
| + // offset. |
| + DispatchNextEvent(); |
| +} |
| + |
| +bool SyntheticGestureController::DispatchNextEvent(base::TimeTicks timestamp) { |
| TRACE_EVENT0("input", "SyntheticGestureController::Flush"); |
| if (pending_gesture_queue_.IsEmpty()) |
| - return; |
| - |
| - if (pending_gesture_result_) |
|
dtapuska
2017/05/16 14:39:41
Doesn't removing the pending_gesture_result_ not c
dtapuska
2017/05/16 14:40:52
Ugh; no this submitted the wrong comment. I looke
sadrul
2017/05/16 17:35:05
Yep, done.
|
| - return; |
| + return false; |
| SyntheticGesture* gesture = pending_gesture_queue_.FrontGesture(); |
|
dtapuska
2017/05/16 14:39:41
Do we need this variable on the stack? I feel some
sadrul
2017/05/16 17:35:05
Done.
|
| SyntheticGesture::Result result = |
| gesture->ForwardInputEvents(timestamp, gesture_target_.get()); |
| if (result == SyntheticGesture::GESTURE_RUNNING) { |
| - gesture_target_->SetNeedsFlush(); |
| - return; |
| + begin_frame_callback_.Run( |
| + base::BindOnce(&SyntheticGestureController::OnBeginFrame, |
| + weak_ptr_factory_.GetWeakPtr())); |
| + return true; |
| } |
| - // It's possible that all events generated by the gesture have been fully |
| - // dispatched at this point, in which case |OnDidFlushInput()| was called |
| - // before |pending_gesture_result_| was initialized. Requesting another flush |
| - // will trigger the necessary gesture-ending call to |OnDidFlushInput()|. |
| - pending_gesture_result_.reset(new SyntheticGesture::Result(result)); |
| - gesture_target_->SetNeedsFlush(); |
| -} |
| - |
| -void SyntheticGestureController::OnDidFlushInput() { |
| - if (!pending_gesture_result_) |
| - return; |
| - |
| - DCHECK(!pending_gesture_queue_.IsEmpty()); |
| - auto pending_gesture_result = std::move(pending_gesture_result_); |
| StopGesture(*pending_gesture_queue_.FrontGesture(), |
| - pending_gesture_queue_.FrontCallback(), |
| - *pending_gesture_result); |
| + pending_gesture_queue_.FrontCallback(), result); |
| pending_gesture_queue_.Pop(); |
| - |
| - if (!pending_gesture_queue_.IsEmpty()) |
| - StartGesture(*pending_gesture_queue_.FrontGesture()); |
| + if (pending_gesture_queue_.IsEmpty()) |
| + return false; |
| + StartGesture(*pending_gesture_queue_.FrontGesture()); |
| + return true; |
| } |
| void SyntheticGestureController::StartGesture(const SyntheticGesture& gesture) { |
| TRACE_EVENT_ASYNC_BEGIN0("input,benchmark", |
| "SyntheticGestureController::running", |
| &gesture); |
| - gesture_target_->SetNeedsFlush(); |
| + begin_frame_callback_.Run( |
| + base::BindOnce(&SyntheticGestureController::OnBeginFrame, |
| + weak_ptr_factory_.GetWeakPtr())); |
| } |
| void SyntheticGestureController::StopGesture( |