LibWeb: Include standard SVG user agent style sheet

For now, part of this is commented-out. Our current implementations of
`<mask>` and `<symbol>` rely on creating layout nodes, so they can't be
`display: none`.
This commit is contained in:
Sam Atkins 2023-09-23 14:23:47 +01:00 committed by Andreas Kling
parent a6131634f1
commit ae4b8d86df
Notes: sideshowbarker 2024-07-16 20:21:48 +09:00
7 changed files with 68 additions and 2 deletions

View file

@ -96,6 +96,14 @@ function (generate_css_implementation)
NAMESPACE "Web::CSS"
)
embed_as_string_view(
"SVGStyleSheetSource.cpp"
"${LIBWEB_INPUT_FOLDER}/SVG/Default.css"
"SVG/SVGStyleSheetSource.cpp"
"svg_stylesheet_source"
NAMESPACE "Web::CSS"
)
set(CSS_GENERATED_TO_INSTALL
"CSS/EasingFunctions.h"
"CSS/Enums.h"

View file

@ -230,6 +230,13 @@ embed_as_string_view("generate_mathml_stylesheet_source") {
namespace = "Web::CSS"
}
embed_as_string_view("generate_svg_stylesheet_source") {
input = "SVG/Default.css"
output = "$target_gen_dir/SVG/SVGStyleSheetSource.cpp"
variable_name = "svg_stylesheet_source"
namespace = "Web::CSS"
}
embed_as_string_view("generate_quirks_mode_stylesheet_source") {
input = "CSS/QuirksMode.css"
output = "$target_gen_dir/CSS/QuirksModeStyleSheetSource.cpp"

View file

@ -11,7 +11,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
SVGSVGBox <svg> at (8,8) content-size 300x150 [SVG] children: inline
TextNode <#text>
Box <use> at (8,8) content-size 0x0 children: inline
Box <symbol#braces> at (8,8) content-size 0x0 children: inline
Box <symbol#braces> at (8,8) content-size 0x0 [BFC] children: inline
TextNode <#text>
SVGGeometryBox <path> at (92.375,26.75) content-size 131.25x112.15625 children: inline
TextNode <#text>

View file

@ -8,7 +8,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
frag 2 from SVGSVGBox start: 0, length: 0, rect: [16,21 0x0]
ImageBox <img> at (8,21) content-size 0x0 children: not-inline
(SVG-as-image isolated context)
Viewport <#document> at (0,0) content-size 0x0 children: inline
Viewport <#document> at (0,0) content-size 0x0 [BFC] children: inline
SVGSVGBox <svg> at (0,0) content-size 0x0 [SVG] children: inline
TextNode <#text>
SVGGeometryBox <rect> at (0,0) content-size 1x1 children: not-inline

View file

@ -655,6 +655,7 @@ set(GENERATED_SOURCES
CSS/TransformFunctions.cpp
CSS/ValueID.cpp
MathML/MathMLStyleSheetSource.cpp
SVG/SVGStyleSheetSource.cpp
)
serenity_lib(LibWeb web)

View file

@ -239,6 +239,16 @@ static CSSStyleSheet& mathml_stylesheet(DOM::Document const& document)
return *sheet;
}
static CSSStyleSheet& svg_stylesheet(DOM::Document const& document)
{
static JS::Handle<CSSStyleSheet> sheet;
if (!sheet.cell()) {
extern StringView svg_stylesheet_source;
sheet = JS::make_handle(parse_css_stylesheet(CSS::Parser::ParsingContext(document), svg_stylesheet_source));
}
return *sheet;
}
template<typename Callback>
void StyleComputer::for_each_stylesheet(CascadeOrigin cascade_origin, Callback callback) const
{
@ -247,6 +257,7 @@ void StyleComputer::for_each_stylesheet(CascadeOrigin cascade_origin, Callback c
if (document().in_quirks_mode())
callback(quirks_mode_stylesheet(document()));
callback(mathml_stylesheet(document()));
callback(svg_stylesheet(document()));
}
if (cascade_origin == CascadeOrigin::User) {
if (m_user_style_sheet)

View file

@ -0,0 +1,39 @@
/* https://svgwg.org/svg2-draft/styling.html#UAStyleSheet */
@namespace url(http://www.w3.org/2000/svg);
@namespace xml url(http://www.w3.org/XML/1998/namespace);
svg:not(:root), image, marker, pattern, symbol { overflow: hidden; }
*:not(svg),
*:not(foreignObject) > svg {
transform-origin: 0 0;
}
*[xml|space=preserve] {
text-space-collapse: preserve-spaces;
}
/* FIXME: Allow setting the rest of these to `display: none`.
Currently that breaks <use> and <mask> and probably others. */
desc, title, metadata,
pattern, linearGradient, radialGradient,
script, style {
display: none !important;
}
/*
defs,
clipPath, mask, marker,
desc, title, metadata,
pattern, linearGradient, radialGradient,
script, style,
symbol {
display: none !important;
}
*/
:host(use) > symbol {
display: inline !important;
}
:link, :visited {
cursor: pointer;
}