Index: third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositorTest.cpp |
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositorTest.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositorTest.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b9c7489be135251925fdc5b72b32a3796a0b7979 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositorTest.cpp |
@@ -0,0 +1,85 @@ |
+// Copyright 2017 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 "core/layout/compositing/PaintLayerCompositor.h" |
+ |
+#include "core/animation/Animation.h" |
+#include "core/animation/ElementAnimation.h" |
+#include "core/layout/LayoutTestHelper.h" |
+#include "core/paint/PaintLayer.h" |
+ |
+namespace blink { |
+ |
+namespace { |
+class PaintLayerCompositorTest : public RenderingTest { |
+ public: |
+ PaintLayerCompositorTest() |
+ : RenderingTest(SingleChildLocalFrameClient::Create()) {} |
+ |
+ private: |
+ void SetUp() { |
+ RenderingTest::SetUp(); |
+ EnableCompositing(); |
+ } |
+}; |
+} |
+ |
+TEST_F(PaintLayerCompositorTest, AdvancingToCompositingInputsClean) { |
+ SetBodyInnerHTML("<div id='box' style='position: relative'></div>"); |
+ |
+ PaintLayer* box_layer = |
+ ToLayoutBox(GetLayoutObjectByElementId("box"))->Layer(); |
+ ASSERT_TRUE(box_layer); |
+ EXPECT_FALSE(box_layer->NeedsCompositingInputsUpdate()); |
+ |
+ box_layer->SetNeedsCompositingInputsUpdate(); |
+ |
+ GetDocument().View()->UpdateLifecycleToCompositingInputsClean(); |
+ EXPECT_EQ(DocumentLifecycle::kCompositingInputsClean, |
+ GetDocument().Lifecycle().GetState()); |
+ EXPECT_FALSE(box_layer->NeedsCompositingInputsUpdate()); |
+} |
+ |
+TEST_F(PaintLayerCompositorTest, |
+ CompositingInputsCleanDoesNotTriggerAnimations) { |
+ SetBodyInnerHTML( |
+ "<style>@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }" |
+ ".animate { animation: fadeOut 2s; }</style>" |
+ "<div id='box'></div>" |
+ "<div id='otherBox'></div>"); |
+ |
+ Element* box = GetDocument().GetElementById("box"); |
+ Element* otherBox = GetDocument().GetElementById("otherBox"); |
+ ASSERT_TRUE(box); |
+ ASSERT_TRUE(otherBox); |
+ |
+ box->setAttribute("class", "animate", ASSERT_NO_EXCEPTION); |
+ |
+ // Update the lifecycle to CompositingInputsClean. This should not start the |
+ // animation lifecycle. |
+ GetDocument().View()->UpdateLifecycleToCompositingInputsClean(); |
+ EXPECT_EQ(DocumentLifecycle::kCompositingInputsClean, |
+ GetDocument().Lifecycle().GetState()); |
+ |
+ otherBox->setAttribute("class", "animate", ASSERT_NO_EXCEPTION); |
+ |
+ // Now run the rest of the lifecycle. Because both 'box' and 'otherBox' were |
+ // given animations separated only by a lifecycle update to |
+ // CompositingInputsClean, they should both be started in the same lifecycle |
+ // and as such grouped together. |
+ GetDocument().View()->UpdateAllLifecyclePhases(); |
+ EXPECT_EQ(DocumentLifecycle::kPaintClean, |
+ GetDocument().Lifecycle().GetState()); |
+ |
+ HeapVector<Member<Animation>> boxAnimations = |
+ ElementAnimation::getAnimations(*box); |
+ HeapVector<Member<Animation>> otherBoxAnimations = |
+ ElementAnimation::getAnimations(*box); |
+ |
+ EXPECT_EQ(1ul, boxAnimations.size()); |
+ EXPECT_EQ(1ul, otherBoxAnimations.size()); |
+ EXPECT_EQ(boxAnimations.front()->CompositorGroup(), |
+ otherBoxAnimations.front()->CompositorGroup()); |
+} |
+} |