Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "platform/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "platform/scheduler/renderer/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/debug/stack_trace.h" | 8 #include "base/debug/stack_trace.h" |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| (...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 461 | 461 |
| 462 bool RendererSchedulerImpl::PolicyNeedsUpdateForTesting() { | 462 bool RendererSchedulerImpl::PolicyNeedsUpdateForTesting() { |
| 463 return policy_may_need_update_.IsSet(); | 463 return policy_may_need_update_.IsSet(); |
| 464 } | 464 } |
| 465 | 465 |
| 466 // static | 466 // static |
| 467 bool RendererSchedulerImpl::ShouldPrioritizeInputEvent( | 467 bool RendererSchedulerImpl::ShouldPrioritizeInputEvent( |
| 468 const blink::WebInputEvent& web_input_event) { | 468 const blink::WebInputEvent& web_input_event) { |
| 469 // We regard MouseMove events with the left mouse button down as a signal | 469 // We regard MouseMove events with the left mouse button down as a signal |
| 470 // that the user is doing something requiring a smooth frame rate. | 470 // that the user is doing something requiring a smooth frame rate. |
| 471 if (web_input_event.type == blink::WebInputEvent::MouseMove && | 471 if ((web_input_event.type == blink::WebInputEvent::MouseDown || |
|
alex clarke (OOO till 29th)
2016/08/22 11:30:09
Are we going to start blocking expensive tasks if
Sami
2016/08/22 13:25:14
Right, we wouldn't want to do blocking based on a
| |
| 472 web_input_event.type == blink::WebInputEvent::MouseMove) && | |
| 472 (web_input_event.modifiers & blink::WebInputEvent::LeftButtonDown)) { | 473 (web_input_event.modifiers & blink::WebInputEvent::LeftButtonDown)) { |
| 473 return true; | 474 return true; |
| 474 } | 475 } |
| 475 // Ignore all other mouse events because they probably don't signal user | 476 // Ignore all other mouse events because they probably don't signal user |
| 476 // interaction needing a smooth framerate. NOTE isMouseEventType returns false | 477 // interaction needing a smooth framerate. NOTE isMouseEventType returns false |
| 477 // for mouse wheel events, hence we regard them as user input. | 478 // for mouse wheel events, hence we regard them as user input. |
| 478 // Ignore keyboard events because it doesn't really make sense to enter | 479 // Ignore keyboard events because it doesn't really make sense to enter |
| 479 // compositor priority for them. | 480 // compositor priority for them. |
| 480 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) || | 481 if (blink::WebInputEvent::isMouseEventType(web_input_event.type) || |
| 481 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) { | 482 blink::WebInputEvent::isKeyboardEventType(web_input_event.type)) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 521 UseCase previous_use_case = | 522 UseCase previous_use_case = |
| 522 ComputeCurrentUseCase(now, &unused_policy_duration); | 523 ComputeCurrentUseCase(now, &unused_policy_duration); |
| 523 bool was_awaiting_touch_start_response = | 524 bool was_awaiting_touch_start_response = |
| 524 AnyThread().awaiting_touch_start_response; | 525 AnyThread().awaiting_touch_start_response; |
| 525 | 526 |
| 526 AnyThread().user_model.DidStartProcessingInputEvent(type, now); | 527 AnyThread().user_model.DidStartProcessingInputEvent(type, now); |
| 527 | 528 |
| 528 if (input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR) | 529 if (input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR) |
| 529 AnyThread().user_model.DidFinishProcessingInputEvent(now); | 530 AnyThread().user_model.DidFinishProcessingInputEvent(now); |
| 530 | 531 |
| 531 if (type) { | 532 if (type != blink::WebInputEvent::Undefined) { |
|
alex clarke (OOO till 29th)
2016/08/22 11:30:09
Perhaps handle this as a case in the switch?
Sami
2016/08/22 13:25:15
Good idea -- makes more sense that way.
| |
| 532 switch (type) { | 533 switch (type) { |
| 533 case blink::WebInputEvent::TouchStart: | 534 case blink::WebInputEvent::TouchStart: |
| 534 AnyThread().awaiting_touch_start_response = true; | 535 AnyThread().awaiting_touch_start_response = true; |
| 535 // This is just a fail-safe to reset the state of | 536 // This is just a fail-safe to reset the state of |
| 536 // |last_gesture_was_compositor_driven| to the default. We don't know | 537 // |last_gesture_was_compositor_driven| to the default. We don't know |
| 537 // yet where the gesture will run. | 538 // yet where the gesture will run. |
| 538 AnyThread().last_gesture_was_compositor_driven = false; | 539 AnyThread().last_gesture_was_compositor_driven = false; |
| 539 AnyThread().have_seen_touchstart = true; | 540 AnyThread().have_seen_touchstart = true; |
| 540 // Assume the default gesture is prevented until we see evidence | 541 // Assume the default gesture is prevented until we see evidence |
| 541 // otherwise. | 542 // otherwise. |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 569 AnyThread().fling_compositor_escalation_deadline = base::TimeTicks(); | 570 AnyThread().fling_compositor_escalation_deadline = base::TimeTicks(); |
| 570 break; | 571 break; |
| 571 | 572 |
| 572 case blink::WebInputEvent::GestureTapDown: | 573 case blink::WebInputEvent::GestureTapDown: |
| 573 case blink::WebInputEvent::GestureShowPress: | 574 case blink::WebInputEvent::GestureShowPress: |
| 574 case blink::WebInputEvent::GestureScrollEnd: | 575 case blink::WebInputEvent::GestureScrollEnd: |
| 575 // With no observable effect, these meta events do not indicate a | 576 // With no observable effect, these meta events do not indicate a |
| 576 // meaningful touchstart response and should not impact task priority. | 577 // meaningful touchstart response and should not impact task priority. |
| 577 break; | 578 break; |
| 578 | 579 |
| 580 case blink::WebInputEvent::MouseDown: | |
| 581 // Reset tracking state at the start of a new mouse drag gesture. | |
| 582 AnyThread().last_gesture_was_compositor_driven = false; | |
| 583 AnyThread().default_gesture_prevented = true; | |
| 584 break; | |
| 585 | |
| 586 case blink::WebInputEvent::MouseMove: | |
| 587 // Consider mouse movement with the left button held down (see | |
| 588 // ShouldPrioritizeInputEvent) similarly to a touch gesture. | |
| 589 AnyThread().last_gesture_was_compositor_driven = | |
| 590 input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR; | |
| 591 AnyThread().awaiting_touch_start_response = false; | |
| 592 break; | |
| 593 | |
| 579 default: | 594 default: |
| 580 AnyThread().awaiting_touch_start_response = false; | 595 AnyThread().awaiting_touch_start_response = false; |
| 581 break; | 596 break; |
| 582 } | 597 } |
| 583 } | 598 } |
| 584 | 599 |
| 585 // Avoid unnecessary policy updates if the use case did not change. | 600 // Avoid unnecessary policy updates if the use case did not change. |
| 586 UseCase use_case = ComputeCurrentUseCase(now, &unused_policy_duration); | 601 UseCase use_case = ComputeCurrentUseCase(now, &unused_policy_duration); |
| 587 | 602 |
| 588 if (use_case != previous_use_case || | 603 if (use_case != previous_use_case || |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1012 // Yes a gesture has been established. Based on how the gesture is handled | 1027 // Yes a gesture has been established. Based on how the gesture is handled |
| 1013 // we need to choose between one of four use cases: | 1028 // we need to choose between one of four use cases: |
| 1014 // 1. COMPOSITOR_GESTURE where the gesture is processed only on the | 1029 // 1. COMPOSITOR_GESTURE where the gesture is processed only on the |
| 1015 // compositor thread. | 1030 // compositor thread. |
| 1016 // 2. MAIN_THREAD_GESTURE where the gesture is processed only on the main | 1031 // 2. MAIN_THREAD_GESTURE where the gesture is processed only on the main |
| 1017 // thread. | 1032 // thread. |
| 1018 // 3. MAIN_THREAD_CUSTOM_INPUT_HANDLING where the main thread processes a | 1033 // 3. MAIN_THREAD_CUSTOM_INPUT_HANDLING where the main thread processes a |
| 1019 // stream of input events and has prevented a default gesture from being | 1034 // stream of input events and has prevented a default gesture from being |
| 1020 // started. | 1035 // started. |
| 1021 // 4. SYNCHRONIZED_GESTURE where the gesture is processed on both threads. | 1036 // 4. SYNCHRONIZED_GESTURE where the gesture is processed on both threads. |
| 1022 // TODO(skyostil): Consider removing in_idle_period_ and | |
| 1023 // HadAnIdlePeriodRecently() unless we need them here. | |
| 1024 if (AnyThread().last_gesture_was_compositor_driven) { | 1037 if (AnyThread().last_gesture_was_compositor_driven) { |
| 1025 if (AnyThread().begin_main_frame_on_critical_path) { | 1038 if (AnyThread().begin_main_frame_on_critical_path) { |
| 1026 return UseCase::SYNCHRONIZED_GESTURE; | 1039 return UseCase::SYNCHRONIZED_GESTURE; |
| 1027 } else { | 1040 } else { |
| 1028 return UseCase::COMPOSITOR_GESTURE; | 1041 return UseCase::COMPOSITOR_GESTURE; |
| 1029 } | 1042 } |
| 1030 } | 1043 } |
| 1031 if (AnyThread().default_gesture_prevented) { | 1044 if (AnyThread().default_gesture_prevented) { |
| 1032 return UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING; | 1045 return UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING; |
| 1033 } else { | 1046 } else { |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1274 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), | 1287 TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
| 1275 "RendererSchedulerImpl::OnNavigationStarted"); | 1288 "RendererSchedulerImpl::OnNavigationStarted"); |
| 1276 base::AutoLock lock(any_thread_lock_); | 1289 base::AutoLock lock(any_thread_lock_); |
| 1277 AnyThread().rails_loading_priority_deadline = | 1290 AnyThread().rails_loading_priority_deadline = |
| 1278 helper_.scheduler_tqm_delegate()->NowTicks() + | 1291 helper_.scheduler_tqm_delegate()->NowTicks() + |
| 1279 base::TimeDelta::FromMilliseconds( | 1292 base::TimeDelta::FromMilliseconds( |
| 1280 kRailsInitialLoadingPrioritizationMillis); | 1293 kRailsInitialLoadingPrioritizationMillis); |
| 1281 ResetForNavigationLocked(); | 1294 ResetForNavigationLocked(); |
| 1282 } | 1295 } |
| 1283 | 1296 |
| 1284 bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const { | |
| 1285 return (now - AnyThread().last_idle_period_end_time) <= | |
| 1286 base::TimeDelta::FromMilliseconds( | |
| 1287 kIdlePeriodStarvationThresholdMillis); | |
| 1288 } | |
| 1289 | |
| 1290 void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() { | 1297 void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() { |
| 1291 DCHECK(MainThreadOnly().renderer_backgrounded); | 1298 DCHECK(MainThreadOnly().renderer_backgrounded); |
| 1292 if (MainThreadOnly().timer_queue_suspended_when_backgrounded) | 1299 if (MainThreadOnly().timer_queue_suspended_when_backgrounded) |
| 1293 return; | 1300 return; |
| 1294 | 1301 |
| 1295 MainThreadOnly().timer_queue_suspended_when_backgrounded = true; | 1302 MainThreadOnly().timer_queue_suspended_when_backgrounded = true; |
| 1296 ForceUpdatePolicy(); | 1303 ForceUpdatePolicy(); |
| 1297 } | 1304 } |
| 1298 | 1305 |
| 1299 void RendererSchedulerImpl::ResumeTimerQueueWhenForegrounded() { | 1306 void RendererSchedulerImpl::ResumeTimerQueueWhenForegrounded() { |
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1488 case v8::PERFORMANCE_LOAD: | 1495 case v8::PERFORMANCE_LOAD: |
| 1489 return "load"; | 1496 return "load"; |
| 1490 default: | 1497 default: |
| 1491 NOTREACHED(); | 1498 NOTREACHED(); |
| 1492 return nullptr; | 1499 return nullptr; |
| 1493 } | 1500 } |
| 1494 } | 1501 } |
| 1495 | 1502 |
| 1496 } // namespace scheduler | 1503 } // namespace scheduler |
| 1497 } // namespace blink | 1504 } // namespace blink |
| OLD | NEW |