Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(974)

Unified Diff: content/browser/renderer_host/input/synthetic_gesture_controller.cc

Issue 2886263002: input: Dispatch synthesized events at regular intervals. (Closed)
Patch Set: . Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/input/synthetic_gesture_controller.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1ab65e7fa8733a96fadce29efaa916fd17701690..d3ffa6a61297ff96d3515a8957a6d617c3d0bd6a 100644
--- a/content/browser/renderer_host/input/synthetic_gesture_controller.cc
+++ b/content/browser/renderer_host/input/synthetic_gesture_controller.cc
@@ -40,16 +40,35 @@ void SyntheticGestureController::QueueSyntheticGesture(
StartGesture(*pending_gesture_queue_.FrontGesture());
}
-void SyntheticGestureController::RequestBeginFrame() {
+void SyntheticGestureController::RequestBeginFrameIfNecessary() {
+ if (dispatch_timer_.IsRunning())
+ return;
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.
- DispatchNextEvent();
+ constexpr base::TimeDelta kSynthesizedDispatchDelay =
dtapuska 2017/05/19 18:32:27 I think we need an explanation around why 2 is a *
sadrul 2017/05/19 18:46:03 Added a note. PTAL.
+ base::TimeDelta::FromMilliseconds(2);
+ base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+ FROM_HERE,
+ base::BindOnce(&SyntheticGestureController::StartTimer,
+ weak_ptr_factory_.GetWeakPtr()),
+ kSynthesizedDispatchDelay);
+}
+
+void SyntheticGestureController::StartTimer() {
+ // TODO(sad): Change the interval to allow sending multiple events per begin
+ // frame.
+ dispatch_timer_.Start(
+ FROM_HERE, base::TimeDelta::FromMicroseconds(16666),
+ base::BindRepeating(
+ [](base::WeakPtr<SyntheticGestureController> weak_ptr) {
+ if (weak_ptr)
+ weak_ptr->DispatchNextEvent(base::TimeTicks::Now());
+ },
+ weak_ptr_factory_.GetWeakPtr()));
}
bool SyntheticGestureController::DispatchNextEvent(base::TimeTicks timestamp) {
@@ -63,14 +82,14 @@ bool SyntheticGestureController::DispatchNextEvent(base::TimeTicks timestamp) {
timestamp, gesture_target_.get());
if (result == SyntheticGesture::GESTURE_RUNNING) {
- RequestBeginFrame();
+ RequestBeginFrameIfNecessary();
dtapuska 2017/05/19 18:32:27 Could this be a DCHECK(dispatch_timer_.IsRunning()
sadrul 2017/05/19 18:46:03 I had a DCHECK() at the beginning of the function
sadrul 2017/05/19 19:02:49 I have gone ahead and added the DCHECK() back, and
return true;
}
pending_gesture_queue_.mark_current_gesture_complete(result);
}
if (!delegate_->HasGestureStopped()) {
- RequestBeginFrame();
+ RequestBeginFrameIfNecessary();
dtapuska 2017/05/19 18:32:27 same here.
return true;
}
@@ -78,8 +97,10 @@ bool SyntheticGestureController::DispatchNextEvent(base::TimeTicks timestamp) {
pending_gesture_queue_.FrontCallback(),
pending_gesture_queue_.current_gesture_result());
pending_gesture_queue_.Pop();
- if (pending_gesture_queue_.IsEmpty())
+ if (pending_gesture_queue_.IsEmpty()) {
+ dispatch_timer_.Stop();
return false;
+ }
StartGesture(*pending_gesture_queue_.FrontGesture());
return true;
}
@@ -88,7 +109,7 @@ void SyntheticGestureController::StartGesture(const SyntheticGesture& gesture) {
TRACE_EVENT_ASYNC_BEGIN0("input,benchmark",
"SyntheticGestureController::running",
&gesture);
- RequestBeginFrame();
+ RequestBeginFrameIfNecessary();
}
void SyntheticGestureController::StopGesture(
« no previous file with comments | « content/browser/renderer_host/input/synthetic_gesture_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698