2023-05-31 00:50:12 +01:00
/*
* Copyright ( c ) 2023 , Preston Taylor < 95388976 + PrestonLTaylor @ users . noreply . github . com >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <LibWeb/Bindings/Intrinsics.h>
# include <LibWeb/CSS/StyleProperties.h>
# include <LibWeb/CSS/StyleValues/DisplayStyleValue.h>
# include <LibWeb/CSS/StyleValues/IdentifierStyleValue.h>
# include <LibWeb/CSS/StyleValues/OverflowStyleValue.h>
# include <LibWeb/DOM/ShadowRoot.h>
2023-07-31 18:37:44 +02:00
# include <LibWeb/SVG/AttributeNames.h>
2023-05-31 00:50:12 +01:00
# include <LibWeb/SVG/SVGSymbolElement.h>
# include <LibWeb/SVG/SVGUseElement.h>
namespace Web : : SVG {
SVGSymbolElement : : SVGSymbolElement ( DOM : : Document & document , DOM : : QualifiedName qualified_name )
: SVGGraphicsElement ( document , qualified_name )
{
}
2023-08-07 08:41:28 +02:00
void SVGSymbolElement : : initialize ( JS : : Realm & realm )
2023-05-31 00:50:12 +01:00
{
2023-08-07 08:41:28 +02:00
Base : : initialize ( realm ) ;
2023-05-31 00:50:12 +01:00
set_prototype ( & Bindings : : ensure_web_prototype < Bindings : : SVGSymbolElementPrototype > ( realm , " SVGSymbolElement " ) ) ;
}
// https://svgwg.org/svg2-draft/struct.html#SymbolNotes
void SVGSymbolElement : : apply_presentational_hints ( CSS : : StyleProperties & style ) const
{
// The user agent style sheet sets the overflow property for ‘ symbol’ elements to hidden.
2023-08-19 14:00:10 +01:00
auto hidden = CSS : : IdentifierStyleValue : : create ( CSS : : ValueID : : Hidden ) ;
style . set_property ( CSS : : PropertyID : : Overflow , CSS : : OverflowStyleValue : : create ( hidden , hidden ) ) ;
2023-05-31 00:50:12 +01:00
if ( is_direct_child_of_use_shadow_tree ( ) ) {
// The generated instance of a ‘ symbol’ that is the direct referenced element of a ‘ use’ element must always have a computed value of inline for the display property.
2023-08-19 14:00:10 +01:00
style . set_property ( CSS : : PropertyID : : Display , CSS : : DisplayStyleValue : : create ( CSS : : Display : : from_short ( CSS : : Display : : Short : : Inline ) ) ) ;
2023-05-31 00:50:12 +01:00
} else {
// FIXME: When we have a DefaultSVG.css then use https://svgwg.org/svg2-draft/styling.html#UAStyleSheet instead.
// The user agent must set the display property on the ‘ symbol’ element to none, as part of the user agent style sheet,
// and this declaration must have importance over any other CSS rule or presentation attribute.
2023-08-19 14:00:10 +01:00
style . set_property ( CSS : : PropertyID : : Display , CSS : : DisplayStyleValue : : create ( CSS : : Display : : from_short ( CSS : : Display : : Short : : None ) ) ) ;
2023-05-31 00:50:12 +01:00
}
2023-07-31 18:37:44 +02:00
}
2023-05-31 00:50:12 +01:00
2023-07-31 18:37:44 +02:00
void SVGSymbolElement : : attribute_changed ( DeprecatedFlyString const & name , DeprecatedString const & value )
{
if ( name . equals_ignoring_ascii_case ( SVG : : AttributeNames : : viewBox ) )
m_view_box = try_parse_view_box ( value ) ;
2023-05-31 00:50:12 +01:00
}
bool SVGSymbolElement : : is_direct_child_of_use_shadow_tree ( ) const
{
auto maybe_shadow_root = parent ( ) ;
if ( ! is < DOM : : ShadowRoot > ( maybe_shadow_root ) ) {
return false ;
}
auto host = static_cast < const DOM : : ShadowRoot & > ( * maybe_shadow_root ) . host ( ) ;
return is < SVGUseElement > ( host ) ;
}
}