Index: cc/trees/layer_tree_host_unittest_picture.cc |
diff --git a/cc/trees/layer_tree_host_unittest_picture.cc b/cc/trees/layer_tree_host_unittest_picture.cc |
index fca03807e7b0589670678f304641993e2399d1f5..bb13a32b06e8f9435189e513b23655e71fd108a6 100644 |
--- a/cc/trees/layer_tree_host_unittest_picture.cc |
+++ b/cc/trees/layer_tree_host_unittest_picture.cc |
@@ -576,5 +576,105 @@ class LayerTreeHostPictureTestRSLLMembershipWithScale |
// compositor thread. |
MULTI_THREAD_TEST_F(LayerTreeHostPictureTestRSLLMembershipWithScale); |
+class LayerTreeHostPictureTestForceRecalculateScales |
+ : public LayerTreeHostPictureTest { |
+ void SetupTree() override { |
+ gfx::Size size(100, 100); |
+ scoped_refptr<Layer> root = Layer::Create(); |
+ root->SetBounds(size); |
+ |
+ will_change_layer_ = FakePictureLayer::Create(&client_); |
+ will_change_layer_->SetHasWillChangeTransformHint(true); |
+ will_change_layer_->SetBounds(size); |
+ root->AddChild(will_change_layer_); |
+ |
+ normal_layer_ = FakePictureLayer::Create(&client_); |
+ normal_layer_->SetBounds(size); |
+ root->AddChild(normal_layer_); |
+ |
+ layer_tree()->SetRootLayer(root); |
+ layer_tree()->SetViewportSize(size); |
+ |
+ client_.set_fill_with_nonsolid_color(true); |
+ client_.set_bounds(size); |
+ } |
+ |
+ void InitializeSettings(LayerTreeSettings* settings) override { |
+ settings->layer_transforms_should_scale_layer_contents = true; |
+ } |
+ |
+ void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
+ |
+ void DrawLayersOnThread(LayerTreeHostImpl* impl) override { |
+ FakePictureLayerImpl* will_change_layer = |
+ static_cast<FakePictureLayerImpl*>( |
+ impl->active_tree()->LayerById(will_change_layer_->id())); |
+ FakePictureLayerImpl* normal_layer = static_cast<FakePictureLayerImpl*>( |
+ impl->active_tree()->LayerById(normal_layer_->id())); |
+ |
+ switch (impl->sync_tree()->source_frame_number()) { |
+ case 0: |
+ // On first commit, both layers are at the default scale. |
+ ASSERT_EQ(1u, will_change_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(1.f, |
+ will_change_layer->tilings()->tiling_at(0)->contents_scale()); |
+ ASSERT_EQ(1u, normal_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(1.f, normal_layer->tilings()->tiling_at(0)->contents_scale()); |
+ |
+ MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind( |
+ &LayerTreeHostPictureTestForceRecalculateScales::ScaleRootUp, |
+ base::Unretained(this))); |
+ break; |
+ case 1: |
+ // On 2nd commit after scaling up to 2, the normal layer will adjust its |
+ // scale and the will change layer should not (as it is will change. |
+ ASSERT_EQ(1u, will_change_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(1.f, |
+ will_change_layer->tilings()->tiling_at(0)->contents_scale()); |
+ ASSERT_EQ(1u, normal_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(2.f, normal_layer->tilings()->tiling_at(0)->contents_scale()); |
+ |
+ MainThreadTaskRunner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&LayerTreeHostPictureTestForceRecalculateScales:: |
+ ScaleRootUpAndRecalculateScales, |
+ base::Unretained(this))); |
+ break; |
+ case 2: |
+ // On 3rd commit, both layers should adjust scales due to forced |
+ // recalculating. |
+ ASSERT_EQ(1u, will_change_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(4.f, |
+ will_change_layer->tilings()->tiling_at(0)->contents_scale()); |
+ ASSERT_EQ(1u, normal_layer->tilings()->num_tilings()); |
+ EXPECT_EQ(4.f, normal_layer->tilings()->tiling_at(0)->contents_scale()); |
+ EndTest(); |
+ break; |
+ } |
+ } |
+ |
+ void ScaleRootUp() { |
+ gfx::Transform transform; |
+ transform.Scale(2, 2); |
+ layer_tree_host()->GetLayerTree()->root_layer()->SetTransform(transform); |
+ } |
+ |
+ void ScaleRootUpAndRecalculateScales() { |
+ gfx::Transform transform; |
+ transform.Scale(4, 4); |
+ layer_tree_host()->GetLayerTree()->root_layer()->SetTransform(transform); |
+ layer_tree_host()->SetNeedsRecalculateRasterScales(); |
+ } |
+ |
+ void AfterTest() override {} |
+ |
+ scoped_refptr<FakePictureLayer> will_change_layer_; |
+ scoped_refptr<FakePictureLayer> normal_layer_; |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostPictureTestForceRecalculateScales); |
+ |
} // namespace |
} // namespace cc |