Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <cmath> | 10 #include <cmath> |
| (...skipping 4137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4148 EXPECT_EQ(0.f, outer_scroll->CurrentScrollOffset().y()); | 4148 EXPECT_EQ(0.f, outer_scroll->CurrentScrollOffset().y()); |
| 4149 EXPECT_EQ(gfx::ScrollOffset(), outer_scroll->MaxScrollOffset()); | 4149 EXPECT_EQ(gfx::ScrollOffset(), outer_scroll->MaxScrollOffset()); |
| 4150 | 4150 |
| 4151 host_impl_->ScrollEnd(EndState().get()); | 4151 host_impl_->ScrollEnd(EndState().get()); |
| 4152 | 4152 |
| 4153 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 4153 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 4154 host_impl_ | 4154 host_impl_ |
| 4155 ->ScrollBegin(BeginState(gfx::Point()).get(), | 4155 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 4156 InputHandler::TOUCHSCREEN) | 4156 InputHandler::TOUCHSCREEN) |
| 4157 .thread); | 4157 .thread); |
| 4158 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), inner_scroll); | 4158 EXPECT_EQ(host_impl_->CurrentlyScrollingLayer(), outer_scroll); |
| 4159 | 4159 |
| 4160 host_impl_->ScrollBy( | 4160 host_impl_->ScrollBy( |
| 4161 UpdateState(gfx::Point(), gfx::Vector2dF(0.f, -50.f)).get()); | 4161 UpdateState(gfx::Point(), gfx::Vector2dF(0.f, -50.f)).get()); |
| 4162 | 4162 |
| 4163 // The entire scroll delta should have been used to show the top controls. | 4163 // The entire scroll delta should have been used to show the top controls. |
| 4164 // The outer viewport should be resized to accomodate and scrolled to the | 4164 // The outer viewport should be resized to accomodate and scrolled to the |
| 4165 // bottom of the document to keep the viewport in place. | 4165 // bottom of the document to keep the viewport in place. |
| 4166 EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio()); | 4166 EXPECT_EQ(1.f, host_impl_->active_tree()->CurrentTopControlsShownRatio()); |
| 4167 EXPECT_EQ(50.f, outer_container->BoundsForScrolling().height()); | 4167 EXPECT_EQ(50.f, outer_container->BoundsForScrolling().height()); |
| 4168 EXPECT_EQ(50.f, inner_container->BoundsForScrolling().height()); | 4168 EXPECT_EQ(50.f, inner_container->BoundsForScrolling().height()); |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4604 // Send a gesture scroll that will scroll the outer viewport, make sure the | 4604 // Send a gesture scroll that will scroll the outer viewport, make sure the |
| 4605 // top controls get scrolled. | 4605 // top controls get scrolled. |
| 4606 gfx::Vector2dF scroll_delta(0.f, 15.f); | 4606 gfx::Vector2dF scroll_delta(0.f, 15.f); |
| 4607 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 4607 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 4608 host_impl_ | 4608 host_impl_ |
| 4609 ->ScrollBegin(BeginState(gfx::Point()).get(), | 4609 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 4610 InputHandler::TOUCHSCREEN) | 4610 InputHandler::TOUCHSCREEN) |
| 4611 .thread); | 4611 .thread); |
| 4612 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); | 4612 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); |
| 4613 | 4613 |
| 4614 EXPECT_EQ(host_impl_->InnerViewportScrollLayer(), | 4614 EXPECT_EQ(host_impl_->OuterViewportScrollLayer(), |
| 4615 host_impl_->CurrentlyScrollingLayer()); | 4615 host_impl_->CurrentlyScrollingLayer()); |
| 4616 host_impl_->ScrollEnd(EndState().get()); | 4616 host_impl_->ScrollEnd(EndState().get()); |
| 4617 | 4617 |
| 4618 EXPECT_FLOAT_EQ(scroll_delta.y(), | 4618 EXPECT_FLOAT_EQ(scroll_delta.y(), |
| 4619 top_controls_height_ - | 4619 top_controls_height_ - |
| 4620 host_impl_->top_controls_manager()->ContentTopOffset()); | 4620 host_impl_->top_controls_manager()->ContentTopOffset()); |
| 4621 | 4621 |
| 4622 scroll_delta = gfx::Vector2dF(0.f, 50.f); | 4622 scroll_delta = gfx::Vector2dF(0.f, 50.f); |
| 4623 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 4623 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 4624 host_impl_ | 4624 host_impl_ |
| 4625 ->ScrollBegin(BeginState(gfx::Point()).get(), | 4625 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 4626 InputHandler::TOUCHSCREEN) | 4626 InputHandler::TOUCHSCREEN) |
| 4627 .thread); | 4627 .thread); |
| 4628 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); | 4628 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); |
| 4629 | 4629 |
| 4630 EXPECT_EQ(0, host_impl_->top_controls_manager()->ContentTopOffset()); | 4630 EXPECT_EQ(0, host_impl_->top_controls_manager()->ContentTopOffset()); |
| 4631 EXPECT_EQ(host_impl_->InnerViewportScrollLayer(), | 4631 EXPECT_EQ(host_impl_->OuterViewportScrollLayer(), |
| 4632 host_impl_->CurrentlyScrollingLayer()); | 4632 host_impl_->CurrentlyScrollingLayer()); |
| 4633 | 4633 |
| 4634 host_impl_->ScrollEnd(EndState().get()); | 4634 host_impl_->ScrollEnd(EndState().get()); |
| 4635 | 4635 |
| 4636 // Position the viewports such that the inner viewport will be scrolled. | 4636 // Position the viewports such that the inner viewport will be scrolled. |
| 4637 gfx::Vector2dF inner_viewport_offset(0.f, 25.f); | 4637 gfx::Vector2dF inner_viewport_offset(0.f, 25.f); |
| 4638 SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), | 4638 SetScrollOffsetDelta(host_impl_->OuterViewportScrollLayer(), |
| 4639 gfx::Vector2dF()); | 4639 gfx::Vector2dF()); |
| 4640 SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), | 4640 SetScrollOffsetDelta(host_impl_->InnerViewportScrollLayer(), |
| 4641 inner_viewport_offset); | 4641 inner_viewport_offset); |
| (...skipping 1827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6469 host_impl_->ScrollBy( | 6469 host_impl_->ScrollBy( |
| 6470 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(100.f, 100.f)).get()); | 6470 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(100.f, 100.f)).get()); |
| 6471 host_impl_->ScrollEnd(EndState().get()); | 6471 host_impl_->ScrollEnd(EndState().get()); |
| 6472 | 6472 |
| 6473 EXPECT_VECTOR_EQ(gfx::Vector2dF(0.f, 0.f), | 6473 EXPECT_VECTOR_EQ(gfx::Vector2dF(0.f, 0.f), |
| 6474 outer_scroll_layer->CurrentScrollOffset()); | 6474 outer_scroll_layer->CurrentScrollOffset()); |
| 6475 EXPECT_VECTOR_EQ(gfx::Vector2dF(50.f, 50.f), | 6475 EXPECT_VECTOR_EQ(gfx::Vector2dF(50.f, 50.f), |
| 6476 scroll_layer->CurrentScrollOffset()); | 6476 scroll_layer->CurrentScrollOffset()); |
| 6477 } | 6477 } |
| 6478 } | 6478 } |
| 6479 // Test that scrolls chain correctly when a child scroller on the page (e.g. a | |
| 6480 // scrolling div) is set as the outer viewport but scrolls start from a layer | |
| 6481 // that's not a descendant of the outer viewport. This happens in the | |
| 6482 // rootScroller proposal. | |
| 6483 TEST_F(LayerTreeHostImplTest, RootScrollerScrollNonDescendant) { | |
| 6484 const gfx::Size content_size(300, 300); | |
| 6485 const gfx::Size viewport_size(300, 300); | |
| 6486 | |
| 6487 LayerTreeImpl* layer_tree_impl = host_impl_->active_tree(); | |
| 6488 | |
| 6489 LayerImpl* content_layer = | |
| 6490 CreateBasicVirtualViewportLayers(viewport_size, content_size); | |
| 6491 LayerImpl* inner_scroll_layer = host_impl_->InnerViewportScrollLayer(); | |
| 6492 | |
| 6493 LayerImpl* outer_scroll_layer = nullptr; | |
| 6494 LayerImpl* sibling_scroll_layer = nullptr; | |
| 6495 | |
| 6496 // Initialization: Add a scrolling layer, simulating an ordinary DIV, to be | |
| 6497 // set as the outer viewport. Add a sibling scrolling layer that isn't a child | |
| 6498 // of the outer viewport scroll layer. | |
| 6499 { | |
| 6500 std::unique_ptr<LayerImpl> clip = LayerImpl::Create(layer_tree_impl, 10); | |
| 6501 clip->SetBounds(content_size); | |
| 6502 clip->SetPosition(gfx::PointF(100, 100)); | |
| 6503 | |
| 6504 std::unique_ptr<LayerImpl> scroll = LayerImpl::Create(layer_tree_impl, 11); | |
| 6505 scroll->SetBounds(gfx::Size(1200, 1200)); | |
| 6506 scroll->SetScrollClipLayer(clip->id()); | |
| 6507 scroll->SetDrawsContent(true); | |
| 6508 | |
| 6509 outer_scroll_layer = scroll.get(); | |
|
tdresser
2016/09/23 15:59:58
Having a raw pointer point to something owned by a
bokan
2016/09/23 19:57:01
It's because we std::move them into the layer tree
tdresser
2016/09/23 20:40:30
D'oh, sure, that's fine.
| |
| 6510 | |
| 6511 clip->test_properties()->AddChild(std::move(scroll)); | |
| 6512 content_layer->test_properties()->AddChild(std::move(clip)); | |
| 6513 | |
| 6514 // Create the non-descendant. | |
| 6515 std::unique_ptr<LayerImpl> clip2 = LayerImpl::Create(layer_tree_impl, 14); | |
| 6516 clip2->SetBounds(gfx::Size(600, 600)); | |
| 6517 clip2->SetPosition(gfx::PointF()); | |
| 6518 | |
| 6519 std::unique_ptr<LayerImpl> scroll2 = LayerImpl::Create(layer_tree_impl, 15); | |
| 6520 scroll2->SetBounds(gfx::Size(1200, 1200)); | |
| 6521 scroll2->SetScrollClipLayer(clip2->id()); | |
| 6522 scroll2->SetDrawsContent(true); | |
| 6523 | |
| 6524 sibling_scroll_layer = scroll2.get(); | |
| 6525 | |
| 6526 clip2->test_properties()->AddChild(std::move(scroll2)); | |
| 6527 content_layer->test_properties()->AddChild(std::move(clip2)); | |
| 6528 | |
| 6529 layer_tree_impl->SetViewportLayersFromIds( | |
| 6530 Layer::INVALID_ID, layer_tree_impl->PageScaleLayer()->id(), | |
| 6531 inner_scroll_layer->id(), outer_scroll_layer->id()); | |
| 6532 layer_tree_impl->BuildPropertyTreesForTesting(); | |
| 6533 | |
| 6534 ASSERT_EQ(outer_scroll_layer, layer_tree_impl->OuterViewportScrollLayer()); | |
| 6535 } | |
| 6536 | |
| 6537 // Scrolls should target the non-descendant scroller. Chaining should not | |
| 6538 // propagate to the outer viewport scroll layer. | |
| 6539 { | |
| 6540 // This should fully scroll the layer. | |
| 6541 host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), | |
| 6542 InputHandler::TOUCHSCREEN); | |
| 6543 host_impl_->ScrollBy( | |
| 6544 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(1000.f, 1000.f)).get()); | |
| 6545 host_impl_->ScrollEnd(EndState().get()); | |
| 6546 | |
| 6547 EXPECT_VECTOR_EQ(gfx::Vector2dF(600.f, 600.f), | |
| 6548 sibling_scroll_layer->CurrentScrollOffset()); | |
| 6549 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6550 outer_scroll_layer->CurrentScrollOffset()); | |
|
tdresser
2016/09/23 15:59:58
Shouldn't outer_scroll_layer be deleted by the tim
bokan
2016/09/23 19:57:01
The unique_ptr's are std::moved into the layer tre
| |
| 6551 | |
| 6552 // Scrolling now should chain up but, since the outer viewport is a sibling | |
| 6553 // rather than an ancestor, we shouldn't chain to it. | |
| 6554 host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), | |
| 6555 InputHandler::TOUCHSCREEN); | |
| 6556 host_impl_->ScrollBy( | |
| 6557 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(1000.f, 1000.f)).get()); | |
| 6558 host_impl_->ScrollEnd(EndState().get()); | |
| 6559 | |
| 6560 EXPECT_VECTOR_EQ(gfx::Vector2dF(600.f, 600.f), | |
| 6561 sibling_scroll_layer->CurrentScrollOffset()); | |
| 6562 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6563 outer_scroll_layer->CurrentScrollOffset()); | |
| 6564 } | |
| 6565 | |
| 6566 float min_page_scale = 1.f, max_page_scale = 4.f; | |
| 6567 float page_scale_factor = 1.f; | |
| 6568 host_impl_->active_tree()->PushPageScaleFromMainThread( | |
| 6569 page_scale_factor, min_page_scale, max_page_scale); | |
| 6570 | |
| 6571 gfx::Vector2dF viewport_size_vec(viewport_size.width(), | |
| 6572 viewport_size.height()); | |
| 6573 | |
| 6574 // Reset the scroll offset. | |
| 6575 sibling_scroll_layer->SetCurrentScrollOffset(gfx::ScrollOffset()); | |
| 6576 | |
| 6577 // Now pinch-zoom in. Anchoring should cause scrolling only on the inner | |
| 6578 // viewport layer. | |
| 6579 { | |
| 6580 // Pinch in to the middle of the screen. The inner viewport should scroll | |
| 6581 // to keep the gesture anchored but not the outer or the sibling scroller. | |
| 6582 page_scale_factor = 2.f; | |
| 6583 gfx::Point anchor(viewport_size.width() / 2, viewport_size.height() / 2); | |
| 6584 host_impl_->ScrollBegin(BeginState(anchor).get(), | |
| 6585 InputHandler::TOUCHSCREEN); | |
| 6586 host_impl_->PinchGestureBegin(); | |
| 6587 host_impl_->PinchGestureUpdate(page_scale_factor, anchor); | |
| 6588 host_impl_->PinchGestureEnd(); | |
| 6589 | |
| 6590 EXPECT_VECTOR_EQ(gfx::Vector2dF(anchor.x() / 2, anchor.y() / 2), | |
| 6591 inner_scroll_layer->CurrentScrollOffset()); | |
| 6592 | |
| 6593 host_impl_->ScrollBy(UpdateState(anchor, viewport_size_vec).get()); | |
| 6594 | |
| 6595 EXPECT_VECTOR_EQ(ScaleVector2d(viewport_size_vec, 1.f / page_scale_factor), | |
| 6596 inner_scroll_layer->CurrentScrollOffset()); | |
| 6597 // TODO(bokan): This doesn't yet work but we'll probably want to fix this | |
| 6598 // at some point. | |
| 6599 // EXPECT_VECTOR_EQ( | |
| 6600 // gfx::Vector2dF(), | |
| 6601 // outer_scroll_layer->CurrentScrollOffset()); | |
| 6602 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6603 sibling_scroll_layer->CurrentScrollOffset()); | |
| 6604 | |
| 6605 host_impl_->ScrollEnd(EndState().get()); | |
| 6606 } | |
| 6607 | |
| 6608 // Reset the scroll offsets | |
| 6609 sibling_scroll_layer->SetCurrentScrollOffset(gfx::ScrollOffset()); | |
| 6610 inner_scroll_layer->SetCurrentScrollOffset(gfx::ScrollOffset()); | |
| 6611 outer_scroll_layer->SetCurrentScrollOffset(gfx::ScrollOffset()); | |
| 6612 | |
| 6613 // Scrolls over the sibling while pinched in should scroll the sibling first, | |
| 6614 // but then chain up to the inner viewport so that the user can still pan | |
| 6615 // around. The outer viewport should be unaffected. | |
| 6616 { | |
| 6617 // This should fully scroll the sibling but, because we latch to the | |
| 6618 // scroller, it shouldn't chain up to the inner viewport yet. | |
| 6619 host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), | |
| 6620 InputHandler::TOUCHSCREEN); | |
| 6621 host_impl_->ScrollBy( | |
| 6622 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(2000.f, 2000.f)).get()); | |
| 6623 host_impl_->ScrollEnd(EndState().get()); | |
| 6624 | |
| 6625 EXPECT_VECTOR_EQ(gfx::Vector2dF(600.f, 600.f), | |
| 6626 sibling_scroll_layer->CurrentScrollOffset()); | |
| 6627 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6628 inner_scroll_layer->CurrentScrollOffset()); | |
| 6629 | |
| 6630 // Scrolling now should chain up to the inner viewport. | |
| 6631 host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), | |
| 6632 InputHandler::TOUCHSCREEN); | |
| 6633 host_impl_->ScrollBy( | |
| 6634 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(2000.f, 2000.f)).get()); | |
| 6635 host_impl_->ScrollEnd(EndState().get()); | |
| 6636 | |
| 6637 EXPECT_VECTOR_EQ(ScaleVector2d(viewport_size_vec, 1 / page_scale_factor), | |
| 6638 inner_scroll_layer->CurrentScrollOffset()); | |
| 6639 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6640 outer_scroll_layer->CurrentScrollOffset()); | |
| 6641 | |
| 6642 // No more scrolling should be possible. | |
| 6643 host_impl_->ScrollBegin(BeginState(gfx::Point(0, 0)).get(), | |
| 6644 InputHandler::TOUCHSCREEN); | |
| 6645 host_impl_->ScrollBy( | |
| 6646 UpdateState(gfx::Point(0, 0), gfx::Vector2dF(2000.f, 2000.f)).get()); | |
| 6647 host_impl_->ScrollEnd(EndState().get()); | |
| 6648 | |
| 6649 EXPECT_VECTOR_EQ(gfx::Vector2dF(), | |
| 6650 outer_scroll_layer->CurrentScrollOffset()); | |
| 6651 } | |
| 6652 } | |
| 6479 | 6653 |
| 6480 TEST_F(LayerTreeHostImplTest, OverscrollOnImplThread) { | 6654 TEST_F(LayerTreeHostImplTest, OverscrollOnImplThread) { |
| 6481 InputHandlerScrollResult scroll_result; | 6655 InputHandlerScrollResult scroll_result; |
| 6482 LayerTreeSettings settings = DefaultSettings(); | 6656 LayerTreeSettings settings = DefaultSettings(); |
| 6483 CreateHostImpl(settings, CreateCompositorFrameSink()); | 6657 CreateHostImpl(settings, CreateCompositorFrameSink()); |
| 6484 | 6658 |
| 6485 const gfx::Size content_size(50, 50); | 6659 const gfx::Size content_size(50, 50); |
| 6486 const gfx::Size viewport_size(50, 50); | 6660 const gfx::Size viewport_size(50, 50); |
| 6487 CreateBasicVirtualViewportLayers(viewport_size, content_size); | 6661 CreateBasicVirtualViewportLayers(viewport_size, content_size); |
| 6488 | 6662 |
| (...skipping 1881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 8370 scroll_layer->test_properties()->AddChild(std::move(child_scroll)); | 8544 scroll_layer->test_properties()->AddChild(std::move(child_scroll)); |
| 8371 host_impl_->active_tree()->BuildPropertyTreesForTesting(); | 8545 host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
| 8372 | 8546 |
| 8373 DrawFrame(); | 8547 DrawFrame(); |
| 8374 | 8548 |
| 8375 // We should not have scrolled |child_scroll| even though we technically "hit" | 8549 // We should not have scrolled |child_scroll| even though we technically "hit" |
| 8376 // it. The reason for this is that if the scrolling the scroll would not move | 8550 // it. The reason for this is that if the scrolling the scroll would not move |
| 8377 // any layer that is a drawn RSLL member, then we can ignore the hit. | 8551 // any layer that is a drawn RSLL member, then we can ignore the hit. |
| 8378 // | 8552 // |
| 8379 // Why SCROLL_STARTED? In this case, it's because we've bubbled out and | 8553 // Why SCROLL_STARTED? In this case, it's because we've bubbled out and |
| 8380 // started scrolling the inner viewport. | 8554 // started scrolling the viewport. |
| 8381 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 8555 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 8382 host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 8556 host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
| 8383 InputHandler::WHEEL) | 8557 InputHandler::WHEEL) |
| 8384 .thread); | 8558 .thread); |
| 8385 | 8559 |
| 8386 EXPECT_EQ(2, host_impl_->CurrentlyScrollingLayer()->id()); | 8560 EXPECT_EQ(117, host_impl_->CurrentlyScrollingLayer()->id()); |
| 8387 } | 8561 } |
| 8388 | 8562 |
| 8389 TEST_F(LayerTreeHostImplTest, ScrollInvisibleScrollerWithVisibleDescendent) { | 8563 TEST_F(LayerTreeHostImplTest, ScrollInvisibleScrollerWithVisibleDescendent) { |
| 8390 gfx::Size content_size(100, 100); | 8564 gfx::Size content_size(100, 100); |
| 8391 SetupScrollAndContentsLayers(content_size); | 8565 SetupScrollAndContentsLayers(content_size); |
| 8392 | 8566 |
| 8393 LayerImpl* root = host_impl_->active_tree()->LayerById(1); | 8567 LayerImpl* root = host_impl_->active_tree()->LayerById(1); |
| 8394 LayerImpl* root_scroll_layer = host_impl_->active_tree()->LayerById(2); | 8568 LayerImpl* root_scroll_layer = host_impl_->active_tree()->LayerById(2); |
| 8395 | 8569 |
| 8396 std::unique_ptr<LayerImpl> invisible_scroll_layer = | 8570 std::unique_ptr<LayerImpl> invisible_scroll_layer = |
| (...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9356 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); | 9530 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); |
| 9357 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); | 9531 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); |
| 9358 | 9532 |
| 9359 // Scrolling the viewport always sets the outer scroll layer as the | 9533 // Scrolling the viewport always sets the outer scroll layer as the |
| 9360 // currently scrolling layer. | 9534 // currently scrolling layer. |
| 9361 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 9535 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 9362 host_impl_ | 9536 host_impl_ |
| 9363 ->ScrollBegin(BeginState(gfx::Point()).get(), | 9537 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 9364 InputHandler::TOUCHSCREEN) | 9538 InputHandler::TOUCHSCREEN) |
| 9365 .thread); | 9539 .thread); |
| 9366 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9540 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9367 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 9541 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 9368 host_impl_->FlingScrollBegin().thread); | 9542 host_impl_->FlingScrollBegin().thread); |
| 9369 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9543 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9370 | 9544 |
| 9371 gfx::Vector2d scroll_delta(inner_viewport.width() / 2.f, | 9545 gfx::Vector2d scroll_delta(inner_viewport.width() / 2.f, |
| 9372 inner_viewport.height() / 2.f); | 9546 inner_viewport.height() / 2.f); |
| 9373 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); | 9547 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); |
| 9374 inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); | 9548 inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); |
| 9375 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9549 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9376 | 9550 |
| 9377 host_impl_->ScrollEnd(EndState().get()); | 9551 host_impl_->ScrollEnd(EndState().get()); |
| 9378 host_impl_->ClearCurrentlyScrollingLayerForTesting(); | 9552 host_impl_->ClearCurrentlyScrollingLayerForTesting(); |
| 9379 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingLayer()); | 9553 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingLayer()); |
| 9380 | 9554 |
| 9381 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); | 9555 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); |
| 9382 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); | 9556 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); |
| 9383 | 9557 |
| 9384 // Fling past the inner viewport boundry, make sure outer viewport scrolls. | 9558 // Fling past the inner viewport boundry, make sure outer viewport scrolls. |
| 9385 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 9559 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 9386 host_impl_ | 9560 host_impl_ |
| 9387 ->ScrollBegin(BeginState(gfx::Point()).get(), | 9561 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 9388 InputHandler::TOUCHSCREEN) | 9562 InputHandler::TOUCHSCREEN) |
| 9389 .thread); | 9563 .thread); |
| 9390 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9564 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9391 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 9565 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 9392 host_impl_->FlingScrollBegin().thread); | 9566 host_impl_->FlingScrollBegin().thread); |
| 9393 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9567 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9394 | 9568 |
| 9395 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); | 9569 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); |
| 9396 inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); | 9570 inner_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); |
| 9397 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9571 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9398 | 9572 |
| 9399 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); | 9573 host_impl_->ScrollBy(UpdateState(gfx::Point(), scroll_delta).get()); |
| 9400 outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); | 9574 outer_expected += gfx::Vector2dF(scroll_delta.x(), scroll_delta.y()); |
| 9401 EXPECT_EQ(inner_scroll, host_impl_->CurrentlyScrollingLayer()); | 9575 EXPECT_EQ(outer_scroll, host_impl_->CurrentlyScrollingLayer()); |
| 9402 | 9576 |
| 9403 host_impl_->ScrollEnd(EndState().get()); | 9577 host_impl_->ScrollEnd(EndState().get()); |
| 9404 host_impl_->ClearCurrentlyScrollingLayerForTesting(); | 9578 host_impl_->ClearCurrentlyScrollingLayerForTesting(); |
| 9405 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingLayer()); | 9579 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingLayer()); |
| 9406 | 9580 |
| 9407 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); | 9581 EXPECT_VECTOR_EQ(inner_expected, inner_scroll->CurrentScrollOffset()); |
| 9408 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); | 9582 EXPECT_VECTOR_EQ(outer_expected, outer_scroll->CurrentScrollOffset()); |
| 9409 } | 9583 } |
| 9410 } | 9584 } |
| 9411 | 9585 |
| (...skipping 1747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11159 ->test_properties() | 11333 ->test_properties() |
| 11160 ->children[0]; | 11334 ->children[0]; |
| 11161 // The scroll done on the active tree is undone on the pending tree. | 11335 // The scroll done on the active tree is undone on the pending tree. |
| 11162 gfx::Transform translate; | 11336 gfx::Transform translate; |
| 11163 translate.Translate(0, accumulated_scroll); | 11337 translate.Translate(0, accumulated_scroll); |
| 11164 content_layer->test_properties()->transform = translate; | 11338 content_layer->test_properties()->transform = translate; |
| 11165 | 11339 |
| 11166 LayerTreeImpl* pending_tree = host_impl_->pending_tree(); | 11340 LayerTreeImpl* pending_tree = host_impl_->pending_tree(); |
| 11167 pending_tree->PushPageScaleFromMainThread(1.f, 1.f, 1.f); | 11341 pending_tree->PushPageScaleFromMainThread(1.f, 1.f, 1.f); |
| 11168 LayerImpl* last_scrolled_layer = pending_tree->LayerById( | 11342 LayerImpl* last_scrolled_layer = pending_tree->LayerById( |
| 11169 host_impl_->active_tree()->LastScrolledLayerId()); | 11343 host_impl_->active_tree()->InnerViewportScrollLayer()->id()); |
|
bokan
2016/09/23 01:53:55
The LastScrolledLayerId is set using SetCurrentlyS
tdresser
2016/09/23 15:59:58
This seems a bit scary – it should be a pretty sim
bokan
2016/09/23 19:57:01
It's not as straightforward as it seems. This curr
| |
| 11170 | 11344 |
| 11171 // When building property trees from impl side, the builder uses the scroll | 11345 // When building property trees from impl side, the builder uses the scroll |
| 11172 // offset of layer_impl to initialize the scroll offset in scroll tree: | 11346 // offset of layer_impl to initialize the scroll offset in scroll tree: |
| 11173 // scroll_tree.synced_scroll_offset.PushFromMainThread( | 11347 // scroll_tree.synced_scroll_offset.PushFromMainThread( |
| 11174 // layer->CurrentScrollOffset()). | 11348 // layer->CurrentScrollOffset()). |
| 11175 // However, layer_impl does not store scroll_offset, so it is using scroll | 11349 // However, layer_impl does not store scroll_offset, so it is using scroll |
| 11176 // tree's scroll offset to initialize itself. Usually this approach works | 11350 // tree's scroll offset to initialize itself. Usually this approach works |
| 11177 // because this is a simple assignment. However if scroll_offset's pending | 11351 // because this is a simple assignment. However if scroll_offset's pending |
| 11178 // delta is not zero, the delta would be counted twice. | 11352 // delta is not zero, the delta would be counted twice. |
| 11179 // This hacking here is to restore the damaged scroll offset. | 11353 // This hacking here is to restore the damaged scroll offset. |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 11223 EXPECT_TRUE(host_impl_->use_gpu_rasterization()); | 11397 EXPECT_TRUE(host_impl_->use_gpu_rasterization()); |
| 11224 | 11398 |
| 11225 // Re-initialize with a software output surface. | 11399 // Re-initialize with a software output surface. |
| 11226 compositor_frame_sink_ = FakeCompositorFrameSink::CreateSoftware(); | 11400 compositor_frame_sink_ = FakeCompositorFrameSink::CreateSoftware(); |
| 11227 host_impl_->InitializeRenderer(compositor_frame_sink_.get()); | 11401 host_impl_->InitializeRenderer(compositor_frame_sink_.get()); |
| 11228 EXPECT_FALSE(host_impl_->use_gpu_rasterization()); | 11402 EXPECT_FALSE(host_impl_->use_gpu_rasterization()); |
| 11229 } | 11403 } |
| 11230 | 11404 |
| 11231 } // namespace | 11405 } // namespace |
| 11232 } // namespace cc | 11406 } // namespace cc |
| OLD | NEW |