Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(99)

Unified Diff: third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp

Issue 2765053002: Avoid exposing cc::Layer tree to CompositorProxy (Closed)
Patch Set: Rebase onto blink reformat Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp
diff --git a/third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp b/third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp
index 0c10d6476898f9653f5a072f21a8d7181705e8d8..c9285aaa81370a02c433dc2527fc8971888e0b73 100644
--- a/third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp
+++ b/third_party/WebKit/Source/platform/graphics/CompositorMutatorClientTest.cpp
@@ -6,6 +6,18 @@
#include <memory>
#include "base/callback.h"
+#include "base/message_loop/message_loop.h"
+#include "base/time/time.h"
+#include "cc/test/fake_compositor_frame_sink.h"
+#include "cc/test/fake_impl_task_runner_provider.h"
+#include "cc/test/fake_layer_tree_host_impl.h"
+#include "cc/test/test_shared_bitmap_manager.h"
+#include "cc/test/test_task_graph_runner.h"
+#include "cc/trees/layer_tree_host_impl.h"
+#include "cc/trees/layer_tree_impl.h"
+#include "platform/graphics/CompositorElementId.h"
+#include "platform/graphics/CompositorMutableState.h"
+#include "platform/graphics/CompositorMutableStateProvider.h"
#include "platform/graphics/CompositorMutation.h"
#include "platform/graphics/CompositorMutationsTarget.h"
#include "platform/graphics/CompositorMutator.h"
@@ -28,13 +40,43 @@ class StubCompositorMutator : public CompositorMutator {
}
};
-class MockCompositoMutationsTarget : public CompositorMutationsTarget {
+class MockCompositorMutator : public CompositorMutator {
+ public:
+ MOCK_METHOD2(Mutate, bool(double, CompositorMutableStateProvider*));
+};
+
+class MockCompositorMutationsTarget : public CompositorMutationsTarget {
public:
MOCK_METHOD1(ApplyMutations, void(CompositorMutations*));
};
-TEST(CompositorMutatorClient, CallbackForNonNullMutationsShouldApply) {
- MockCompositoMutationsTarget target;
+class CompositorMutatorClientTest : public testing::Test {
+ public:
+ CompositorMutatorClientTest()
+ : compositor_frame_sink_(cc::FakeCompositorFrameSink::Create3d()) {
+ cc::LayerTreeSettings settings;
+ settings.layer_transforms_should_scale_layer_contents = true;
+ host_impl_.reset(new cc::FakeLayerTreeHostImpl(
+ settings, &task_runner_provider_, &task_graph_runner_));
+ host_impl_->SetVisible(true);
+ EXPECT_TRUE(host_impl_->InitializeRenderer(compositor_frame_sink_.get()));
+ }
+
+ cc::FakeLayerTreeHostImpl& hostImpl() { return *host_impl_; }
+
+ private:
+ // The cc testing machinery has fairly deep dependency on having a main
+ // message loop (one example is the task runner provider). We construct one
+ // here so that it's installed in TLA and can be found by other cc classes.
+ base::MessageLoop message_loop_;
+ cc::TestTaskGraphRunner task_graph_runner_;
+ cc::FakeImplTaskRunnerProvider task_runner_provider_;
+ std::unique_ptr<cc::FakeCompositorFrameSink> compositor_frame_sink_;
+ std::unique_ptr<cc::FakeLayerTreeHostImpl> host_impl_;
+};
+
+TEST_F(CompositorMutatorClientTest, CallbackForNonNullMutationsShouldApply) {
+ MockCompositorMutationsTarget target;
CompositorMutatorClient client(new StubCompositorMutator, &target);
std::unique_ptr<CompositorMutations> mutations =
@@ -45,13 +87,99 @@ TEST(CompositorMutatorClient, CallbackForNonNullMutationsShouldApply) {
client.TakeMutations().Run();
}
-TEST(CompositorMutatorClient, CallbackForNullMutationsShouldBeNoop) {
- MockCompositoMutationsTarget target;
+TEST_F(CompositorMutatorClientTest, CallbackForNullMutationsShouldBeNoop) {
+ MockCompositorMutationsTarget target;
CompositorMutatorClient client(new StubCompositorMutator, &target);
EXPECT_CALL(target, ApplyMutations(_)).Times(0);
EXPECT_TRUE(client.TakeMutations().is_null());
}
+TEST_F(CompositorMutatorClientTest, MutateOneProxy) {
+ MockCompositorMutationsTarget target;
+ MockCompositorMutator mutator;
+ CompositorMutatorClient client(&mutator, &target);
+
+ uint64_t proxyId = 12;
+ uint64_t elementId = 15;
+ uint32_t mutableProperties = CompositorMutableProperty::kOpacity |
+ CompositorMutableProperty::kTransform |
+ CompositorMutableProperty::kScrollLeft |
+ CompositorMutableProperty::kScrollTop;
+ client.RegisterCompositorProxy(proxyId, elementId, mutableProperties);
+
+ std::unique_ptr<cc::LayerImpl> root =
+ cc::LayerImpl::Create(hostImpl().active_tree(), 42);
+ std::unique_ptr<cc::LayerImpl> scroll =
+ cc::LayerImpl::Create(hostImpl().active_tree(), 11);
+ cc::LayerImpl* scrollLayer = scroll.get();
+ cc::LayerImpl* rootLayer = root.get();
+
+ root->test_properties()->AddChild(std::move(scroll));
+ root->SetElementId(
+ CreateCompositorElementId(elementId, CompositorSubElementId::kPrimary));
+ root->SetMutableProperties(CompositorMutableProperty::kOpacity |
+ CompositorMutableProperty::kTransform);
+
+ scrollLayer->SetScrollClipLayer(root->id());
+ scrollLayer->test_properties()->transform = gfx::Transform();
+ scrollLayer->SetPosition(gfx::PointF());
+ scrollLayer->SetBounds(gfx::Size(100, 100));
+ scrollLayer->SetDrawsContent(true);
+ scrollLayer->SetElementId(
+ CreateCompositorElementId(elementId, CompositorSubElementId::kScroll));
+ scrollLayer->SetMutableProperties(CompositorMutableProperty::kScrollLeft |
+ CompositorMutableProperty::kScrollTop);
+
+ hostImpl().SetViewportSize(scrollLayer->bounds());
+ hostImpl().active_tree()->SetRootLayerForTesting(std::move(root));
+ hostImpl().UpdateNumChildrenAndDrawPropertiesForActiveTree();
+
+ gfx::Transform zero(0, 0, 0, 0, 0, 0);
+ EXPECT_CALL(mutator, Mutate(_, _))
+ .WillOnce(testing::Invoke(
+ [zero, proxyId](double now,
+ CompositorMutableStateProvider* stateProvider) {
+ std::unique_ptr<CompositorMutableState> mutableState =
+ stateProvider->GetMutableStateFor(proxyId);
+ EXPECT_TRUE(mutableState);
+ EXPECT_EQ(gfx::Transform().ToString(),
+ gfx::Transform(mutableState->Transform()).ToString());
+ EXPECT_EQ(0, mutableState->ScrollLeft());
+ EXPECT_EQ(0, mutableState->ScrollTop());
+
+ mutableState->SetOpacity(0.5);
+ mutableState->SetTransform(zero.matrix());
+ mutableState->SetScrollLeft(10);
+ mutableState->SetScrollTop(20);
+ return false;
+ }));
+ client.Mutate(base::TimeTicks(), hostImpl().active_tree());
+
+ EXPECT_EQ(0.5, rootLayer->Opacity());
+ EXPECT_EQ(zero.ToString(), rootLayer->Transform().ToString());
+ EXPECT_EQ(10, scrollLayer->CurrentScrollOffset().x());
+ EXPECT_EQ(20, scrollLayer->CurrentScrollOffset().y());
+
+ EXPECT_CALL(target, ApplyMutations(_))
+ .WillOnce(
+ testing::Invoke([elementId, zero](CompositorMutations* mutations) {
+ EXPECT_EQ(1ul, mutations->map.size());
+ const CompositorMutation& mutation =
+ *mutations->map.Find(elementId)->value;
+ EXPECT_TRUE(mutation.IsOpacityMutated());
+ EXPECT_TRUE(mutation.IsTransformMutated());
+ EXPECT_TRUE(mutation.IsScrollLeftMutated());
+ EXPECT_TRUE(mutation.IsScrollTopMutated());
+
+ EXPECT_EQ(0.5, mutation.Opacity());
+ EXPECT_EQ(zero.ToString(),
+ gfx::Transform(mutation.Transform()).ToString());
+ EXPECT_EQ(10, mutation.ScrollLeft());
+ EXPECT_EQ(20, mutation.ScrollTop());
+ }));
+ client.TakeMutations().Run();
+}
+
} // namespace
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698