Index: cc/trees/layer_tree_host_impl_unittest.cc |
diff --git a/cc/trees/layer_tree_host_impl_unittest.cc b/cc/trees/layer_tree_host_impl_unittest.cc |
index 77e6f798ad6fcf2c208331c1af02208300cf216e..dcc9ca97dd3896de862ffd8a29463d6eb77eca7d 100644 |
--- a/cc/trees/layer_tree_host_impl_unittest.cc |
+++ b/cc/trees/layer_tree_host_impl_unittest.cc |
@@ -4737,68 +4737,101 @@ TEST_F(LayerTreeHostImplTopControlsTest, |
// occurring because the UpdateViewportContainerSizes was being called before |
// the property trees were updated with the bounds_delta. crbug.com/597266. |
TEST_F(LayerTreeHostImplTopControlsTest, ViewportBoundsDeltaOnTreeActivation) { |
- const gfx::Size inner_viewport_size(500, 500); |
+ const gfx::Size inner_viewport_size(1000, 1000); |
const gfx::Size outer_viewport_size(1000, 1000); |
const gfx::Size content_size(2000, 2000); |
- SetupTopControlsAndScrollLayerWithVirtualViewport( |
- inner_viewport_size, outer_viewport_size, content_size); |
- host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 0.25f, 4.f); |
- |
- host_impl_->CreatePendingTree(); |
- SetupTopControlsAndScrollLayerWithVirtualViewport( |
- host_impl_->pending_tree(), inner_viewport_size, outer_viewport_size, |
- content_size); |
+ // Initialization |
+ { |
+ SetupTopControlsAndScrollLayerWithVirtualViewport( |
+ inner_viewport_size, outer_viewport_size, content_size); |
+ host_impl_->active_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); |
- // Zoom in to 2X. |
- host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
- InputHandler::TOUCHSCREEN); |
- host_impl_->PinchGestureBegin(); |
- host_impl_->PinchGestureUpdate(2.f, gfx::Point()); |
- host_impl_->PinchGestureEnd(); |
- host_impl_->ScrollEnd(EndState().get()); |
+ // Start off with the top controls hidden on both main and impl. |
+ host_impl_->active_tree()->set_top_controls_shrink_blink_size(false); |
+ host_impl_->active_tree()->PushTopControlsFromMainThread(0); |
- ASSERT_EQ(2.0f, host_impl_->active_tree()->current_page_scale_factor()); |
+ host_impl_->CreatePendingTree(); |
+ SetupTopControlsAndScrollLayerWithVirtualViewport( |
+ host_impl_->pending_tree(), inner_viewport_size, outer_viewport_size, |
+ content_size); |
+ host_impl_->pending_tree()->set_top_controls_shrink_blink_size(false); |
- // All scroll types outside this region should succeed. |
- host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), |
- InputHandler::TOUCHSCREEN); |
- // Fully scroll the viewports. |
- host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 2000)).get()); |
- host_impl_->ScrollEnd(EndState().get()); |
+ // Fully scroll the viewport. |
+ host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), |
+ InputHandler::TOUCHSCREEN); |
+ host_impl_->ScrollBy( |
+ UpdateState(gfx::Point(), gfx::Vector2d(0, 2000)).get()); |
+ host_impl_->ScrollEnd(EndState().get()); |
+ } |
- LayerImpl* inner_scroll = |
- host_impl_->active_tree()->InnerViewportScrollLayer(); |
LayerImpl* outer_scroll = |
host_impl_->active_tree()->OuterViewportScrollLayer(); |
- EXPECT_FLOAT_EQ(0, host_impl_->top_controls_manager()->ContentTopOffset()); |
+ ASSERT_FLOAT_EQ(0, host_impl_->top_controls_manager()->ContentTopOffset()); |
+ ASSERT_EQ(1000, outer_scroll->MaxScrollOffset().y()); |
+ ASSERT_EQ(1000, outer_scroll->CurrentScrollOffset().y()); |
- EXPECT_EQ(925, inner_scroll->MaxScrollOffset().y()); |
- EXPECT_EQ(800, outer_scroll->MaxScrollOffset().y()); |
+ // Kick off an animation to show the top controls. |
+ host_impl_->top_controls_manager()->UpdateTopControlsState(BOTH, SHOWN, true); |
+ base::TimeTicks start_time = base::TimeTicks::Now(); |
+ BeginFrameArgs begin_frame_args = |
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE); |
- // Activate the pending tree which should have all the same values as the |
- // active tree. |
- host_impl_->pending_tree()->SetCurrentTopControlsShownRatio(0); |
- host_impl_->pending_tree()->PushPageScaleFromMainThread(2.f, 0.25f, 4.f); |
- host_impl_->pending_tree() |
- ->property_trees() |
- ->scroll_tree.SetScrollOffsetDeltaForTesting(inner_scroll->id(), |
- gfx::Vector2dF(0, 925)); |
- host_impl_->pending_tree() |
- ->property_trees() |
- ->scroll_tree.SetScrollOffsetDeltaForTesting(outer_scroll->id(), |
- gfx::Vector2dF(0, 800)); |
- host_impl_->ActivateSyncTree(); |
+ // Pump an animation frame to put some delta in the top controls. |
+ { |
+ begin_frame_args.frame_time = |
+ start_time + base::TimeDelta::FromMilliseconds(50); |
+ host_impl_->WillBeginImplFrame(begin_frame_args); |
+ host_impl_->Animate(); |
+ host_impl_->UpdateAnimationState(true); |
+ host_impl_->DidFinishImplFrame(); |
+ } |
- inner_scroll = host_impl_->active_tree()->InnerViewportScrollLayer(); |
- outer_scroll = host_impl_->active_tree()->OuterViewportScrollLayer(); |
+ // Pull the top controls delta and get it back to the pending tree so that |
+ // when we go to activate the pending tree we cause a change to top controls. |
+ { |
+ float delta = |
+ host_impl_->active_tree()->top_controls_shown_ratio()->Delta(); |
+ ASSERT_GT(delta, 0); |
+ ASSERT_LT(delta, 1); |
+ host_impl_->active_tree() |
+ ->top_controls_shown_ratio() |
+ ->PullDeltaForMainThread(); |
+ host_impl_->active_tree()->top_controls_shown_ratio()->PushFromMainThread( |
+ delta); |
+ } |
- // The test should pass if the scroll offets remain as they are. We fail if |
- // the offets get clamped due to MaxScrollOffset not having the proper |
- // bounds_delta set when UpdateViewportContainerSizes is called. |
- EXPECT_EQ(925, inner_scroll->CurrentScrollOffset().y()); |
- EXPECT_EQ(800, outer_scroll->CurrentScrollOffset().y()); |
+ // 200 is the kShowHideMaxDurationMs value from top_controls_manager.cc so the |
+ // top controls should be fully animated in this frame. |
+ { |
+ begin_frame_args.frame_time = |
+ start_time + base::TimeDelta::FromMilliseconds(200); |
+ host_impl_->WillBeginImplFrame(begin_frame_args); |
+ host_impl_->Animate(); |
+ host_impl_->UpdateAnimationState(true); |
+ host_impl_->DidFinishImplFrame(); |
+ |
+ ASSERT_EQ(50, host_impl_->top_controls_manager()->ContentTopOffset()); |
+ ASSERT_EQ(1050, outer_scroll->MaxScrollOffset().y()); |
+ // NEAR because clip layer bounds are truncated in MaxScrollOffset so we |
+ // lose some precision in the intermediate animation steps. |
+ ASSERT_NEAR(1050, outer_scroll->CurrentScrollOffset().y(), 1.f); |
+ } |
+ |
+ // Activate the pending tree which should have the same scroll value as the |
+ // active tree. |
+ { |
+ host_impl_->pending_tree() |
+ ->property_trees() |
+ ->scroll_tree.SetScrollOffsetDeltaForTesting(outer_scroll->id(), |
+ gfx::Vector2dF(0, 1050)); |
+ host_impl_->ActivateSyncTree(); |
+ |
+ // Make sure we don't accidentally clamp the outer offset based on a bounds |
+ // delta that hasn't yet been updated. |
+ EXPECT_NEAR(1050, outer_scroll->CurrentScrollOffset().y(), 1.f); |
+ } |
} |
TEST_F(LayerTreeHostImplTest, ScrollNonCompositedRoot) { |