| Index: third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f7b15eccd4e1ff7ed31cbff34b33b5af6a0313c8
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
|
| @@ -0,0 +1,174 @@
|
| +// Copyright 2014 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 "config.h"
|
| +#include "core/layout/compositing/CompositedLayerMapping.h"
|
| +
|
| +#include "core/frame/FrameView.h"
|
| +#include "core/layout/LayoutBoxModelObject.h"
|
| +#include "core/layout/LayoutTestHelper.h"
|
| +#include "core/paint/PaintLayer.h"
|
| +#include <gtest/gtest.h>
|
| +
|
| +namespace blink {
|
| +
|
| +class CompositedLayerMappingTest : public RenderingTest {
|
| +public:
|
| + CompositedLayerMappingTest()
|
| + : m_originalSlimmingPaintSynchronizedPaintingEnabled(RuntimeEnabledFeatures::slimmingPaintSynchronizedPaintingEnabled()) { }
|
| +
|
| +protected:
|
| + IntRect computeInterestRect(const GraphicsLayer* graphicsLayer, LayoutObject* owningLayoutObject)
|
| + {
|
| + return CompositedLayerMapping::computeInterestRect(graphicsLayer, owningLayoutObject);
|
| + }
|
| +
|
| +private:
|
| + void SetUp() override
|
| + {
|
| + RuntimeEnabledFeatures::setSlimmingPaintSynchronizedPaintingEnabled(true);
|
| +
|
| + RenderingTest::SetUp();
|
| + enableCompositing();
|
| + GraphicsLayer::setDrawDebugRedFillForTesting(false);
|
| + }
|
| +
|
| + void TearDown() override
|
| + {
|
| + GraphicsLayer::setDrawDebugRedFillForTesting(true);
|
| + RuntimeEnabledFeatures::setSlimmingPaintSynchronizedPaintingEnabled(m_originalSlimmingPaintSynchronizedPaintingEnabled);
|
| + }
|
| +
|
| + bool m_originalSlimmingPaintSynchronizedPaintingEnabled;
|
| +};
|
| +
|
| +static void printRect(IntRect rect)
|
| +{
|
| + fprintf(stderr, "[x=%d y=%d maxX=%d maxY=%d]\n", rect.x(), rect.y(), rect.maxX(), rect.maxY());
|
| +}
|
| +
|
| +static bool checkRectsEqual(const IntRect& expected, const IntRect& actual)
|
| +{
|
| + if (expected != actual) {
|
| + fprintf(stderr, "Expected: ");
|
| + printRect(expected);
|
| + fprintf(stderr, "Actual: ");
|
| + printRect(actual);
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, SimpleInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 200px; height: 200px; will-change: transform'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, TallLayerInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; will-change: transform'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(paintLayer->graphicsLayerBacking());
|
| + // Screen-space visible content rect is [8, 8, 200, 600]. Mapping back to local, adding 4000px in all directions, then
|
| + // clipping, yields this rect.
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4592), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, RotatedInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 200px; height: 200px; will-change: transform; transform: rotateZ(45deg)'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, RotatedTallInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 200px; height: 10000px; will-change: transform; transform: rotateZ(45deg)'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 5536), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, WideLayerInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 10000px; height: 200px; will-change: transform'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + // Screen-space visible content rect is [8, 8, 800, 200] (the screen is 800x600).
|
| + // Mapping back to local, adding 4000px in all directions, then clipping, yields this rect.
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 4792, 200), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, FixedPositionInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 300px; height: 400px; will-change: transform; position: fixed; top: 100px; left: 200px;'></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 300, 400), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, LayerOffscreenInterestRect)
|
| +{
|
| + setBodyInnerHTML(
|
| + "<div id='target' style='width: 200px; height: 200px; will-change: transform; position: absolute; top: 9000px; left: 0px;'>"
|
| + "</div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(!!paintLayer->graphicsLayerBacking());
|
| + // Offscreen layers are painted as usual.
|
| + fprintf(stderr, "\nTest:\n");
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 200), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, ScrollingLayerInterestRect)
|
| +{
|
| + setBodyInnerHTML("<div id='target' style='width: 200px; height: 200px; will-change: transform; overflow: scroll'>"
|
| + "<div style='width: 100px; height: 10000px'></div></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(paintLayer->graphicsLayerBacking());
|
| + // Offscreen layers are painted as usual.
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 200, 4592), computeInterestRect(paintLayer->graphicsLayerBackingForScrolling(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +TEST_F(CompositedLayerMappingTest, ClippedBigLayer)
|
| +{
|
| + setBodyInnerHTML("<div style='width: 1px; height: 1px; overflow: hidden'>"
|
| + "<div id='target' style='width: 10000px; height: 10000px; will-change: transform'></div></div>");
|
| +
|
| + document().view()->updateAllLifecyclePhases();
|
| + Element* element = document().getElementById("target");
|
| + PaintLayer* paintLayer = toLayoutBoxModelObject(element->layoutObject())->layer();
|
| + ASSERT_TRUE(paintLayer->graphicsLayerBacking());
|
| + // Offscreen layers are painted as usual.
|
| + EXPECT_TRUE(checkRectsEqual(IntRect(0, 0, 4001, 4001), computeInterestRect(paintLayer->graphicsLayerBacking(), paintLayer->layoutObject())));
|
| +}
|
| +
|
| +} // namespace blink
|
|
|