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 51377d249d1657e8b38e87f327f89766080f4a4c..715168928038e2a8c44ff8aeb0e309c3415009a3 100644 |
--- a/cc/trees/layer_tree_host_impl_unittest.cc |
+++ b/cc/trees/layer_tree_host_impl_unittest.cc |
@@ -96,7 +96,7 @@ class LayerTreeHostImplTest : public testing::Test, |
LayerTreeSettings settings; |
settings.minimum_occlusion_tracking_size = gfx::Size(); |
settings.impl_side_painting = true; |
- settings.texture_id_allocation_chunk_size = 1; |
+ settings.renderer_settings.texture_id_allocation_chunk_size = 1; |
settings.report_overscroll_only_for_scrollable_axes = true; |
settings.use_pinch_virtual_viewport = true; |
return settings; |
@@ -256,7 +256,8 @@ class LayerTreeHostImplTest : public testing::Test, |
layer_tree_impl->SetRootLayer(root.Pass()); |
layer_tree_impl->SetViewportLayersFromIds( |
- kPageScaleLayerId, kInnerViewportScrollLayerId, Layer::INVALID_ID); |
+ Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, |
+ Layer::INVALID_ID); |
return scroll_layer; |
} |
@@ -1159,11 +1160,12 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { |
did_request_redraw_ = false; |
did_request_animate_ = false; |
- host_impl_->active_tree()->SetPageScaleAnimation( |
- gfx::Vector2d(), |
- false, |
- 2.f, |
- duration); |
+ host_impl_->active_tree()->SetPendingPageScaleAnimation( |
+ scoped_ptr<PendingPageScaleAnimation>(new PendingPageScaleAnimation( |
+ gfx::Vector2d(), |
+ false, |
+ 2.f, |
+ duration))); |
host_impl_->ActivateSyncTree(); |
EXPECT_FALSE(did_request_redraw_); |
EXPECT_TRUE(did_request_animate_); |
@@ -1202,8 +1204,12 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimation) { |
did_request_redraw_ = false; |
did_request_animate_ = false; |
- host_impl_->active_tree()->SetPageScaleAnimation( |
- gfx::Vector2d(25, 25), true, min_page_scale, duration); |
+ host_impl_->active_tree()->SetPendingPageScaleAnimation( |
+ scoped_ptr<PendingPageScaleAnimation> (new PendingPageScaleAnimation( |
+ gfx::Vector2d(25, 25), |
+ true, |
+ min_page_scale, |
+ duration))); |
host_impl_->ActivateSyncTree(); |
EXPECT_FALSE(did_request_redraw_); |
EXPECT_TRUE(did_request_animate_); |
@@ -1253,11 +1259,12 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationNoOp) { |
max_page_scale); |
scroll_layer->SetScrollOffset(gfx::ScrollOffset(50, 50)); |
- host_impl_->active_tree()->SetPageScaleAnimation( |
- gfx::Vector2d(), |
- true, |
- 1.f, |
- duration); |
+ host_impl_->active_tree()->SetPendingPageScaleAnimation( |
+ scoped_ptr<PendingPageScaleAnimation>(new PendingPageScaleAnimation( |
+ gfx::Vector2d(), |
+ true, |
+ 1.f, |
+ duration))); |
host_impl_->ActivateSyncTree(); |
host_impl_->Animate(start_time); |
host_impl_->Animate(halfway_through_animation); |
@@ -1301,26 +1308,29 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { |
scroll_layer->SetScrollOffset(gfx::ScrollOffset(50, 50)); |
// Make sure TakePageScaleAnimation works properly. |
- host_impl_->sync_tree()->SetPageScaleAnimation( |
- gfx::Vector2d(), |
- false, |
- target_scale, |
- duration); |
- scoped_ptr<PageScaleAnimation> psa = |
- host_impl_->sync_tree()->TakePageScaleAnimation(); |
- EXPECT_EQ(target_scale, psa->target_page_scale_factor()); |
- EXPECT_EQ(duration, psa->duration()); |
- EXPECT_EQ(nullptr, host_impl_->sync_tree()->TakePageScaleAnimation()); |
+ |
+ host_impl_->sync_tree()->SetPendingPageScaleAnimation( |
+ scoped_ptr<PendingPageScaleAnimation>(new PendingPageScaleAnimation( |
+ gfx::Vector2d(), |
+ false, |
+ target_scale, |
+ duration))); |
+ scoped_ptr<PendingPageScaleAnimation> psa = |
+ host_impl_->sync_tree()->TakePendingPageScaleAnimation(); |
+ EXPECT_EQ(target_scale, psa->scale); |
+ EXPECT_EQ(duration, psa->duration); |
+ EXPECT_EQ(nullptr, host_impl_->sync_tree()->TakePendingPageScaleAnimation()); |
// Recreate the PSA. Nothing should happen here since the tree containing the |
// PSA hasn't been activated yet. |
did_request_redraw_ = false; |
did_request_animate_ = false; |
- host_impl_->sync_tree()->SetPageScaleAnimation( |
- gfx::Vector2d(), |
- false, |
- target_scale, |
- duration); |
+ host_impl_->sync_tree()->SetPendingPageScaleAnimation( |
+ scoped_ptr<PendingPageScaleAnimation>(new PendingPageScaleAnimation( |
+ gfx::Vector2d(), |
+ false, |
+ target_scale, |
+ duration))); |
host_impl_->Animate(halfway_through_animation); |
EXPECT_FALSE(did_request_animate_); |
EXPECT_FALSE(did_request_redraw_); |
@@ -1328,7 +1338,8 @@ TEST_F(LayerTreeHostImplTest, PageScaleAnimationTransferedOnSyncTreeActivate) { |
// Activate the sync tree. This should cause the animation to become enabled. |
// It should also clear the pointer on the sync tree. |
host_impl_->ActivateSyncTree(); |
- EXPECT_EQ(nullptr, host_impl_->sync_tree()->TakePageScaleAnimation().get()); |
+ EXPECT_EQ(nullptr, |
+ host_impl_->sync_tree()->TakePendingPageScaleAnimation().get()); |
EXPECT_FALSE(did_request_redraw_); |
EXPECT_TRUE(did_request_animate_); |
@@ -1395,53 +1406,51 @@ class LayerTreeHostImplOverridePhysicalTime : public LayerTreeHostImpl { |
base::TimeTicks fake_current_physical_time_; |
}; |
-#define SETUP_LAYERS_FOR_SCROLLBAR_ANIMATION_TEST() \ |
- gfx::Size viewport_size(10, 10); \ |
- gfx::Size content_size(100, 100); \ |
- \ |
- LayerTreeHostImplOverridePhysicalTime* host_impl_override_time = \ |
- new LayerTreeHostImplOverridePhysicalTime(settings, \ |
- this, \ |
- &proxy_, \ |
- shared_bitmap_manager_.get(), \ |
- &stats_instrumentation_); \ |
- host_impl_ = make_scoped_ptr(host_impl_override_time); \ |
- host_impl_->InitializeRenderer(CreateOutputSurface()); \ |
- host_impl_->SetViewportSize(viewport_size); \ |
- \ |
- scoped_ptr<LayerImpl> root = \ |
- LayerImpl::Create(host_impl_->active_tree(), 1); \ |
- root->SetBounds(viewport_size); \ |
- \ |
- scoped_ptr<LayerImpl> scroll = \ |
- LayerImpl::Create(host_impl_->active_tree(), 2); \ |
- scroll->SetScrollClipLayer(root->id()); \ |
- scroll->SetScrollOffset(gfx::ScrollOffset()); \ |
- root->SetBounds(viewport_size); \ |
- scroll->SetBounds(content_size); \ |
- scroll->SetContentBounds(content_size); \ |
- scroll->SetIsContainerForFixedPositionLayers(true); \ |
- \ |
- scoped_ptr<LayerImpl> contents = \ |
- LayerImpl::Create(host_impl_->active_tree(), 3); \ |
- contents->SetDrawsContent(true); \ |
- contents->SetBounds(content_size); \ |
- contents->SetContentBounds(content_size); \ |
- \ |
- scoped_ptr<SolidColorScrollbarLayerImpl> scrollbar = \ |
- SolidColorScrollbarLayerImpl::Create( \ |
- host_impl_->active_tree(), 4, VERTICAL, 10, 0, false, true); \ |
- EXPECT_FLOAT_EQ(0.f, scrollbar->opacity()); \ |
- \ |
- scroll->AddChild(contents.Pass()); \ |
- root->AddChild(scroll.Pass()); \ |
- scrollbar->SetScrollLayerAndClipLayerByIds(2, 1); \ |
- root->AddChild(scrollbar.Pass()); \ |
- \ |
- host_impl_->active_tree()->SetRootLayer(root.Pass()); \ |
- host_impl_->active_tree()->SetViewportLayersFromIds( \ |
- 1, 2, Layer::INVALID_ID); \ |
- host_impl_->active_tree()->DidBecomeActive(); \ |
+#define SETUP_LAYERS_FOR_SCROLLBAR_ANIMATION_TEST() \ |
+ gfx::Size viewport_size(10, 10); \ |
+ gfx::Size content_size(100, 100); \ |
+ \ |
+ LayerTreeHostImplOverridePhysicalTime* host_impl_override_time = \ |
+ new LayerTreeHostImplOverridePhysicalTime(settings, this, &proxy_, \ |
+ shared_bitmap_manager_.get(), \ |
+ &stats_instrumentation_); \ |
+ host_impl_ = make_scoped_ptr(host_impl_override_time); \ |
+ host_impl_->InitializeRenderer(CreateOutputSurface()); \ |
+ host_impl_->SetViewportSize(viewport_size); \ |
+ \ |
+ scoped_ptr<LayerImpl> root = \ |
+ LayerImpl::Create(host_impl_->active_tree(), 1); \ |
+ root->SetBounds(viewport_size); \ |
+ \ |
+ scoped_ptr<LayerImpl> scroll = \ |
+ LayerImpl::Create(host_impl_->active_tree(), 2); \ |
+ scroll->SetScrollClipLayer(root->id()); \ |
+ scroll->SetScrollOffset(gfx::ScrollOffset()); \ |
+ root->SetBounds(viewport_size); \ |
+ scroll->SetBounds(content_size); \ |
+ scroll->SetContentBounds(content_size); \ |
+ scroll->SetIsContainerForFixedPositionLayers(true); \ |
+ \ |
+ scoped_ptr<LayerImpl> contents = \ |
+ LayerImpl::Create(host_impl_->active_tree(), 3); \ |
+ contents->SetDrawsContent(true); \ |
+ contents->SetBounds(content_size); \ |
+ contents->SetContentBounds(content_size); \ |
+ \ |
+ scoped_ptr<SolidColorScrollbarLayerImpl> scrollbar = \ |
+ SolidColorScrollbarLayerImpl::Create(host_impl_->active_tree(), 4, \ |
+ VERTICAL, 10, 0, false, true); \ |
+ EXPECT_FLOAT_EQ(0.f, scrollbar->opacity()); \ |
+ \ |
+ scroll->AddChild(contents.Pass()); \ |
+ root->AddChild(scroll.Pass()); \ |
+ scrollbar->SetScrollLayerAndClipLayerByIds(2, 1); \ |
+ root->AddChild(scrollbar.Pass()); \ |
+ \ |
+ host_impl_->active_tree()->SetRootLayer(root.Pass()); \ |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, \ |
+ Layer::INVALID_ID); \ |
+ host_impl_->active_tree()->DidBecomeActive(); \ |
DrawFrame(); |
TEST_F(LayerTreeHostImplTest, ScrollbarLinearFadeScheduling) { |
@@ -1608,7 +1617,8 @@ void LayerTreeHostImplTest::SetupMouseMoveAtWithDeviceScale( |
root->AddChild(scrollbar.Pass()); |
host_impl_->active_tree()->SetRootLayer(root.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
@@ -2282,7 +2292,8 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest { |
root_clip->AddChild(root.Pass()); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
host_impl_->active_tree()->SetViewportLayersFromIds( |
- page_scale_layer_id, inner_viewport_scroll_layer_id, Layer::INVALID_ID); |
+ Layer::INVALID_ID, page_scale_layer_id, inner_viewport_scroll_layer_id, |
+ Layer::INVALID_ID); |
// Set a viewport size that is large enough to contain both the top controls |
// and some content. |
host_impl_->SetViewportSize(viewport_size_); |
@@ -2306,7 +2317,8 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest { |
root_clip->AddChild(root.Pass()); |
host_impl_->sync_tree()->SetRootLayer(root_clip.Pass()); |
host_impl_->sync_tree()->SetViewportLayersFromIds( |
- page_scale_layer_id, inner_viewport_scroll_layer_id, Layer::INVALID_ID); |
+ Layer::INVALID_ID, page_scale_layer_id, inner_viewport_scroll_layer_id, |
+ Layer::INVALID_ID); |
// Set a viewport size that is large enough to contain both the top controls |
// and some content. |
host_impl_->SetViewportSize(viewport_size_); |
@@ -2361,8 +2373,7 @@ class LayerTreeHostImplTopControlsTest : public LayerTreeHostImplTest { |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
host_impl_->active_tree()->SetViewportLayersFromIds( |
- page_scale_layer_id, |
- inner_viewport_scroll_layer_id, |
+ Layer::INVALID_ID, page_scale_layer_id, inner_viewport_scroll_layer_id, |
outer_viewport_scroll_layer_id); |
host_impl_->SetViewportSize(inner_viewport_size); |
@@ -2986,7 +2997,8 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) { |
host_impl_->active_tree()->SetRootLayer(root.Pass()); |
// The behaviour in this test assumes the page scale is applied at a layer |
// above the clip layer. |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 3, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 3, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
host_impl_->SetViewportSize(viewport_size); |
DrawFrame(); |
@@ -3036,7 +3048,8 @@ TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnImplThread) { |
host_impl_->active_tree()->SetRootLayer(root.Pass()); |
// The behaviour in this test assumes the page scale is applied at a layer |
// above the clip layer. |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 3, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 3, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
host_impl_->SetViewportSize(viewport_size); |
host_impl_->active_tree()->SetPageScaleFactorAndLimits(1.f, 1.f, page_scale); |
@@ -3151,7 +3164,8 @@ TEST_F(LayerTreeHostImplTest, ScrollChildAndChangePageScaleOnMainThread) { |
LayerImpl* child = child_scrolling.get(); |
root_scrolling_ptr->AddChild(child_scrolling.Pass()); |
host_impl_->active_tree()->SetRootLayer(root.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
host_impl_->SetViewportSize(surface_size); |
DrawFrame(); |
@@ -3254,7 +3268,8 @@ TEST_F(LayerTreeHostImplTest, ScrollWithoutBubbling) { |
root->AddChild(root_scrolling.Pass()); |
EXPECT_EQ(viewport_size, root->bounds()); |
host_impl_->active_tree()->SetRootLayer(root.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
host_impl_->SetViewportSize(viewport_size); |
@@ -3360,7 +3375,8 @@ TEST_F(LayerTreeHostImplTest, ScrollEventBubbling) { |
host_impl_->SetViewportSize(surface_size); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 2, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 2, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
{ |
@@ -3389,7 +3405,8 @@ TEST_F(LayerTreeHostImplTest, ScrollBeforeRedraw) { |
root_scroll->SetIsContainerForFixedPositionLayers(true); |
root_clip->AddChild(root_scroll.Pass()); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(1, 2, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 1, 2, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
host_impl_->SetViewportSize(surface_size); |
@@ -3404,7 +3421,8 @@ TEST_F(LayerTreeHostImplTest, ScrollBeforeRedraw) { |
root_scroll2->SetIsContainerForFixedPositionLayers(true); |
root_clip2->AddChild(root_scroll2.Pass()); |
host_impl_->active_tree()->SetRootLayer(root_clip2.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 4, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 4, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
// Scrolling should still work even though we did not draw yet. |
@@ -3992,7 +4010,8 @@ TEST_F(LayerTreeHostImplTest, OverscrollChildEventBubbling) { |
host_impl_->SetViewportSize(surface_size); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 1, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
{ |
@@ -4051,7 +4070,8 @@ TEST_F(LayerTreeHostImplTest, NoOverscrollOnFractionalDeviceScale) { |
host_impl_->SetViewportSize(surface_size); |
host_impl_->SetDeviceScaleFactor(device_scale_factor); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 1, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
{ |
@@ -4085,7 +4105,8 @@ TEST_F(LayerTreeHostImplTest, NoOverscrollWhenNotAtEdge) { |
host_impl_->SetViewportSize(surface_size); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 1, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
{ |
@@ -4795,7 +4816,7 @@ TEST_F(LayerTreeHostImplTest, PartialSwapReceivesDamageRect) { |
// This test creates its own LayerTreeHostImpl, so |
// that we can force partial swap enabled. |
LayerTreeSettings settings; |
- settings.partial_swap_enabled = true; |
+ settings.renderer_settings.partial_swap_enabled = true; |
scoped_ptr<SharedBitmapManager> shared_bitmap_manager( |
new TestSharedBitmapManager()); |
scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl = |
@@ -5011,7 +5032,7 @@ TEST_F(LayerTreeHostImplTest, NoPartialSwap) { |
// Run test case |
LayerTreeSettings settings = DefaultSettings(); |
- settings.partial_swap_enabled = false; |
+ settings.renderer_settings.partial_swap_enabled = false; |
CreateHostImpl(settings, |
FakeOutputSurface::Create3d(mock_context_owned.Pass())); |
SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); |
@@ -5047,7 +5068,7 @@ TEST_F(LayerTreeHostImplTest, PartialSwap) { |
MockContextHarness harness(mock_context); |
LayerTreeSettings settings = DefaultSettings(); |
- settings.partial_swap_enabled = true; |
+ settings.renderer_settings.partial_swap_enabled = true; |
CreateHostImpl(settings, FakeOutputSurface::Create3d(context_owned.Pass())); |
SetupRootLayerImpl(FakeLayerWithQuads::Create(host_impl_->active_tree(), 1)); |
@@ -5091,7 +5112,7 @@ static scoped_ptr<LayerTreeHostImpl> SetupLayersForOpacity( |
provider->TestContext3d()->set_have_post_sub_buffer(true); |
LayerTreeSettings settings; |
- settings.partial_swap_enabled = partial_swap; |
+ settings.renderer_settings.partial_swap_enabled = partial_swap; |
scoped_ptr<LayerTreeHostImpl> my_host_impl = LayerTreeHostImpl::Create( |
settings, client, proxy, stats_instrumentation, manager, NULL, 0); |
my_host_impl->InitializeRenderer(output_surface.Pass()); |
@@ -5264,7 +5285,7 @@ TEST_F(LayerTreeHostImplTest, HasTransparentBackground) { |
// Run test case |
LayerTreeSettings settings = DefaultSettings(); |
- settings.partial_swap_enabled = false; |
+ settings.renderer_settings.partial_swap_enabled = false; |
CreateHostImpl(settings, |
FakeOutputSurface::Create3d(mock_context_owned.Pass())); |
SetupRootLayerImpl(LayerImpl::Create(host_impl_->active_tree(), 1)); |
@@ -6630,7 +6651,8 @@ TEST_F(LayerTreeHostImplTest, TouchFlingShouldNotBubble) { |
host_impl_->SetViewportSize(surface_size); |
host_impl_->active_tree()->SetRootLayer(root_clip.Pass()); |
- host_impl_->active_tree()->SetViewportLayersFromIds(3, 1, Layer::INVALID_ID); |
+ host_impl_->active_tree()->SetViewportLayersFromIds(Layer::INVALID_ID, 3, 1, |
+ Layer::INVALID_ID); |
host_impl_->active_tree()->DidBecomeActive(); |
DrawFrame(); |
{ |
@@ -7472,8 +7494,9 @@ class LayerTreeHostImplVirtualViewportTest : public LayerTreeHostImplTest { |
inner_clip->AddChild(page_scale.Pass()); |
layer_tree_impl->SetRootLayer(inner_clip.Pass()); |
- layer_tree_impl->SetViewportLayersFromIds(kPageScaleLayerId, |
- kInnerViewportScrollLayerId, kOuterViewportScrollLayerId); |
+ layer_tree_impl->SetViewportLayersFromIds( |
+ Layer::INVALID_ID, kPageScaleLayerId, kInnerViewportScrollLayerId, |
+ kOuterViewportScrollLayerId); |
host_impl_->active_tree()->DidBecomeActive(); |
} |
@@ -7527,6 +7550,49 @@ TEST_F(LayerTreeHostImplVirtualViewportTest, FlingScrollBubblesToInner) { |
} |
} |
+TEST_F(LayerTreeHostImplVirtualViewportTest, |
+ DiagonalScrollBubblesPerfectlyToInner) { |
+ gfx::Size content_size = gfx::Size(100, 160); |
+ gfx::Size outer_viewport = gfx::Size(50, 80); |
+ gfx::Size inner_viewport = gfx::Size(25, 40); |
+ |
+ SetupVirtualViewportLayers(content_size, outer_viewport, inner_viewport); |
+ |
+ LayerImpl* outer_scroll = host_impl_->OuterViewportScrollLayer(); |
+ LayerImpl* inner_scroll = host_impl_->InnerViewportScrollLayer(); |
+ DrawFrame(); |
+ { |
+ gfx::Vector2dF inner_expected; |
+ gfx::Vector2dF outer_expected; |
+ EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset()); |
+ EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset()); |
+ |
+ // Make sure the scroll goes to the outer viewport first. |
+ EXPECT_EQ(InputHandler::ScrollStarted, |
+ host_impl_->ScrollBegin(gfx::Point(), InputHandler::Gesture)); |
+ EXPECT_EQ(InputHandler::ScrollStarted, host_impl_->FlingScrollBegin()); |
+ |
+ // Scroll near the edge of the outer viewport. |
+ gfx::Vector2d scroll_delta(inner_viewport.width(), inner_viewport.height()); |
+ host_impl_->ScrollBy(gfx::Point(), scroll_delta); |
+ outer_expected += scroll_delta; |
+ |
+ EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset()); |
+ EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset()); |
+ |
+ // Now diagonal scroll across the outer viewport boundary in a single event. |
+ // The entirety of the scroll should be consumed, as bubbling between inner |
+ // and outer viewport layers is perfect. |
+ host_impl_->ScrollBy(gfx::Point(), gfx::ScaleVector2d(scroll_delta, 2)); |
+ outer_expected += scroll_delta; |
+ inner_expected += scroll_delta; |
+ host_impl_->ScrollEnd(); |
+ |
+ EXPECT_VECTOR_EQ(inner_expected, inner_scroll->TotalScrollOffset()); |
+ EXPECT_VECTOR_EQ(outer_expected, outer_scroll->TotalScrollOffset()); |
+ } |
+} |
+ |
class LayerTreeHostImplWithImplicitLimitsTest : public LayerTreeHostImplTest { |
public: |
void SetUp() override { |