blob: 885d1f1ec0e033452ef9914c6a32a99f32299be4 [file] [log] [blame]
// 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 "core/paint/PaintPropertyTreePrinter.h"
#include "core/layout/LayoutObject.h"
#include "core/layout/LayoutTestHelper.h"
#include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h"
#include "testing/gmock/include/gmock/gmock-matchers.h"
#include "testing/gtest/include/gtest/gtest.h"
#if DCHECK_IS_ON()
namespace blink {
typedef bool TestParamRootLayerScrolling;
class PaintPropertyTreePrinterTest
: public ::testing::WithParamInterface<TestParamRootLayerScrolling>,
private ScopedSlimmingPaintV2ForTest,
private ScopedRootLayerScrollingForTest,
public RenderingTest {
public:
PaintPropertyTreePrinterTest()
: ScopedSlimmingPaintV2ForTest(true),
ScopedRootLayerScrollingForTest(GetParam()),
RenderingTest(SingleChildLocalFrameClient::create()) {}
private:
void SetUp() override {
Settings::setMockScrollbarsEnabled(true);
RenderingTest::SetUp();
enableCompositing();
}
void TearDown() override {
RenderingTest::TearDown();
Settings::setMockScrollbarsEnabled(false);
}
};
INSTANTIATE_TEST_CASE_P(All, PaintPropertyTreePrinterTest, ::testing::Bool());
TEST_P(PaintPropertyTreePrinterTest, SimpleTransformTree) {
setBodyInnerHTML("hello world");
String transformTreeAsString =
transformPropertyTreeAsString(*document().view());
EXPECT_THAT(transformTreeAsString.ascii().data(),
testing::MatchesRegex("root .*"
" .*Translation \\(.*\\) .*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleClipTree) {
setBodyInnerHTML("hello world");
String clipTreeAsString = clipPropertyTreeAsString(*document().view());
EXPECT_THAT(clipTreeAsString.ascii().data(),
testing::MatchesRegex("root .*"
" .*Clip \\(.*\\) .*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleEffectTree) {
setBodyInnerHTML("<div style='opacity: 0.9;'>hello world</div>");
String effectTreeAsString = effectPropertyTreeAsString(*document().view());
EXPECT_THAT(effectTreeAsString.ascii().data(),
testing::MatchesRegex("root .*"
" Effect \\(LayoutBlockFlow DIV\\) .*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleScrollTree) {
setBodyInnerHTML("<div style='height: 4000px;'>hello world</div>");
String scrollTreeAsString = scrollPropertyTreeAsString(*document().view());
EXPECT_THAT(scrollTreeAsString.ascii().data(),
testing::MatchesRegex("root .*"
" Scroll \\(.*\\) .*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleTransformTreePath) {
setBodyInnerHTML(
"<div id='transform' style='transform: translate3d(10px, 10px, "
"0px);'></div>");
LayoutObject* transformedObject =
document().getElementById("transform")->layoutObject();
const auto* transformedObjectProperties =
transformedObject->paintProperties();
String transformPathAsString =
transformedObjectProperties->transform()->toTreeString();
EXPECT_THAT(transformPathAsString.ascii().data(),
testing::MatchesRegex("root .* transform.*"
" .* transform.*"
" .* transform.*"
" .* transform.*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleClipTreePath) {
setBodyInnerHTML(
"<div id='clip' style='position: absolute; clip: rect(10px, 80px, 70px, "
"40px);'></div>");
LayoutObject* clippedObject =
document().getElementById("clip")->layoutObject();
const auto* clippedObjectProperties = clippedObject->paintProperties();
String clipPathAsString = clippedObjectProperties->cssClip()->toTreeString();
EXPECT_THAT(clipPathAsString.ascii().data(),
testing::MatchesRegex("root .* rect.*"
" .* rect.*"
" .* rect.*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleEffectTreePath) {
setBodyInnerHTML("<div id='effect' style='opacity: 0.9;'></div>");
LayoutObject* effectObject =
document().getElementById("effect")->layoutObject();
const auto* effectObjectProperties = effectObject->paintProperties();
String effectPathAsString = effectObjectProperties->effect()->toTreeString();
EXPECT_THAT(effectPathAsString.ascii().data(),
testing::MatchesRegex("root .* opacity.*"
" .* opacity.*"));
}
TEST_P(PaintPropertyTreePrinterTest, SimpleScrollTreePath) {
setBodyInnerHTML(
"<div id='scroll' style='overflow: scroll; height: 100px;'>"
" <div id='forceScroll' style='height: 4000px;'></div>"
"</div>");
LayoutObject* scrollObject =
document().getElementById("scroll")->layoutObject();
const auto* scrollObjectProperties = scrollObject->paintProperties();
String scrollPathAsString =
scrollObjectProperties->scrollTranslation()->scrollNode()->toTreeString();
EXPECT_THAT(scrollPathAsString.ascii().data(),
testing::MatchesRegex("root .* parent.*"
" .* parent.*"));
}
} // namespace blink
#endif // if DCHECK_IS_ON()