1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
// 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/layout/svg/LayoutSVGRoot.h"
#include "core/layout/LayoutTestHelper.h"
#include "core/layout/svg/LayoutSVGShape.h"
#include "core/layout/svg/SVGLayoutSupport.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
using LayoutSVGRootTest = RenderingTest;
TEST_F(LayoutSVGRootTest, VisualRectMappingWithoutViewportClipWithBorder) {
setBodyInnerHTML(
"<svg id='root' style='border: 10px solid red; width: 200px; height: "
"100px; overflow: visible' viewBox='0 0 200 100'>"
" <rect id='rect' x='80' y='80' width='100' height='100'/>"
"</svg>");
const LayoutSVGRoot& root =
*toLayoutSVGRoot(getLayoutObjectByElementId("root"));
const LayoutSVGShape& svgRect =
*toLayoutSVGShape(getLayoutObjectByElementId("rect"));
LayoutRect rect = SVGLayoutSupport::visualRectInAncestorSpace(svgRect, root);
// (80, 80, 100, 100) added by root's content rect offset from border rect,
// not clipped.
EXPECT_EQ(LayoutRect(90, 90, 100, 100), rect);
LayoutRect rootVisualRect =
static_cast<const LayoutObject&>(root).localVisualRect();
// SVG root's overflow includes overflow from descendants.
EXPECT_EQ(LayoutRect(0, 0, 220, 190), rootVisualRect);
rect = rootVisualRect;
EXPECT_TRUE(root.mapToVisualRectInAncestorSpace(&root, rect));
EXPECT_EQ(LayoutRect(0, 0, 220, 190), rect);
}
TEST_F(LayoutSVGRootTest, VisualRectMappingWithViewportClipAndBorder) {
setBodyInnerHTML(
"<svg id='root' style='border: 10px solid red; width: 200px; height: "
"100px; overflow: hidden' viewBox='0 0 200 100'>"
" <rect id='rect' x='80' y='80' width='100' height='100'/>"
"</svg>");
const LayoutSVGRoot& root =
*toLayoutSVGRoot(getLayoutObjectByElementId("root"));
const LayoutSVGShape& svgRect =
*toLayoutSVGShape(getLayoutObjectByElementId("rect"));
LayoutRect rect = SVGLayoutSupport::visualRectInAncestorSpace(svgRect, root);
// (80, 80, 100, 100) added by root's content rect offset from border rect,
// clipped by (10, 10, 200, 100).
EXPECT_EQ(LayoutRect(90, 90, 100, 20), rect);
LayoutRect rootVisualRect =
static_cast<const LayoutObject&>(root).localVisualRect();
// SVG root with overflow:hidden doesn't include overflow from children, just
// border box rect.
EXPECT_EQ(LayoutRect(0, 0, 220, 120), rootVisualRect);
rect = rootVisualRect;
EXPECT_TRUE(root.mapToVisualRectInAncestorSpace(&root, rect));
// LayoutSVGRoot should not apply overflow clip on its own rect.
EXPECT_EQ(LayoutRect(0, 0, 220, 120), rect);
}
TEST_F(LayoutSVGRootTest, VisualRectMappingWithViewportClipWithoutBorder) {
setBodyInnerHTML(
"<svg id='root' style='width: 200px; height: 100px; overflow: hidden' "
"viewBox='0 0 200 100'>"
" <rect id='rect' x='80' y='80' width='100' height='100'/>"
"</svg>");
const LayoutSVGRoot& root =
*toLayoutSVGRoot(getLayoutObjectByElementId("root"));
const LayoutSVGShape& svgRect =
*toLayoutSVGShape(getLayoutObjectByElementId("rect"));
LayoutRect rect = SVGLayoutSupport::visualRectInAncestorSpace(svgRect, root);
// (80, 80, 100, 100) clipped by (0, 0, 200, 100).
EXPECT_EQ(LayoutRect(80, 80, 100, 20), rect);
LayoutRect rootVisualRect =
static_cast<const LayoutObject&>(root).localVisualRect();
// SVG root doesn't have box decoration background, so just use clipped
// overflow of children.
EXPECT_EQ(LayoutRect(80, 80, 100, 20), rootVisualRect);
rect = rootVisualRect;
EXPECT_TRUE(root.mapToVisualRectInAncestorSpace(&root, rect));
EXPECT_EQ(LayoutRect(80, 80, 100, 20), rect);
}
} // namespace blink
|