diff --git a/Meta/CMake/libweb_generators.cmake b/Meta/CMake/libweb_generators.cmake index 495c224f3a..20b657396f 100644 --- a/Meta/CMake/libweb_generators.cmake +++ b/Meta/CMake/libweb_generators.cmake @@ -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" diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn index 102fa7f30a..2b572bc17b 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/BUILD.gn @@ -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" diff --git a/Tests/LibWeb/Layout/expected/svg/svg-symbol-with-viewbox.txt b/Tests/LibWeb/Layout/expected/svg/svg-symbol-with-viewbox.txt index 4b256824a7..11a1857ff3 100644 --- a/Tests/LibWeb/Layout/expected/svg/svg-symbol-with-viewbox.txt +++ b/Tests/LibWeb/Layout/expected/svg/svg-symbol-with-viewbox.txt @@ -11,7 +11,7 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline SVGSVGBox at (8,8) content-size 300x150 [SVG] children: inline TextNode <#text> Box at (8,8) content-size 0x0 children: inline - Box at (8,8) content-size 0x0 children: inline + Box at (8,8) content-size 0x0 [BFC] children: inline TextNode <#text> SVGGeometryBox at (92.375,26.75) content-size 131.25x112.15625 children: inline TextNode <#text> diff --git a/Tests/LibWeb/Layout/expected/svg/svg-with-zero-intrinsic-size-and-no-viewbox.txt b/Tests/LibWeb/Layout/expected/svg/svg-with-zero-intrinsic-size-and-no-viewbox.txt index c748c3af19..46020a446a 100644 --- a/Tests/LibWeb/Layout/expected/svg/svg-with-zero-intrinsic-size-and-no-viewbox.txt +++ b/Tests/LibWeb/Layout/expected/svg/svg-with-zero-intrinsic-size-and-no-viewbox.txt @@ -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 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 at (0,0) content-size 0x0 [SVG] children: inline TextNode <#text> SVGGeometryBox at (0,0) content-size 1x1 children: not-inline diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 6e61c412c6..798f5e42c3 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -655,6 +655,7 @@ set(GENERATED_SOURCES CSS/TransformFunctions.cpp CSS/ValueID.cpp MathML/MathMLStyleSheetSource.cpp + SVG/SVGStyleSheetSource.cpp ) serenity_lib(LibWeb web) diff --git a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp index e6ef47246b..54dd20505f 100644 --- a/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp +++ b/Userland/Libraries/LibWeb/CSS/StyleComputer.cpp @@ -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 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 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) diff --git a/Userland/Libraries/LibWeb/SVG/Default.css b/Userland/Libraries/LibWeb/SVG/Default.css new file mode 100644 index 0000000000..ebea1b6f39 --- /dev/null +++ b/Userland/Libraries/LibWeb/SVG/Default.css @@ -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 and 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; +}