Commit 86ae1baf authored by Dave Tapuska's avatar Dave Tapuska Committed by Commit Bot

Fix DCHECK in destroying MainThreadEventQueue.

The OneShotTimer needs to be destroyed on the main thread. Destroy it
during ClearClient.

BUG=1112931

Change-Id: I9fb7946947943f7ff2a5bbb19d7ae1af94335b08
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2347392
Commit-Queue: Dave Tapuska <dtapuska@chromium.org>
Reviewed-by: default avatarDavid Bokan <bokan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796850}
parent 8575795b
......@@ -246,9 +246,9 @@ MainThreadEventQueue::MainThreadEventQueue(
needs_unbuffered_input_for_debugger_(false),
allow_raf_aligned_input_(allow_raf_aligned_input),
main_task_runner_(main_task_runner),
main_thread_scheduler_(main_thread_scheduler),
use_raf_fallback_timer_(true) {
raf_fallback_timer_.SetTaskRunner(main_task_runner);
main_thread_scheduler_(main_thread_scheduler) {
raf_fallback_timer_ = std::make_unique<base::OneShotTimer>();
raf_fallback_timer_->SetTaskRunner(main_task_runner);
event_predictor_ = std::make_unique<InputEventPrediction>(
base::FeatureList::IsEnabled(blink::features::kResamplingInputEvents));
......@@ -508,8 +508,13 @@ void MainThreadEventQueue::RafFallbackTimerFired() {
DispatchRafAlignedInput(base::TimeTicks::Now());
}
void MainThreadEventQueue::ClearRafFallbackTimerForTesting() {
raf_fallback_timer_.reset();
}
void MainThreadEventQueue::DispatchRafAlignedInput(base::TimeTicks frame_time) {
raf_fallback_timer_.Stop();
if (raf_fallback_timer_)
raf_fallback_timer_->Stop();
size_t queue_size_at_start;
// Record the queue size so that we only process
......@@ -676,8 +681,8 @@ bool MainThreadEventQueue::HandleEventOnMainThread(
void MainThreadEventQueue::SetNeedsMainFrame() {
if (main_task_runner_->BelongsToCurrentThread()) {
if (use_raf_fallback_timer_) {
raf_fallback_timer_.Start(
if (raf_fallback_timer_) {
raf_fallback_timer_->Start(
FROM_HERE, kMaxRafDelay,
base::BindOnce(&MainThreadEventQueue::RafFallbackTimerFired, this));
}
......@@ -696,6 +701,7 @@ void MainThreadEventQueue::SetNeedsMainFrame() {
void MainThreadEventQueue::ClearClient() {
DCHECK(main_task_runner_->BelongsToCurrentThread());
client_ = nullptr;
raf_fallback_timer_.reset();
}
void MainThreadEventQueue::SetNeedsLowLatency(bool low_latency) {
......
......@@ -141,9 +141,7 @@ class PLATFORM_EXPORT MainThreadEventQueue
const std::unique_ptr<MainThreadEventQueueTask>& item) const;
void RafFallbackTimerFired();
void set_use_raf_fallback_timer(bool use_timer) {
use_raf_fallback_timer_ = use_timer;
}
void ClearRafFallbackTimerForTesting();
friend class QueuedWebInputEvent;
friend class MainThreadEventQueueTest;
......@@ -175,8 +173,10 @@ class PLATFORM_EXPORT MainThreadEventQueue
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scheduler::WebThreadScheduler* main_thread_scheduler_;
base::OneShotTimer raf_fallback_timer_;
bool use_raf_fallback_timer_;
// A safe guard timer to ensure input is always processed. A BeginMainFrame
// signal might not always occur if our visibility changed.
std::unique_ptr<base::OneShotTimer> raf_fallback_timer_;
std::unique_ptr<InputEventPrediction> event_predictor_;
......
......@@ -185,7 +185,7 @@ class MainThreadEventQueueTest : public testing::Test,
void SetUp() override {
queue_ = new MainThreadEventQueue(this, main_task_runner_,
&thread_scheduler_, true);
queue_->set_use_raf_fallback_timer(false);
queue_->ClearRafFallbackTimerForTesting();
}
void HandleEvent(WebInputEvent& event,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment