mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-25 14:05:15 +00:00
Previously we were using the HTML parse_dimension_value method for the height and width attributes of an SVG element. These attributes should however be treated as css properties instead and thus also support calc() and absolute units so we use the css parser for this instead.
94 lines
3.5 KiB
C++
94 lines
3.5 KiB
C++
/*
|
|
* Copyright (c) 2022, Andreas Kling <kling@serenityos.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#include <LibWeb/Bindings/ExceptionOrUtils.h>
|
|
#include <LibWeb/Bindings/Intrinsics.h>
|
|
#include <LibWeb/CSS/Parser/Parser.h>
|
|
#include <LibWeb/Layout/BlockContainer.h>
|
|
#include <LibWeb/SVG/AttributeNames.h>
|
|
#include <LibWeb/SVG/SVGAnimatedLength.h>
|
|
#include <LibWeb/SVG/SVGForeignObjectElement.h>
|
|
#include <LibWeb/SVG/SVGLength.h>
|
|
|
|
namespace Web::SVG {
|
|
|
|
SVGForeignObjectElement::SVGForeignObjectElement(DOM::Document& document, DOM::QualifiedName qualified_name)
|
|
: SVGGraphicsElement(document, move(qualified_name))
|
|
{
|
|
}
|
|
|
|
SVGForeignObjectElement::~SVGForeignObjectElement() = default;
|
|
|
|
JS::ThrowCompletionOr<void> SVGForeignObjectElement::initialize(JS::Realm& realm)
|
|
{
|
|
auto& vm = realm.vm();
|
|
|
|
MUST_OR_THROW_OOM(Base::initialize(realm));
|
|
set_prototype(&Bindings::ensure_web_prototype<Bindings::SVGForeignObjectElementPrototype>(realm, "SVGForeignObjectElement"));
|
|
|
|
// FIXME: These never actually get updated!
|
|
m_x = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() -> WebIDL::ExceptionOr<JS::NonnullGCPtr<SVGAnimatedLength>> {
|
|
return SVGAnimatedLength::create(realm, TRY(SVGLength::create(realm, 0, 0)), TRY(SVGLength::create(realm, 0, 0)));
|
|
}));
|
|
m_y = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() -> WebIDL::ExceptionOr<JS::NonnullGCPtr<SVGAnimatedLength>> {
|
|
return SVGAnimatedLength::create(realm, TRY(SVGLength::create(realm, 0, 0)), TRY(SVGLength::create(realm, 0, 0)));
|
|
}));
|
|
m_width = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() -> WebIDL::ExceptionOr<JS::NonnullGCPtr<SVGAnimatedLength>> {
|
|
return SVGAnimatedLength::create(realm, TRY(SVGLength::create(realm, 0, 0)), TRY(SVGLength::create(realm, 0, 0)));
|
|
}));
|
|
m_height = TRY(Bindings::throw_dom_exception_if_needed(vm, [&]() -> WebIDL::ExceptionOr<JS::NonnullGCPtr<SVGAnimatedLength>> {
|
|
return SVGAnimatedLength::create(realm, TRY(SVGLength::create(realm, 0, 0)), TRY(SVGLength::create(realm, 0, 0)));
|
|
}));
|
|
|
|
return {};
|
|
}
|
|
|
|
void SVGForeignObjectElement::visit_edges(Cell::Visitor& visitor)
|
|
{
|
|
Base::visit_edges(visitor);
|
|
visitor.visit(m_x);
|
|
visitor.visit(m_y);
|
|
visitor.visit(m_width);
|
|
visitor.visit(m_height);
|
|
}
|
|
|
|
JS::GCPtr<Layout::Node> SVGForeignObjectElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
|
|
{
|
|
return heap().allocate_without_realm<Layout::BlockContainer>(document(), this, move(style));
|
|
}
|
|
|
|
void SVGForeignObjectElement::apply_presentational_hints(CSS::StyleProperties& style) const
|
|
{
|
|
Base::apply_presentational_hints(style);
|
|
auto parsing_context = CSS::Parser::ParsingContext { document() };
|
|
if (auto width_value = parse_css_value(parsing_context, attribute(Web::HTML::AttributeNames::width), CSS::PropertyID::Width))
|
|
style.set_property(CSS::PropertyID::Width, width_value.release_nonnull());
|
|
|
|
if (auto height_value = parse_css_value(parsing_context, attribute(Web::HTML::AttributeNames::height), CSS::PropertyID::Height))
|
|
style.set_property(CSS::PropertyID::Height, height_value.release_nonnull());
|
|
}
|
|
|
|
JS::NonnullGCPtr<SVG::SVGAnimatedLength> SVGForeignObjectElement::x()
|
|
{
|
|
return *m_x;
|
|
}
|
|
|
|
JS::NonnullGCPtr<SVG::SVGAnimatedLength> SVGForeignObjectElement::y()
|
|
{
|
|
return *m_y;
|
|
}
|
|
|
|
JS::NonnullGCPtr<SVG::SVGAnimatedLength> SVGForeignObjectElement::width()
|
|
{
|
|
return *m_width;
|
|
}
|
|
|
|
JS::NonnullGCPtr<SVG::SVGAnimatedLength> SVGForeignObjectElement::height()
|
|
{
|
|
return *m_height;
|
|
}
|
|
|
|
}
|