blob: 55d7d511722ad18c4ec051ae205b472ddd8a3885 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "third_party/blink/renderer/core/svg/svg_element.h"
#include "third_party/blink/renderer/core/css/css_test_helpers.h"
#include "third_party/blink/renderer/core/css/properties/longhands.h"
#include "third_party/blink/renderer/core/dom/node_computed_style.h"
#include "third_party/blink/renderer/core/html/html_element.h"
#include "third_party/blink/renderer/core/svg/svg_element_rare_data.h"
#include "third_party/blink/renderer/core/svg/svg_length.h"
#include "third_party/blink/renderer/core/svg/svg_length_context.h"
#include "third_party/blink/renderer/core/svg/svg_length_functions.h"
#include "third_party/blink/renderer/core/testing/page_test_base.h"
namespace blink {
class SVGElementTest : public PageTestBase {};
TEST_F(SVGElementTest, BaseComputedStyleForSMILWithContainerQueries) {
GetDocument().body()->setInnerHTML(R"HTML(
<style>
#rect2 { display: none }
@container (max-width: 200px) {
rect, g { color: green; }
}
@container (min-width: 300px) {
rect, g { background-color: red; }
}
</style>
<div style="container-type: inline-size; width: 200px">
<svg>
<rect id="rect1" />
<rect id="rect2" />
<g id="g"></g>
</svg>
</div>
)HTML");
UpdateAllLifecyclePhasesForTest();
auto* rect1 =
To<SVGElement>(GetDocument().getElementById(AtomicString("rect1")));
auto* rect2 =
To<SVGElement>(GetDocument().getElementById(AtomicString("rect2")));
auto* g = To<SVGElement>(GetDocument().getElementById(AtomicString("g")));
auto force_needs_override_style = [](SVGElement& svg_element) {
svg_element.EnsureSVGRareData()->SetNeedsOverrideComputedStyleUpdate();
};
force_needs_override_style(*rect1);
force_needs_override_style(*rect2);
force_needs_override_style(*g);
const auto* rect1_style = rect1->BaseComputedStyleForSMIL();
const auto* rect2_style = rect2->BaseComputedStyleForSMIL();
const auto* g_style = g->BaseComputedStyleForSMIL();
const Color green(0, 128, 0);
EXPECT_EQ(rect1_style->VisitedDependentColor(GetCSSPropertyColor()), green);
EXPECT_EQ(rect2_style->VisitedDependentColor(GetCSSPropertyColor()), green);
EXPECT_EQ(g_style->VisitedDependentColor(GetCSSPropertyColor()), green);
EXPECT_EQ(rect1_style->VisitedDependentColor(GetCSSPropertyBackgroundColor()),
Color::kTransparent);
EXPECT_EQ(rect2_style->VisitedDependentColor(GetCSSPropertyBackgroundColor()),
Color::kTransparent);
EXPECT_EQ(g_style->VisitedDependentColor(GetCSSPropertyBackgroundColor()),
Color::kTransparent);
}
TEST_F(SVGElementTest, ContainerUnitContext) {
SetBodyInnerHTML(R"HTML(
<style>
#container, #svg { container-type:size; }
#container {
width: 200px;
height: 200px;
}
#svg {
width: 100px;
height: 100px;
}
</style>
<div id="container">
<svg id="svg"></svg>
</div>
)HTML");
auto* svg = To<SVGElement>(GetDocument().getElementById(AtomicString("svg")));
const auto* value = DynamicTo<CSSPrimitiveValue>(
css_test_helpers::ParseValue(GetDocument(), "<length>", "100cqw"));
const auto* length =
MakeGarbageCollected<SVGLength>(*value, SVGLengthMode::kWidth);
EXPECT_FLOAT_EQ(200.0f, length->Value(SVGLengthContext(svg)));
}
} // namespace blink