| Index: cc/trees/layer_tree_host_unittest_serialization.cc | 
| diff --git a/cc/trees/layer_tree_host_unittest_serialization.cc b/cc/trees/layer_tree_host_unittest_serialization.cc | 
| index b1beece79ddaef92747109a18d3ef0c57afa4a69..59bc7016f7ecd7f5412506b12032217d6c931793 100644 | 
| --- a/cc/trees/layer_tree_host_unittest_serialization.cc | 
| +++ b/cc/trees/layer_tree_host_unittest_serialization.cc | 
| @@ -4,13 +4,21 @@ | 
|  | 
| #include "cc/trees/layer_tree_host.h" | 
|  | 
| +#include <memory> | 
| + | 
| +#include "base/memory/ptr_util.h" | 
| +#include "cc/layers/empty_content_layer_client.h" | 
| #include "cc/layers/heads_up_display_layer.h" | 
| #include "cc/layers/layer.h" | 
| #include "cc/proto/layer.pb.h" | 
| #include "cc/proto/layer_tree_host.pb.h" | 
| +#include "cc/test/fake_image_serialization_processor.h" | 
| #include "cc/test/fake_layer_tree_host.h" | 
| #include "cc/test/fake_layer_tree_host_client.h" | 
| +#include "cc/test/fake_picture_layer.h" | 
| +#include "cc/test/fake_recording_source.h" | 
| #include "cc/test/layer_tree_test.h" | 
| +#include "cc/test/skia_common.h" | 
| #include "cc/test/test_task_graph_runner.h" | 
| #include "cc/trees/layer_tree_settings.h" | 
| #include "testing/gtest/include/gtest/gtest.h" | 
| @@ -21,18 +29,54 @@ | 
|  | 
| namespace cc { | 
|  | 
| +namespace { | 
| +std::unique_ptr<FakeRecordingSource> CreateRecordingSource( | 
| +    const gfx::Rect& viewport) { | 
| +  gfx::Rect layer_rect(viewport.right(), viewport.bottom()); | 
| +  std::unique_ptr<FakeRecordingSource> recording_source = | 
| +      FakeRecordingSource::CreateRecordingSource(viewport, layer_rect.size()); | 
| +  return recording_source; | 
| +} | 
| + | 
| +scoped_refptr<FakePictureLayer> CreatePictureLayer() { | 
| +  gfx::Rect recorded_viewport(0, 0, 256, 256); | 
| + | 
| +  std::unique_ptr<FakeRecordingSource> recording_source = | 
| +      CreateRecordingSource(recorded_viewport); | 
| +  recording_source->SetDisplayListUsesCachedPicture(false); | 
| + | 
| +  SkPaint simple_paint; | 
| +  simple_paint.setColor(SkColorSetARGB(255, 12, 23, 34)); | 
| +  recording_source->add_draw_rect_with_paint(gfx::Rect(0, 0, 256, 256), | 
| +                                             simple_paint); | 
| +  recording_source->SetGenerateDiscardableImagesMetadata(true); | 
| +  recording_source->Rerecord(); | 
| + | 
| +  ContentLayerClient* client = EmptyContentLayerClient::GetInstance(); | 
| +  return FakePictureLayer::CreateWithRecordingSource( | 
| +      client, std::move(recording_source)); | 
| +} | 
| +}  // namespace | 
| + | 
| class LayerTreeHostSerializationTest : public testing::Test { | 
| public: | 
| LayerTreeHostSerializationTest() | 
| -      : client_src_(FakeLayerTreeHostClient::DIRECT_3D), | 
| +      : image_serialization_processor_( | 
| +            base::WrapUnique(new FakeImageSerializationProcessor)), | 
| +        client_src_(FakeLayerTreeHostClient::DIRECT_3D), | 
| client_dst_(FakeLayerTreeHostClient::DIRECT_3D) {} | 
|  | 
| protected: | 
| void SetUp() override { | 
| -    layer_tree_host_src_ = | 
| -        FakeLayerTreeHost::Create(&client_src_, &task_graph_runner_src_); | 
| -    layer_tree_host_dst_ = | 
| -        FakeLayerTreeHost::Create(&client_dst_, &task_graph_runner_dst_); | 
| +    LayerTreeSettings settings; | 
| +    layer_tree_host_src_ = FakeLayerTreeHost::Create( | 
| +        &client_src_, &task_graph_runner_src_, settings, | 
| +        CompositorMode::SINGLE_THREADED, image_serialization_processor_.get()); | 
| +    layer_tree_host_dst_ = FakeLayerTreeHost::Create( | 
| +        &client_dst_, &task_graph_runner_dst_, settings, | 
| +        CompositorMode::SINGLE_THREADED, image_serialization_processor_.get()); | 
| +    layer_tree_host_src_->InitializePictureCacheForTesting(); | 
| +    layer_tree_host_dst_->InitializePictureCacheForTesting(); | 
| } | 
|  | 
| void TearDown() override { | 
| @@ -311,6 +355,39 @@ class LayerTreeHostSerializationTest : public testing::Test { | 
| VerifySerializationAndDeserialization(); | 
| } | 
|  | 
| +  void RunPictureLayerMultipleSerializationsTest() { | 
| +    // Just fake setup a layer for both source and dest. | 
| +    scoped_refptr<Layer> root_layer_src = Layer::Create(); | 
| +    layer_tree_host_src_->SetRootLayer(root_layer_src); | 
| +    layer_tree_host_dst_->SetRootLayer(Layer::Create()); | 
| + | 
| +    // Ensure that a PictureLayer work correctly for multiple rounds of | 
| +    // serialization and deserialization. | 
| +    scoped_refptr<FakePictureLayer> picture_layer_src = CreatePictureLayer(); | 
| +    root_layer_src->AddChild(picture_layer_src); | 
| +    picture_layer_src->SetBounds(gfx::Size(10, 10)); | 
| +    picture_layer_src->SetIsDrawable(true); | 
| +    picture_layer_src->SavePaintProperties(); | 
| +    picture_layer_src->Update(); | 
| +    picture_layer_src->SavePaintProperties(); | 
| +    VerifySerializationAndDeserialization(); | 
| +    ASSERT_EQ(1U, layer_tree_host_dst_->root_layer()->children().size()); | 
| +    PictureLayer* picture_layer_dst = reinterpret_cast<PictureLayer*>( | 
| +        layer_tree_host_dst_->root_layer()->child_at(0)); | 
| + | 
| +    RecordingSource* recording_source_src = | 
| +        picture_layer_src->GetRecordingSourceForTesting(); | 
| +    RecordingSource* recording_source_dst = | 
| +        picture_layer_dst->GetRecordingSourceForTesting(); | 
| +    EXPECT_EQ(recording_source_src->GetSize(), recording_source_dst->GetSize()); | 
| +    EXPECT_TRUE(AreDisplayListDrawingResultsSame( | 
| +        gfx::Rect(recording_source_src->GetSize()), | 
| +        recording_source_src->GetDisplayItemList(), | 
| +        recording_source_dst->GetDisplayItemList())); | 
| + | 
| +    VerifySerializationAndDeserialization(); | 
| +  } | 
| + | 
| void RunAddAndRemoveNodeFromLayerTree() { | 
| /* Testing serialization when the tree hierarchy changes like this: | 
| root                  root | 
| @@ -345,13 +422,15 @@ class LayerTreeHostSerializationTest : public testing::Test { | 
| } | 
|  | 
| private: | 
| +  std::unique_ptr<ImageSerializationProcessor> image_serialization_processor_; | 
| + | 
| TestTaskGraphRunner task_graph_runner_src_; | 
| FakeLayerTreeHostClient client_src_; | 
| -  std::unique_ptr<LayerTreeHost> layer_tree_host_src_; | 
| +  std::unique_ptr<FakeLayerTreeHost> layer_tree_host_src_; | 
|  | 
| TestTaskGraphRunner task_graph_runner_dst_; | 
| FakeLayerTreeHostClient client_dst_; | 
| -  std::unique_ptr<LayerTreeHost> layer_tree_host_dst_; | 
| +  std::unique_ptr<FakeLayerTreeHost> layer_tree_host_dst_; | 
| }; | 
|  | 
| TEST_F(LayerTreeHostSerializationTest, AllMembersChanged) { | 
| @@ -370,4 +449,8 @@ TEST_F(LayerTreeHostSerializationTest, AddAndRemoveNodeFromLayerTree) { | 
| RunAddAndRemoveNodeFromLayerTree(); | 
| } | 
|  | 
| +TEST_F(LayerTreeHostSerializationTest, PictureLayerMultipleSerializations) { | 
| +  RunPictureLayerMultipleSerializationsTest(); | 
| +} | 
| + | 
| }  // namespace cc | 
|  |