Index: cc/blimp/compositor_state_deserializer_unittest.cc |
diff --git a/cc/blimp/compositor_state_deserializer_unittest.cc b/cc/blimp/compositor_state_deserializer_unittest.cc |
deleted file mode 100644 |
index c08c43b9577f7f8633d2f02f4f8a9229d4a93d32..0000000000000000000000000000000000000000 |
--- a/cc/blimp/compositor_state_deserializer_unittest.cc |
+++ /dev/null |
@@ -1,404 +0,0 @@ |
-// Copyright 2016 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "compositor_state_deserializer.h" |
- |
-#include "base/memory/ptr_util.h" |
-#include "base/run_loop.h" |
-#include "cc/animation/animation_host.h" |
-#include "cc/blimp/client_picture_cache.h" |
-#include "cc/blimp/compositor_proto_state.h" |
-#include "cc/blimp/layer_tree_host_remote.h" |
-#include "cc/layers/content_layer_client.h" |
-#include "cc/layers/picture_layer.h" |
-#include "cc/layers/solid_color_scrollbar_layer.h" |
-#include "cc/playback/display_item_list.h" |
-#include "cc/playback/drawing_display_item.h" |
-#include "cc/proto/compositor_message.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_proxy.h" |
-#include "cc/test/fake_remote_compositor_bridge.h" |
-#include "cc/test/remote_client_layer_factory.h" |
-#include "cc/test/remote_compositor_test.h" |
-#include "cc/test/serialization_test_utils.h" |
-#include "cc/test/skia_common.h" |
-#include "cc/test/stub_layer_tree_host_client.h" |
-#include "cc/test/test_task_graph_runner.h" |
-#include "cc/trees/layer_tree_host_common.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "third_party/skia/include/core/SkPictureRecorder.h" |
- |
-namespace cc { |
-namespace { |
- |
-class FakeContentLayerClient : public ContentLayerClient { |
- public: |
- FakeContentLayerClient(scoped_refptr<DisplayItemList> display_list, |
- gfx::Rect recorded_viewport) |
- : display_list_(std::move(display_list)), |
- recorded_viewport_(recorded_viewport) {} |
- ~FakeContentLayerClient() override {} |
- |
- // ContentLayerClient implementation. |
- gfx::Rect PaintableRegion() override { return recorded_viewport_; } |
- scoped_refptr<DisplayItemList> PaintContentsToDisplayList( |
- PaintingControlSetting painting_status) override { |
- return display_list_; |
- } |
- bool FillsBoundsCompletely() const override { return false; } |
- size_t GetApproximateUnsharedMemoryUsage() const override { return 0; } |
- |
- private: |
- scoped_refptr<DisplayItemList> display_list_; |
- gfx::Rect recorded_viewport_; |
-}; |
- |
-class CompositorStateDeserializerTest : public RemoteCompositorTest { |
- public: |
- void VerifyTreesAreIdentical() { |
- VerifySerializedTreesAreIdentical( |
- layer_tree_host_remote_->GetLayerTree(), |
- layer_tree_host_in_process_->GetLayerTree(), |
- compositor_state_deserializer_.get()); |
- } |
-}; |
- |
-TEST_F(CompositorStateDeserializerTest, BasicSync) { |
- // Set up a tree with a single node. |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- |
- // Swap the root layer. |
- scoped_refptr<Layer> new_root_layer = Layer::Create(); |
- new_root_layer->AddChild(Layer::Create()); |
- new_root_layer->AddChild(Layer::Create()); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(new_root_layer); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- // Verify that we are no longer tracking the destroyed layer on the client. |
- EXPECT_EQ( |
- compositor_state_deserializer_->GetLayerForEngineId(root_layer->id()), |
- nullptr); |
- |
- // Remove the root layer to change to a null tree. |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(nullptr); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, ViewportLayers) { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- scoped_refptr<Layer> overscroll_elasticity_layer = Layer::Create(); |
- scoped_refptr<Layer> inner_viewport_scroll_layer = Layer::Create(); |
- scoped_refptr<Layer> outer_viewport_scroll_layer = Layer::Create(); |
- scoped_refptr<Layer> page_scale_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->RegisterViewportLayers( |
- overscroll_elasticity_layer, page_scale_layer, |
- inner_viewport_scroll_layer, outer_viewport_scroll_layer); |
- |
- root_layer->AddChild(overscroll_elasticity_layer); |
- overscroll_elasticity_layer->AddChild(page_scale_layer); |
- page_scale_layer->AddChild(inner_viewport_scroll_layer); |
- inner_viewport_scroll_layer->AddChild(outer_viewport_scroll_layer); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, ScrollClipAndMaskLayers) { |
- /* root -- A---C---D |
- / | \ |
- / | E(MaskLayer) |
- / ------B */ |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- scoped_refptr<Layer> layer_a = Layer::Create(); |
- scoped_refptr<Layer> layer_b = Layer::Create(); |
- scoped_refptr<Layer> layer_c = Layer::Create(); |
- scoped_refptr<Layer> layer_d = Layer::Create(); |
- scoped_refptr<Layer> layer_e = Layer::Create(); |
- |
- root_layer->AddChild(layer_a); |
- root_layer->AddChild(layer_b); |
- layer_a->AddChild(layer_c); |
- layer_c->AddChild(layer_d); |
- |
- layer_a->SetMaskLayer(layer_e.get()); |
- layer_c->SetScrollParent(layer_b.get()); |
- layer_c->SetScrollClipLayerId(root_layer->id()); |
- layer_d->SetClipParent(layer_a.get()); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, ReconcileScrollAndScale) { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- // Set scroll offset. |
- scoped_refptr<Layer> scroll_layer = Layer::Create(); |
- root_layer->AddChild(scroll_layer); |
- gfx::ScrollOffset engine_offset(4, 3); |
- scroll_layer->SetScrollOffset(engine_offset); |
- |
- // Set page scale. |
- float engine_page_scale = 0.5f; |
- layer_tree_host_remote_->GetLayerTree()->SetPageScaleFactorAndLimits( |
- engine_page_scale, 1.0, 1.0); |
- |
- // Synchronize State and verify that the engine values are used. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- Layer* client_scroll_layer = |
- compositor_state_deserializer_->GetLayerForEngineId(scroll_layer->id()); |
- EXPECT_EQ(engine_page_scale, |
- layer_tree_host_in_process_->GetLayerTree()->page_scale_factor()); |
- EXPECT_EQ(engine_offset, client_scroll_layer->scroll_offset()); |
- |
- // Now send some updates from the impl thread. |
- ScrollAndScaleSet scroll_and_scale_set; |
- |
- gfx::ScrollOffset offset_from_impl_thread(10, 3); |
- gfx::ScrollOffset scroll_delta = |
- offset_from_impl_thread - client_scroll_layer->scroll_offset(); |
- LayerTreeHostCommon::ScrollUpdateInfo scroll_update; |
- scroll_update.layer_id = client_scroll_layer->id(); |
- scroll_update.scroll_delta = gfx::ScrollOffsetToFlooredVector2d(scroll_delta); |
- scroll_and_scale_set.scrolls.push_back(scroll_update); |
- |
- float page_scale_from_impl_side = 3.2f; |
- float page_scale_delta = |
- page_scale_from_impl_side / |
- layer_tree_host_in_process_->GetLayerTree()->page_scale_factor(); |
- scroll_and_scale_set.page_scale_delta = page_scale_delta; |
- |
- layer_tree_host_in_process_->ApplyScrollAndScale(&scroll_and_scale_set); |
- |
- // The values on the client should have been forced to retain the original |
- // engine value. |
- EXPECT_EQ(engine_page_scale, |
- layer_tree_host_in_process_->GetLayerTree()->page_scale_factor()); |
- EXPECT_EQ(engine_offset, client_scroll_layer->scroll_offset()); |
- |
- // Now pull the deltas from the client onto the engine, this should result |
- // in an aborted commit. |
- proto::ClientStateUpdate client_state_update; |
- compositor_state_deserializer_->PullClientStateUpdate(&client_state_update); |
- |
- // Send the reflected main frame state to the client layer tree host. |
- compositor_state_deserializer_->SendUnappliedDeltasToLayerTreeHost(); |
- const ReflectedMainFrameState* reflected_state = |
- layer_tree_host_in_process_->reflected_main_frame_state_for_testing(); |
- EXPECT_EQ(reflected_state->scrolls.size(), 1u); |
- EXPECT_EQ(reflected_state->scrolls[0].layer_id, client_scroll_layer->id()); |
- EXPECT_EQ(reflected_state->scrolls[0].scroll_delta, |
- gfx::ScrollOffsetToVector2dF(scroll_delta)); |
- EXPECT_EQ(reflected_state->page_scale_delta, page_scale_delta); |
- |
- layer_tree_host_remote_->ApplyStateUpdateFromClient(client_state_update); |
- |
- // Inform the deserializer that the updates were applied on the engine. |
- // This should pre-emptively apply the deltas on the client. |
- compositor_state_deserializer_->DidApplyStateUpdatesOnEngine(); |
- EXPECT_EQ(page_scale_from_impl_side, |
- layer_tree_host_in_process_->GetLayerTree()->page_scale_factor()); |
- EXPECT_EQ(offset_from_impl_thread, client_scroll_layer->scroll_offset()); |
- |
- // Now update the scroll offset on the engine, and ensure that the value is |
- // used on the client. |
- gfx::ScrollOffset new_engine_offset(10, 20); |
- scroll_layer->SetScrollOffset(new_engine_offset); |
- |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- EXPECT_EQ(page_scale_from_impl_side, |
- layer_tree_host_in_process_->GetLayerTree()->page_scale_factor()); |
- EXPECT_EQ(new_engine_offset, client_scroll_layer->scroll_offset()); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, PropertyTreesAreIdentical) { |
- // Override the LayerFactory. This is necessary to ensure the layer ids |
- // tracked in PropertyTrees on the engine and client are identical. |
- compositor_state_deserializer_->SetLayerFactoryForTesting( |
- base::MakeUnique<RemoteClientLayerFactory>()); |
- |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- root_layer->SetBounds(gfx::Size(10, 10)); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- scoped_refptr<Layer> child1 = Layer::Create(); |
- root_layer->AddChild(child1); |
- gfx::Transform transform; |
- transform.Translate(gfx::Vector2dF(5, 4)); |
- child1->SetTransform(transform); |
- child1->SetMasksToBounds(true); |
- |
- scoped_refptr<Layer> child2 = Layer::Create(); |
- root_layer->AddChild(child2); |
- child2->SetBounds(gfx::Size(5, 5)); |
- child2->SetScrollOffset(gfx::ScrollOffset(3, 4)); |
- child2->SetScrollParent(child1.get()); |
- child2->SetUserScrollable(true, true); |
- |
- scoped_refptr<Layer> grandchild11 = Layer::Create(); |
- child1->AddChild(grandchild11); |
- grandchild11->SetClipParent(root_layer.get()); |
- |
- scoped_refptr<Layer> grandchild21 = Layer::Create(); |
- child2->AddChild(grandchild21); |
- grandchild21->SetScrollClipLayerId(child1->id()); |
- grandchild21->SetOpacity(0.5); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- EXPECT_EQ(root_layer->id(), layer_tree_host_in_process_->root_layer()->id()); |
- |
- // Sanity test to ensure that the PropertyTrees generated from the Layers on |
- // the client and engine are identical. |
- layer_tree_host_remote_->GetLayerTree()->BuildPropertyTreesForTesting(); |
- PropertyTrees* engine_property_trees = |
- layer_tree_host_remote_->GetLayerTree()->property_trees(); |
- |
- layer_tree_host_in_process_->BuildPropertyTreesForTesting(); |
- PropertyTrees* client_property_trees = |
- layer_tree_host_in_process_->property_trees(); |
- |
- EXPECT_EQ(*engine_property_trees, *client_property_trees); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, SolidColorScrollbarLayer) { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- scoped_refptr<Layer> child_layer1 = Layer::Create(); |
- root_layer->AddChild(child_layer1); |
- scoped_refptr<SolidColorScrollbarLayer> scroll_layer1 = |
- SolidColorScrollbarLayer::Create(ScrollbarOrientation::HORIZONTAL, 20, 5, |
- true, 3); |
- scroll_layer1->SetScrollLayer(child_layer1->id()); |
- child_layer1->AddChild(scroll_layer1); |
- |
- scoped_refptr<SolidColorScrollbarLayer> scroll_layer2 = |
- SolidColorScrollbarLayer::Create(ScrollbarOrientation::VERTICAL, 2, 9, |
- false, 3); |
- root_layer->AddChild(scroll_layer2); |
- scoped_refptr<Layer> child_layer2 = Layer::Create(); |
- scroll_layer2->AddChild(child_layer2); |
- scroll_layer2->SetScrollLayer(child_layer2->id()); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- |
- // Verify Scrollbar layers. |
- SolidColorScrollbarLayer* client_scroll_layer1 = |
- static_cast<SolidColorScrollbarLayer*>( |
- compositor_state_deserializer_->GetLayerForEngineId( |
- scroll_layer1->id())); |
- EXPECT_EQ(client_scroll_layer1->ScrollLayerId(), |
- compositor_state_deserializer_ |
- ->GetLayerForEngineId(scroll_layer1->ScrollLayerId()) |
- ->id()); |
- EXPECT_EQ(client_scroll_layer1->orientation(), scroll_layer1->orientation()); |
- |
- SolidColorScrollbarLayer* client_scroll_layer2 = |
- static_cast<SolidColorScrollbarLayer*>( |
- compositor_state_deserializer_->GetLayerForEngineId( |
- scroll_layer2->id())); |
- EXPECT_EQ(client_scroll_layer2->ScrollLayerId(), |
- compositor_state_deserializer_ |
- ->GetLayerForEngineId(scroll_layer2->ScrollLayerId()) |
- ->id()); |
- EXPECT_EQ(client_scroll_layer2->orientation(), scroll_layer2->orientation()); |
-} |
- |
-TEST_F(CompositorStateDeserializerTest, PictureLayer) { |
- scoped_refptr<Layer> root_layer = Layer::Create(); |
- root_layer->SetBounds(gfx::Size(10, 10)); |
- root_layer->SetIsDrawable(true); |
- layer_tree_host_remote_->GetLayerTree()->SetRootLayer(root_layer); |
- |
- gfx::Size layer_size = gfx::Size(5, 5); |
- |
- gfx::PointF offset(2.f, 3.f); |
- SkPictureRecorder recorder; |
- SkCanvas* canvas; |
- SkPaint red_paint; |
- red_paint.setColor(SK_ColorRED); |
- canvas = recorder.beginRecording(SkRect::MakeXYWH( |
- offset.x(), offset.y(), layer_size.width(), layer_size.height())); |
- canvas->translate(offset.x(), offset.y()); |
- canvas->drawRectCoords(0.f, 0.f, 4.f, 4.f, red_paint); |
- sk_sp<SkPicture> test_picture = recorder.finishRecordingAsPicture(); |
- |
- DisplayItemListSettings settings; |
- settings.use_cached_picture = false; |
- scoped_refptr<DisplayItemList> display_list = |
- DisplayItemList::Create(settings); |
- const gfx::Rect visual_rect(0, 0, 42, 42); |
- display_list->CreateAndAppendDrawingItem<DrawingDisplayItem>(visual_rect, |
- test_picture); |
- display_list->Finalize(); |
- FakeContentLayerClient content_client(display_list, gfx::Rect(layer_size)); |
- |
- scoped_refptr<PictureLayer> picture_layer = |
- PictureLayer::Create(&content_client); |
- picture_layer->SetBounds(layer_size); |
- picture_layer->SetIsDrawable(true); |
- root_layer->AddChild(picture_layer); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- |
- // Verify PictureLayer. |
- PictureLayer* client_picture_layer = static_cast<PictureLayer*>( |
- compositor_state_deserializer_->GetLayerForEngineId(picture_layer->id())); |
- scoped_refptr<DisplayItemList> client_display_list = |
- client_picture_layer->client()->PaintContentsToDisplayList( |
- ContentLayerClient::PaintingControlSetting::PAINTING_BEHAVIOR_NORMAL); |
- EXPECT_TRUE(AreDisplayListDrawingResultsSame( |
- gfx::Rect(layer_size), display_list.get(), client_display_list.get())); |
- |
- // Now attach new layer with the same DisplayList. |
- scoped_refptr<PictureLayer> picture_layer2 = |
- PictureLayer::Create(&content_client); |
- picture_layer2->SetBounds(layer_size); |
- picture_layer2->SetIsDrawable(true); |
- root_layer->AddChild(picture_layer2); |
- |
- // Synchronize State and verify. |
- base::RunLoop().RunUntilIdle(); |
- VerifyTreesAreIdentical(); |
- |
- // Verify PictureLayer2. |
- PictureLayer* client_picture_layer2 = static_cast<PictureLayer*>( |
- compositor_state_deserializer_->GetLayerForEngineId( |
- picture_layer2->id())); |
- scoped_refptr<DisplayItemList> client_display_list2 = |
- client_picture_layer2->client()->PaintContentsToDisplayList( |
- ContentLayerClient::PaintingControlSetting::PAINTING_BEHAVIOR_NORMAL); |
- EXPECT_TRUE(AreDisplayListDrawingResultsSame( |
- gfx::Rect(layer_size), display_list.get(), client_display_list2.get())); |
-} |
- |
-} // namespace |
-} // namespace cc |