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 51c28aa406042f57fed6562efd9c550582f7a982..1ab65e7fa8733a96fadce29efaa916fd17701690 100644 |
| --- a/content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| +++ b/content/browser/renderer_host/input/synthetic_gesture_controller.cc |
| @@ -16,11 +16,13 @@ |
| namespace content { |
| SyntheticGestureController::SyntheticGestureController( |
| - 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) {} |
| + Delegate* delegate, |
| + std::unique_ptr<SyntheticGestureTarget> gesture_target) |
| + : delegate_(delegate), |
| + gesture_target_(std::move(gesture_target)), |
| + weak_ptr_factory_(this) { |
| + DCHECK(delegate_); |
| +} |
| SyntheticGestureController::~SyntheticGestureController() {} |
| @@ -38,6 +40,12 @@ void SyntheticGestureController::QueueSyntheticGesture( |
| StartGesture(*pending_gesture_queue_.FrontGesture()); |
| } |
| +void SyntheticGestureController::RequestBeginFrame() { |
| + delegate_->RequestBeginFrameForSynthesizedInput( |
| + base::BindOnce(&SyntheticGestureController::OnBeginFrame, |
| + weak_ptr_factory_.GetWeakPtr())); |
| +} |
| + |
| void SyntheticGestureController::OnBeginFrame() { |
| // TODO(sad): Instead of dispatching the events immediately, dispatch after an |
| // offset. |
| @@ -49,19 +57,26 @@ bool SyntheticGestureController::DispatchNextEvent(base::TimeTicks timestamp) { |
| if (pending_gesture_queue_.IsEmpty()) |
| return false; |
| - SyntheticGesture::Result result = |
| - pending_gesture_queue_.FrontGesture()->ForwardInputEvents( |
| - timestamp, gesture_target_.get()); |
| + if (!pending_gesture_queue_.is_current_gesture_complete()) { |
| + SyntheticGesture::Result result = |
| + pending_gesture_queue_.FrontGesture()->ForwardInputEvents( |
| + timestamp, gesture_target_.get()); |
| - if (result == SyntheticGesture::GESTURE_RUNNING) { |
| - begin_frame_callback_.Run( |
| - base::BindOnce(&SyntheticGestureController::OnBeginFrame, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + if (result == SyntheticGesture::GESTURE_RUNNING) { |
| + RequestBeginFrame(); |
| + return true; |
| + } |
| + pending_gesture_queue_.mark_current_gesture_complete(result); |
| + } |
| + |
| + if (!delegate_->HasGestureStopped()) { |
| + RequestBeginFrame(); |
|
dtapuska
2017/05/19 13:20:36
This will still add an additional frame of latency
tdresser
2017/05/19 13:53:32
Yup, this should be fine.
sadrul
2017/05/19 16:55:49
This will add at most one frame to the end of the
|
| return true; |
| } |
| StopGesture(*pending_gesture_queue_.FrontGesture(), |
| - pending_gesture_queue_.FrontCallback(), result); |
| + pending_gesture_queue_.FrontCallback(), |
| + pending_gesture_queue_.current_gesture_result()); |
| pending_gesture_queue_.Pop(); |
| if (pending_gesture_queue_.IsEmpty()) |
| return false; |
| @@ -73,9 +88,7 @@ void SyntheticGestureController::StartGesture(const SyntheticGesture& gesture) { |
| TRACE_EVENT_ASYNC_BEGIN0("input,benchmark", |
| "SyntheticGestureController::running", |
| &gesture); |
| - begin_frame_callback_.Run( |
| - base::BindOnce(&SyntheticGestureController::OnBeginFrame, |
| - weak_ptr_factory_.GetWeakPtr())); |
| + RequestBeginFrame(); |
| } |
| void SyntheticGestureController::StopGesture( |