Index: cc/trees/layer_tree_host_unittest.cc |
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc |
index 46874cfde1fdd688498ebfb10d5ce59ff47b6be7..89563d8e871d90c47be1be034493b8816662ea3d 100644 |
--- a/cc/trees/layer_tree_host_unittest.cc |
+++ b/cc/trees/layer_tree_host_unittest.cc |
@@ -1737,6 +1737,129 @@ class LayerTreeHostTestDeviceScaleFactorChange : public LayerTreeHostTest { |
SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceScaleFactorChange); |
+class LayerTreeHostTestDeviceColorSpaceChange : public LayerTreeHostTest { |
+ public: |
+ void SetupTree() override { |
+ space1_ = gfx::ColorSpace::CreateXYZD50(); |
+ space2_ = gfx::ColorSpace::CreateSRGB(); |
+ |
+ root_layer_ = Layer::Create(); |
+ root_layer_->SetBounds(gfx::Size(10, 20)); |
+ |
+ child_layer_ = FakePictureLayer::Create(&client_); |
+ child_layer_->SetBounds(gfx::Size(10, 10)); |
+ root_layer_->AddChild(child_layer_); |
+ |
+ layer_tree()->SetRootLayer(root_layer_); |
+ layer_tree()->SetDeviceColorSpace(space1_); |
+ LayerTreeHostTest::SetupTree(); |
+ client_.set_bounds(root_layer_->bounds()); |
+ } |
+ |
+ void BeginTest() override { PostSetNeedsCommitToMainThread(); } |
+ |
+ DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl, |
+ LayerTreeHostImpl::FrameData* frame_data, |
+ DrawResult draw_result) override { |
+ EXPECT_EQ(DRAW_SUCCESS, draw_result); |
+ |
+ int source_frame = host_impl->active_tree()->source_frame_number(); |
+ switch (source_frame) { |
+ case 0: |
+ // The first frame will have full damage, and should be in the initial |
+ // color space. |
+ EXPECT_FALSE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space1_ == host_impl->active_tree()->device_color_space()); |
+ break; |
+ case 1: |
+ // Empty commit. |
+ EXPECT_TRUE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space1_ == host_impl->active_tree()->device_color_space()); |
+ break; |
+ case 2: |
+ // The change from space1 to space2 should cause full damage. |
+ EXPECT_FALSE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space2_ == host_impl->active_tree()->device_color_space()); |
+ break; |
+ case 3: |
+ // Empty commit with the color space set to space2 redundantly. |
+ EXPECT_TRUE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space2_ == host_impl->active_tree()->device_color_space()); |
+ break; |
+ case 4: |
+ // The change from space2 to space1 should cause full damage. |
+ EXPECT_FALSE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space1_ == host_impl->active_tree()->device_color_space()); |
+ break; |
+ case 5: |
+ // Empty commit. |
+ EXPECT_TRUE(frame_data->has_no_damage); |
+ EXPECT_TRUE(space1_ == host_impl->active_tree()->device_color_space()); |
+ EndTest(); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ |
+ if (!frame_data->has_no_damage) { |
+ gfx::Rect root_damage_rect = |
+ frame_data->render_passes.back()->damage_rect; |
+ EXPECT_EQ( |
+ gfx::Rect( |
+ host_impl->active_tree()->root_layer_for_testing()->bounds()), |
+ root_damage_rect); |
+ } |
+ |
+ return draw_result; |
+ } |
+ |
+ void DidCommit() override { |
+ switch (layer_tree_host()->SourceFrameNumber()) { |
+ case 1: |
+ PostSetNeedsCommitToMainThread(); |
+ break; |
+ case 2: |
+ EXPECT_FALSE(child_layer_->NeedsDisplayForTesting()); |
+ layer_tree()->SetDeviceColorSpace(space2_); |
+ EXPECT_TRUE(child_layer_->NeedsDisplayForTesting()); |
+ break; |
+ case 3: |
+ // The redundant SetDeviceColorSpace should cause no commit and no |
+ // damage. Force a commit for the test to continue. |
+ layer_tree()->SetDeviceColorSpace(space2_); |
+ PostSetNeedsCommitToMainThread(); |
+ EXPECT_FALSE(child_layer_->NeedsDisplayForTesting()); |
+ break; |
+ case 4: |
+ EXPECT_FALSE(child_layer_->NeedsDisplayForTesting()); |
+ layer_tree()->SetDeviceColorSpace(space1_); |
+ EXPECT_TRUE(child_layer_->NeedsDisplayForTesting()); |
+ break; |
+ case 5: |
+ EXPECT_FALSE(child_layer_->NeedsDisplayForTesting()); |
+ PostSetNeedsCommitToMainThread(); |
+ break; |
+ case 6: |
+ break; |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ } |
+ |
+ void AfterTest() override {} |
+ |
+ private: |
+ gfx::ColorSpace space1_; |
+ gfx::ColorSpace space2_; |
+ FakeContentLayerClient client_; |
+ scoped_refptr<Layer> root_layer_; |
+ scoped_refptr<Layer> child_layer_; |
+}; |
+ |
+SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestDeviceColorSpaceChange); |
+ |
class LayerTreeHostTestSetNextCommitForcesRedraw : public LayerTreeHostTest { |
public: |
LayerTreeHostTestSetNextCommitForcesRedraw() |