OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/input/main_thread_event_queue.h" | 5 #include "content/renderer/input/main_thread_event_queue.h" |
6 | 6 |
7 #include "base/metrics/field_trial.h" | 7 #include "base/metrics/field_trial.h" |
8 #include "base/metrics/histogram_macros.h" | 8 #include "base/metrics/histogram_macros.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "content/common/input/event_with_latency_info.h" | 10 #include "content/common/input/event_with_latency_info.h" |
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 base::AutoLock lock(shared_state_lock_); | 337 base::AutoLock lock(shared_state_lock_); |
338 shared_state_.events_.Queue(std::move(item)); | 338 shared_state_.events_.Queue(std::move(item)); |
339 needs_post_task = !shared_state_.sent_post_task_; | 339 needs_post_task = !shared_state_.sent_post_task_; |
340 shared_state_.sent_post_task_ = true; | 340 shared_state_.sent_post_task_ = true; |
341 } | 341 } |
342 | 342 |
343 if (needs_post_task) | 343 if (needs_post_task) |
344 PostTaskToMainThread(); | 344 PostTaskToMainThread(); |
345 } | 345 } |
346 | 346 |
347 void MainThreadEventQueue::DispatchInFlightEvent() { | |
348 if (in_flight_event_) { | |
349 in_flight_event_->Dispatch(this); | |
350 in_flight_event_.reset(); | |
351 } | |
352 } | |
353 | |
354 void MainThreadEventQueue::PossiblyScheduleMainFrame() { | 347 void MainThreadEventQueue::PossiblyScheduleMainFrame() { |
355 if (IsRafAlignedInputDisabled()) | 348 if (IsRafAlignedInputDisabled()) |
356 return; | 349 return; |
357 bool needs_main_frame = false; | 350 bool needs_main_frame = false; |
358 { | 351 { |
359 base::AutoLock lock(shared_state_lock_); | 352 base::AutoLock lock(shared_state_lock_); |
360 if (!shared_state_.sent_main_frame_request_ && | 353 if (!shared_state_.sent_main_frame_request_ && |
361 !shared_state_.events_.empty() && | 354 !shared_state_.events_.empty() && |
362 IsRafAlignedEvent(shared_state_.events_.front())) { | 355 IsRafAlignedEvent(shared_state_.events_.front())) { |
363 needs_main_frame = true; | 356 needs_main_frame = true; |
(...skipping 15 matching lines...) Expand all Loading... |
379 events_to_process = shared_state_.events_.size(); | 372 events_to_process = shared_state_.events_.size(); |
380 | 373 |
381 // Don't process rAF aligned events at tail of queue. | 374 // Don't process rAF aligned events at tail of queue. |
382 while (events_to_process > 0 && | 375 while (events_to_process > 0 && |
383 IsRafAlignedEvent(shared_state_.events_.at(events_to_process - 1))) { | 376 IsRafAlignedEvent(shared_state_.events_.at(events_to_process - 1))) { |
384 --events_to_process; | 377 --events_to_process; |
385 } | 378 } |
386 } | 379 } |
387 | 380 |
388 while (events_to_process--) { | 381 while (events_to_process--) { |
| 382 std::unique_ptr<MainThreadEventQueueTask> task; |
389 { | 383 { |
390 base::AutoLock lock(shared_state_lock_); | 384 base::AutoLock lock(shared_state_lock_); |
391 if (shared_state_.events_.empty()) | 385 if (shared_state_.events_.empty()) |
392 return; | 386 return; |
393 in_flight_event_ = shared_state_.events_.Pop(); | 387 task = shared_state_.events_.Pop(); |
394 } | 388 } |
395 | 389 |
396 // Dispatching the event is outside of critical section. | 390 // Dispatching the event is outside of critical section. |
397 DispatchInFlightEvent(); | 391 task->Dispatch(this); |
398 } | 392 } |
399 PossiblyScheduleMainFrame(); | 393 PossiblyScheduleMainFrame(); |
400 } | 394 } |
401 | 395 |
402 static bool IsAsyncTouchMove( | 396 static bool IsAsyncTouchMove( |
403 const std::unique_ptr<MainThreadEventQueueTask>& queued_item) { | 397 const std::unique_ptr<MainThreadEventQueueTask>& queued_item) { |
404 if (!queued_item->IsWebInputEvent()) | 398 if (!queued_item->IsWebInputEvent()) |
405 return false; | 399 return false; |
406 const QueuedWebInputEvent* event = | 400 const QueuedWebInputEvent* event = |
407 static_cast<const QueuedWebInputEvent*>(queued_item.get()); | 401 static_cast<const QueuedWebInputEvent*>(queued_item.get()); |
(...skipping 12 matching lines...) Expand all Loading... |
420 | 414 |
421 // Record the queue size so that we only process | 415 // Record the queue size so that we only process |
422 // that maximum number of events. | 416 // that maximum number of events. |
423 { | 417 { |
424 base::AutoLock lock(shared_state_lock_); | 418 base::AutoLock lock(shared_state_lock_); |
425 shared_state_.sent_main_frame_request_ = false; | 419 shared_state_.sent_main_frame_request_ = false; |
426 queue_size_at_start = shared_state_.events_.size(); | 420 queue_size_at_start = shared_state_.events_.size(); |
427 } | 421 } |
428 | 422 |
429 while (queue_size_at_start--) { | 423 while (queue_size_at_start--) { |
| 424 std::unique_ptr<MainThreadEventQueueTask> task; |
430 { | 425 { |
431 base::AutoLock lock(shared_state_lock_); | 426 base::AutoLock lock(shared_state_lock_); |
432 | 427 |
433 if (shared_state_.events_.empty()) | 428 if (shared_state_.events_.empty()) |
434 return; | 429 return; |
435 | 430 |
436 if (IsRafAlignedEvent(shared_state_.events_.front())) { | 431 if (IsRafAlignedEvent(shared_state_.events_.front())) { |
437 // Throttle touchmoves that are async. | 432 // Throttle touchmoves that are async. |
438 if (handle_raf_aligned_touch_input_ && | 433 if (handle_raf_aligned_touch_input_ && |
439 IsAsyncTouchMove(shared_state_.events_.front())) { | 434 IsAsyncTouchMove(shared_state_.events_.front())) { |
440 if (shared_state_.events_.size() == 1 && | 435 if (shared_state_.events_.size() == 1 && |
441 frame_time < shared_state_.last_async_touch_move_timestamp_ + | 436 frame_time < shared_state_.last_async_touch_move_timestamp_ + |
442 kAsyncTouchMoveInterval) { | 437 kAsyncTouchMoveInterval) { |
443 break; | 438 break; |
444 } | 439 } |
445 shared_state_.last_async_touch_move_timestamp_ = frame_time; | 440 shared_state_.last_async_touch_move_timestamp_ = frame_time; |
446 } | 441 } |
447 } | 442 } |
448 in_flight_event_ = shared_state_.events_.Pop(); | 443 task = shared_state_.events_.Pop(); |
449 } | 444 } |
450 | |
451 // Dispatching the event is outside of critical section. | 445 // Dispatching the event is outside of critical section. |
452 DispatchInFlightEvent(); | 446 task->Dispatch(this); |
453 } | 447 } |
454 | 448 |
455 PossiblyScheduleMainFrame(); | 449 PossiblyScheduleMainFrame(); |
456 } | 450 } |
457 | 451 |
458 void MainThreadEventQueue::PostTaskToMainThread() { | 452 void MainThreadEventQueue::PostTaskToMainThread() { |
459 main_task_runner_->PostTask( | 453 main_task_runner_->PostTask( |
460 FROM_HERE, base::Bind(&MainThreadEventQueue::DispatchEvents, this)); | 454 FROM_HERE, base::Bind(&MainThreadEventQueue::DispatchEvents, this)); |
461 } | 455 } |
462 | 456 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 main_task_runner_->PostTask( | 537 main_task_runner_->PostTask( |
544 FROM_HERE, base::Bind(&MainThreadEventQueue::SetNeedsMainFrame, this)); | 538 FROM_HERE, base::Bind(&MainThreadEventQueue::SetNeedsMainFrame, this)); |
545 } | 539 } |
546 | 540 |
547 void MainThreadEventQueue::ClearClient() { | 541 void MainThreadEventQueue::ClearClient() { |
548 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 542 DCHECK(main_task_runner_->BelongsToCurrentThread()); |
549 client_ = nullptr; | 543 client_ = nullptr; |
550 } | 544 } |
551 | 545 |
552 } // namespace content | 546 } // namespace content |
OLD | NEW |