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

Side by Side Diff: cc/trees/layer_tree_host_impl.cc

Issue 210793002: Replace CurrentPhysicalTimeTicks with a fallback in CurrentFrameTimeTicks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix test Created 6 years, 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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 "cc/trees/layer_tree_host_impl.h" 5 #include "cc/trees/layer_tree_host_impl.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 9
10 #include "base/basictypes.h" 10 #include "base/basictypes.h"
(...skipping 2442 matching lines...) Expand 10 before | Expand all | Expand 10 after
2453 LayerImpl* scroll_layer_impl = active_tree_->LayerById( 2453 LayerImpl* scroll_layer_impl = active_tree_->LayerById(
2454 scroll_layer_id_when_mouse_over_scrollbar_); 2454 scroll_layer_id_when_mouse_over_scrollbar_);
2455 2455
2456 // The check for a null scroll_layer_impl below was added to see if it will 2456 // The check for a null scroll_layer_impl below was added to see if it will
2457 // eliminate the crashes described in http://crbug.com/326635. 2457 // eliminate the crashes described in http://crbug.com/326635.
2458 // TODO(wjmaclean) Add a unit test if this fixes the crashes. 2458 // TODO(wjmaclean) Add a unit test if this fixes the crashes.
2459 ScrollbarAnimationController* animation_controller = 2459 ScrollbarAnimationController* animation_controller =
2460 scroll_layer_impl ? scroll_layer_impl->scrollbar_animation_controller() 2460 scroll_layer_impl ? scroll_layer_impl->scrollbar_animation_controller()
2461 : NULL; 2461 : NULL;
2462 if (animation_controller) { 2462 if (animation_controller) {
2463 animation_controller->DidMouseMoveOffScrollbar( 2463 animation_controller->DidMouseMoveOffScrollbar(CurrentFrameTimeTicks());
2464 CurrentPhysicalTimeTicks());
2465 StartScrollbarAnimation(); 2464 StartScrollbarAnimation();
2466 } 2465 }
2467 scroll_layer_id_when_mouse_over_scrollbar_ = 0; 2466 scroll_layer_id_when_mouse_over_scrollbar_ = 0;
2468 } 2467 }
2469 2468
2470 bool scroll_on_main_thread = false; 2469 bool scroll_on_main_thread = false;
2471 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint( 2470 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
2472 device_viewport_point, InputHandler::Gesture, layer_impl, 2471 device_viewport_point, InputHandler::Gesture, layer_impl,
2473 &scroll_on_main_thread); 2472 &scroll_on_main_thread);
2474 if (scroll_on_main_thread || !scroll_layer_impl) 2473 if (scroll_on_main_thread || !scroll_layer_impl)
2475 return; 2474 return;
2476 2475
2477 ScrollbarAnimationController* animation_controller = 2476 ScrollbarAnimationController* animation_controller =
2478 scroll_layer_impl->scrollbar_animation_controller(); 2477 scroll_layer_impl->scrollbar_animation_controller();
2479 if (!animation_controller) 2478 if (!animation_controller)
2480 return; 2479 return;
2481 2480
2482 // TODO(wjmaclean) Is it ok to choose distance from more than two scrollbars? 2481 // TODO(wjmaclean) Is it ok to choose distance from more than two scrollbars?
2483 float distance_to_scrollbar = std::numeric_limits<float>::max(); 2482 float distance_to_scrollbar = std::numeric_limits<float>::max();
2484 for (LayerImpl::ScrollbarSet::iterator it = 2483 for (LayerImpl::ScrollbarSet::iterator it =
2485 scroll_layer_impl->scrollbars()->begin(); 2484 scroll_layer_impl->scrollbars()->begin();
2486 it != scroll_layer_impl->scrollbars()->end(); 2485 it != scroll_layer_impl->scrollbars()->end();
2487 ++it) 2486 ++it)
2488 distance_to_scrollbar = 2487 distance_to_scrollbar =
2489 std::min(distance_to_scrollbar, 2488 std::min(distance_to_scrollbar,
2490 DeviceSpaceDistanceToLayer(device_viewport_point, *it)); 2489 DeviceSpaceDistanceToLayer(device_viewport_point, *it));
2491 2490
2492 bool should_animate = animation_controller->DidMouseMoveNear( 2491 bool should_animate = animation_controller->DidMouseMoveNear(
2493 CurrentPhysicalTimeTicks(), distance_to_scrollbar / device_scale_factor_); 2492 CurrentFrameTimeTicks(), distance_to_scrollbar / device_scale_factor_);
2494 if (should_animate) 2493 if (should_animate)
2495 StartScrollbarAnimation(); 2494 StartScrollbarAnimation();
2496 } 2495 }
2497 2496
2498 bool LayerTreeHostImpl::HandleMouseOverScrollbar(LayerImpl* layer_impl, 2497 bool LayerTreeHostImpl::HandleMouseOverScrollbar(LayerImpl* layer_impl,
2499 const gfx::PointF& device_viewport_point) { 2498 const gfx::PointF& device_viewport_point) {
2500 if (layer_impl && layer_impl->ToScrollbarLayer()) { 2499 if (layer_impl && layer_impl->ToScrollbarLayer()) {
2501 int scroll_layer_id = layer_impl->ToScrollbarLayer()->ScrollLayerId(); 2500 int scroll_layer_id = layer_impl->ToScrollbarLayer()->ScrollLayerId();
2502 layer_impl = active_tree_->LayerById(scroll_layer_id); 2501 layer_impl = active_tree_->LayerById(scroll_layer_id);
2503 if (layer_impl && layer_impl->scrollbar_animation_controller()) { 2502 if (layer_impl && layer_impl->scrollbar_animation_controller()) {
2504 scroll_layer_id_when_mouse_over_scrollbar_ = scroll_layer_id; 2503 scroll_layer_id_when_mouse_over_scrollbar_ = scroll_layer_id;
2505 bool should_animate = 2504 bool should_animate =
2506 layer_impl->scrollbar_animation_controller()->DidMouseMoveNear( 2505 layer_impl->scrollbar_animation_controller()->DidMouseMoveNear(
2507 CurrentPhysicalTimeTicks(), 0); 2506 CurrentFrameTimeTicks(), 0);
2508 if (should_animate) 2507 if (should_animate)
2509 StartScrollbarAnimation(); 2508 StartScrollbarAnimation();
2510 } else { 2509 } else {
2511 scroll_layer_id_when_mouse_over_scrollbar_ = 0; 2510 scroll_layer_id_when_mouse_over_scrollbar_ = 0;
2512 } 2511 }
2513 2512
2514 return true; 2513 return true;
2515 } 2514 }
2516 2515
2517 return false; 2516 return false;
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
2813 TRACE_EVENT_SCOPE_THREAD); 2812 TRACE_EVENT_SCOPE_THREAD);
2814 SetNeedsRedraw(); 2813 SetNeedsRedraw();
2815 } 2814 }
2816 2815
2817 for (size_t i = 0; i < layer->children().size(); ++i) 2816 for (size_t i = 0; i < layer->children().size(); ++i)
2818 AnimateScrollbarsRecursive(layer->children()[i], time); 2817 AnimateScrollbarsRecursive(layer->children()[i], time);
2819 } 2818 }
2820 2819
2821 void LayerTreeHostImpl::StartScrollbarAnimation() { 2820 void LayerTreeHostImpl::StartScrollbarAnimation() {
2822 TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation"); 2821 TRACE_EVENT0("cc", "LayerTreeHostImpl::StartScrollbarAnimation");
2823 StartScrollbarAnimationRecursive(RootLayer(), CurrentPhysicalTimeTicks()); 2822 StartScrollbarAnimationRecursive(RootLayer(), CurrentFrameTimeTicks());
2824 } 2823 }
2825 2824
2826 void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer, 2825 void LayerTreeHostImpl::StartScrollbarAnimationRecursive(LayerImpl* layer,
2827 base::TimeTicks time) { 2826 base::TimeTicks time) {
2828 if (!layer) 2827 if (!layer)
2829 return; 2828 return;
2830 2829
2831 ScrollbarAnimationController* scrollbar_controller = 2830 ScrollbarAnimationController* scrollbar_controller =
2832 layer->scrollbar_animation_controller(); 2831 layer->scrollbar_animation_controller();
2833 if (scrollbar_controller && scrollbar_controller->IsAnimating()) { 2832 if (scrollbar_controller && scrollbar_controller->IsAnimating()) {
(...skipping 11 matching lines...) Expand all
2845 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) { 2844 void LayerTreeHostImpl::SetTreePriority(TreePriority priority) {
2846 if (!tile_manager_) 2845 if (!tile_manager_)
2847 return; 2846 return;
2848 2847
2849 if (global_tile_state_.tree_priority == priority) 2848 if (global_tile_state_.tree_priority == priority)
2850 return; 2849 return;
2851 global_tile_state_.tree_priority = priority; 2850 global_tile_state_.tree_priority = priority;
2852 DidModifyTilePriorities(); 2851 DidModifyTilePriorities();
2853 } 2852 }
2854 2853
2854 void LayerTreeHostImpl::UpdateCurrentFrameTime() {
2855 DCHECK(current_frame_timeticks_.is_null());
2856 current_frame_timeticks_ = gfx::FrameTime::Now();
2857 }
2858
2855 void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() { 2859 void LayerTreeHostImpl::ResetCurrentFrameTimeForNextFrame() {
2856 current_frame_timeticks_ = base::TimeTicks(); 2860 current_frame_timeticks_ = base::TimeTicks();
2857 } 2861 }
2858 2862
2859 void LayerTreeHostImpl::UpdateCurrentFrameTime(base::TimeTicks* ticks) const {
2860 if (ticks->is_null()) {
2861 *ticks = CurrentPhysicalTimeTicks();
2862 }
2863 }
2864
2865 base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() { 2863 base::TimeTicks LayerTreeHostImpl::CurrentFrameTimeTicks() {
2866 UpdateCurrentFrameTime(&current_frame_timeticks_); 2864 // Try to use the current frame time to keep animations non-jittery. But if
2867 return current_frame_timeticks_; 2865 // we're not in a frame (because this is during an input event or a delayed
2868 } 2866 // task), fall back to physical time. This should still be monotonic.
2869 2867 if (!current_frame_timeticks_.is_null())
2870 base::TimeTicks LayerTreeHostImpl::CurrentPhysicalTimeTicks() const { 2868 return current_frame_timeticks_;
2871 return gfx::FrameTime::Now(); 2869 return gfx::FrameTime::Now();
2872 } 2870 }
2873 2871
2874 scoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame( 2872 scoped_ptr<base::Value> LayerTreeHostImpl::AsValueWithFrame(
2875 FrameData* frame) const { 2873 FrameData* frame) const {
2876 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue()); 2874 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue());
2877 if (this->pending_tree_) 2875 if (this->pending_tree_)
2878 state->Set("activation_state", ActivationStateAsValue().release()); 2876 state->Set("activation_state", ActivationStateAsValue().release());
2879 state->Set("device_viewport_size", 2877 state->Set("device_viewport_size",
2880 MathUtil::AsValue(device_viewport_size_).release()); 2878 MathUtil::AsValue(device_viewport_size_).release());
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
3020 swap_promise_monitor_.erase(monitor); 3018 swap_promise_monitor_.erase(monitor);
3021 } 3019 }
3022 3020
3023 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() { 3021 void LayerTreeHostImpl::NotifySwapPromiseMonitorsOfSetNeedsRedraw() {
3024 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin(); 3022 std::set<SwapPromiseMonitor*>::iterator it = swap_promise_monitor_.begin();
3025 for (; it != swap_promise_monitor_.end(); it++) 3023 for (; it != swap_promise_monitor_.end(); it++)
3026 (*it)->OnSetNeedsRedrawOnImpl(); 3024 (*it)->OnSetNeedsRedrawOnImpl();
3027 } 3025 }
3028 3026
3029 } // namespace cc 3027 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_impl.h ('k') | cc/trees/layer_tree_host_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698