Index: content/renderer/input/main_thread_event_queue.cc |
diff --git a/content/renderer/input/main_thread_event_queue.cc b/content/renderer/input/main_thread_event_queue.cc |
index 94d1d49ea111c0c446852a4f64f44468014625ba..2d68d9e0717b1a42ea99b7751c069fd118097482 100644 |
--- a/content/renderer/input/main_thread_event_queue.cc |
+++ b/content/renderer/input/main_thread_event_queue.cc |
@@ -16,6 +16,8 @@ namespace content { |
namespace { |
const size_t kTenSeconds = 10 * 1000 * 1000; |
+const base::TimeDelta kMaxRafDelay = |
+ base::TimeDelta::FromMilliseconds(5 * 1000); |
class QueuedClosure : public MainThreadEventQueueTask { |
public: |
@@ -406,10 +408,17 @@ static bool IsAsyncTouchMove( |
return touch_event.moved_beyond_slop_region && !event->originallyCancelable(); |
} |
+void MainThreadEventQueue::RafFallbackTimerFired() { |
+ UMA_HISTOGRAM_BOOLEAN("Event.MainThreadEventQueue.FlushQueueNoBeginMainFrame", |
+ true); |
+ DispatchRafAlignedInput(base::TimeTicks::Now()); |
+} |
+ |
void MainThreadEventQueue::DispatchRafAlignedInput(base::TimeTicks frame_time) { |
if (IsRafAlignedInputDisabled()) |
return; |
+ raf_fallback_timer_.Stop(); |
size_t queue_size_at_start; |
// Record the queue size so that we only process |
@@ -529,6 +538,9 @@ void MainThreadEventQueue::SendInputEventAck(const blink::WebInputEvent& event, |
void MainThreadEventQueue::SetNeedsMainFrame() { |
if (main_task_runner_->BelongsToCurrentThread()) { |
+ raf_fallback_timer_.Start( |
+ FROM_HERE, kMaxRafDelay, |
+ base::Bind(&MainThreadEventQueue::RafFallbackTimerFired, this)); |
if (client_) |
client_->SetNeedsMainFrame(); |
return; |