8000 script: support inline SVG by serializing the subtree by mukilan · Pull Request #38188 · servo/servo · GitHub
[go: up one dir, main page]

Skip to content

Conversation

mukilan
Copy link
Member
@mukilan mukilan commented Jul 21, 2025

This patch adds support for rendering static inline SVG documents in the
DOM tree by serializing the SVGElement's subtree and leveraging the
existing resvg based SVG stack for rendering. Serialiing the subtree is
necessary as resvg's tree representation (roxmltree) is immutable, so we
can't construct the tree incrementally.

Few other design choices here:

  1. The SVGSVGElement is now treated as a replaced element and the
    layout code is responsible for plumbing the serialized SVG source
    (encoded as a base64 data: url) into the image cache, much like how
    background images are handled.
  2. The serialization is done on the script thread after an initial
    layout pass. This is necessary because the serialization code asserts
    that it is invoked from script thread i.e we can't call it from layout
    workers.
  3. The serialized SVG data: url is cached to avoid recomputing it on
    subsequent layouts. The cache is invalidated when the SVGSVGElement's
    subtree is mutated.

The original SVGSVGElement code was behind the dom_svg_enabled pref.
This patch also removes the preference and make SVG support using resvg
available unconditionally.

Below is the analysis of the new test failures:

These tests use inline SVG but used to pass by accident.
They now fail because they contain SVG with no intrinsic
sizing which is not handled by resvg in a way that would
allows us to distinguish it from the sized case. The same
limitation applies to non-inline SVG.

  • /css/CSS2/positioning/absolute-replaced-width-003a.xht
  • /css/CSS2/positioning/absolute-replaced-width-003b.xht
  • /css/CSS2/positioning/absolute-replaced-width-003c.xht

These tests employ CSS styles in the HTML that
target the elements in inline SVG, which is not currently
supported.

  • /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg-basic.html
  • /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg.html

This is a tentative test that uses the unsupported 'border-shape' CSS
property. The ref uses SVG, so it used to pass accidentally. The ref
still doesn't render correctly since it also relies on styling SVG
elements using CSS classes in the HTML (instead of inline in SVG).

  • /css/css-borders/tentative/border-shape/border-shape-stroke.html

These tests use the attribute 'clip-path=circle(...)' in the
test, but this doesn't seem to work in resvg.

  • /css/css-masking/clip-path/clip-path-borderBox-1b.html
  • /css/css-masking/clip-path/clip-path-contentBox-1b.html
  • /css/css-masking/clip-path/clip-path-contentBox-1c.html
  • /css/css-masking/clip-path/clip-path-fillBox-1b.html
  • /css/css-masking/clip-path/clip-path-marginBox-1a.html
  • /css/css-masking/clip-path/clip-path-paddingBox-1b.html
  • /css/css-masking/clip-path/clip-path-strokeBox-1b.html
  • /css/css-masking/clip-path/clip-path-strokeBox-1c.html
  • /css/css-masking/clip-path/clip-path-viewBox-1a.html
  • /css/css-masking/clip-path/clip-path-viewBox-1b.html
  • /css/css-masking/clip-path/clip-path-viewBox-1d.html
  • /css/css-masking/clip-path/svg-clip-path-circle-offset.html
  • /css/css-masking/clip-path/svg-clip-path-ellipse-offset.html

Additionally, the below two tests use a foreignObject SVG element which
embeds a html div fragment. This is also not supported by resvg.

  • /css/css-masking/clip-path/clip-path-viewBox-1d.html
  • /css/css-masking/clip-path/clip-path-fillBox-1b.html

The following test fails because of apparent pixel differences
between a circle rendered purely using CSS clip-path vs a circle
rendered in SVG using resvg.

  • /css/css-masking/clip-path/clip-path-contentBox-1c.html

These tests style the inline SVG elements using CSS in the HTML or
separate stylesheet. This is not supported by this implementation.

  • /css-transforms/document-styles/svg-document-styles-{001..004}.html
  • /css-transforms/document-styles/svg-document-styles-012.html
  • /css-transforms/external-styles/svg-external-styles-{001..004}.html
  • /css-transforms/external-styles/svg-external-styles-014.html

These tests seem like they should pass, but they fail because of what
seems like an anti-aliasing issue in the rendering engine. The
transformed element has a thin outline which is causing pixel difference
with the ref:

  • /css/css-transforms/group/svg-transform-group-008.html
  • /css/css-transforms/group/svg-transform-group-009.html
  • /css/css-transforms/group/svg-transform-nested-009.html
  • /css/css-transforms/group/svg-transform-nested-013.html
  • /css/css-transforms/group/svg-transform-nested-014.html
  • /css/css-transforms/group/svg-transform-nested-018.html
  • /css/css-transforms/group/svg-transform-nested-019.html
  • /css/css-transforms/group/svg-transform-nested-008.html

The below tests fail because resvg is calculating the wrong size for the
'rect' inside the SVG. The dimensions of the SVG are established via the
CSS in the HTML, so it seems resvg is using incorrect coordinates for
the children of the svg when explict width/height are not specified in
the root svg element.

  • /css/css-transforms/group/svg-transform-group-011.html
  • /css/css-transforms/group/svg-transform-nested-021.html
  • /css/css-transforms/group/svg-transform-nested-029.html

All these tests use an SVG that doesn't have width nor height attributes
and this causes resvg to use incorrect coordinates for the SVG's
children. In addition, the following tests use the CSS syntax for
transforms inside the SVG (using style attribute) which is not supported
by resvg (it only supports the SVG 1.1 transform syntax).

  • /css/css-transforms/inline-styles/svg-inline-styles-{001..004}.html
  • /css/css-transforms/inline-styles/svg-inline-styles-012.html

In the case of these four tests, the style attribute specifies an
invalid transform, but resvg doesn't fallback to the transform specified
via the transform attribute on the same element.

  • /css/css-transforms/inline-styles/svg-inline-styles-005.html
  • /css/css-transforms/inline-styles/svg-inline-styles-006.html
  • /css/css-transforms/inline-styles/svg-inline-styles-010.html
  • /css/css-transforms/inline-styles/svg-inline-styles-013.html

The following test fails because of the lack of width/height in SVG as
described above but it also exposes gaps in our CSS tranform
implementation.

  • /css/css-transforms/preserve3d-and-filter-with-perspective.html

These tests failure because resvg doesn't handle the SVG without
explicit width and height, but specified via CSS in the HTML. In
addition, there are pixel differences between the ref due to
antialiasing issues.

  • /css/css-transforms/matrix/svg-matrix-{005...008}.html
  • /css/css-transforms/matrix/svg-matrix-010.html
  • /css/css-transforms/matrix/svg-matrix-012.html
  • /css/css-transforms/matrix/svg-matrix-{015..069}.html
  • /css/css-transforms/rotate/svg-rotate-angle-45-001.html
  • /css/css-transforms/rotate/svg-rotate-angle-45-011.html
  • /css/css-transforms/rotate/svg-rotate-angle-45-022.html
  • /css/css-transforms/scale/svg-scale-006.html
  • /css/css-transforms/scale/svg-scale-007.html

These tests seem to be failing due to some sort of antialiasing issue,
where a transformed SVG element has a thin border that causes pixel
differences compared to the solid colored reference.

  • /css/css-transforms/skewX/svg-skewx-001.html
  • /css/css-transforms/skewX/svg-skewx-006.html
  • /css/css-transforms/skewX/svg-skewx-011.html
  • /css/css-transforms/skewX/svg-skewx-016.html
  • /css/css-transforms/skewX/svg-skewx-021.html
  • /css/css-transforms/skewX/svg-skewxy-001.html
  • /css/css-transforms/skewY/svg-skewy-001.html
  • /css/css-transforms/skewY/svg-skewy-006.html
  • /css/css-transforms/skewY/svg-skewy-011.html
  • /css/css-transforms/skewY/svg-skewy-016.html
  • /css/css-transforms/skewY/svg-skewy-021.html

These tests specify several SVG attributes such as transform,
vector-effect etc via CSS in the HTML (rather than inline in SVG). The
current implementation doesn't support this.

  • /css/css-transforms/transform-box/stroke-box-mutation-001.html
  • /css/css-transforms/transform-box/stroke-box-mutation-002.html
  • /css/css-transforms/transform-box/stroke-box-mutation-003.html
  • /css/css-transforms/transform-box/stroke-box-mutation-004.html
  • /css/css-transforms/transform-box/svgbox-stroke-box-002.html
  • /css/css-transforms/transform-box/svgbox-stroke-box-003.html
  • /css/css-transforms/transform-box/svgbox-stroke-box-004.html
  • /css/css-transforms/transform-box/svgbox-stroke-box-005.html

These tests depend on 'transform-origin' specified on an element inside
an SVG, but this transform is influenced by the 'tranform-box' set via
CSS in the HTML itself (not the SVG). The current implementation doesn't
support styling the SVG using document styles, so these tests just fail.

  • /css/css-transforms/transform-origin/svg-origin-relative-length-*.html

These tests check the fallback behaviour when invalid syntax is
encountered in the 'transform-origin' value. resvg doesn't correctly
fallback to 0,0 causing the tests to fail.

  • /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-001.html
  • /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-002.html
  • /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-003.html
  • /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-004.html

These tests use unimplemented Canvas APIs like 'beginLayer' and
the 'CanvasFilter' constructor and hence fail at runtime.

  • /html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
  • /html/canvas/element/filters/2d.filter.layers.gaussianBlur.tentative.html
  • /html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
  • /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
  • /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
  • /html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.tentative.html
  • /html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.tentative.html
  • /html/canvas/element/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
  • /html/canvas/element/layers/2d.layer.css-filters.blur.tentative.html
  • /html/canvas/element/layers/2d.layer.css-filters.shadow.tentative.html
  • /html/canvas/element/layers/2d.layer.ctm.layer-filter.tentative.html
  • /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
  • /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
  • /html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.html
  • /html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.css-filters.blur.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.css-filters.shadow.tentative.html
  • /html/canvas/offscreen/layers/2d.layer.ctm.layer-filter.tentative.html

These tests fail because resvg doesn't seem to honour the 'translate'
CSS property specified on an SVG element using an inline 'style'
attribute.

  • /css/css-transforms/translate/svg-translate-with-units.html
  • /css/css-transforms/translate/translate-and-transform-attribute-in-svg.html
  • /css/css-transforms/translate/translate-and-transform-css-property-in-svg.html
  • /css/css-transforms/translate/translate-in-svg.html

These tests seem to fail due to the filter effect implementation in
resvg either not being complete or spec compliant.

  • /css/filter-effects/feconvolve-divisor.html
  • /css/filter-effects/feconvolve-region-001.html
  • /css/filter-effects/feconvolve-region-002.html
  • /css/filter-effects/filter-subregion-01.html
  • /css/filter-effects/svg-feimage-002.html
  • /css/filter-effects/svg-feimage-003.html
  • /css/filter-effects/svg-feimage-004.html
  • /css/filter-effects/svg-feoffset-001.html

The test /css/filter-effects/svg-feimage-004.html should ideally PASS
but currently fails because we don't propagate height/width set using
CSS in HTML element to the root SVG, so resvg uses the wrong dimensions
when rendering the children of the SVG.

These failures are due to deficienies in our current implementation
i.e we don't support styling SVG elements using CSS in HTML.

  • /css/css-transforms/gradientTransform/svg-gradientTransform-combination-001.html
  • /css/selectors/sharing-in-svg-use.html

The below test fails as our current implementation relies on resvg to
tell us the intrinsic ratio of the SVG, but this doesn't always work
correctly.

  • /css/css-sizing/svg-intrinsic-size-005.html

This failure is due to lack of proper fallback to no-op transform in
resvg when the rotate() syntax is specified with an invalid list e.g
rotate(90,).

  • /css/css-transforms/rotate/svg-rotate-3args-invalid-002.html

This test only passes in CI and based on the raw log output, it seems
that no text inside the SVG is rendered in the CI. This could be an font
stack related issue.

  • /css/css-display/display-contents-svg-elements.html

This test asserts that the CSP blocks loads triggered using use
elements in SVG. It used to TIMEOUT as without inline SVG support, no
CSP violation event was triggered. It fails now since the event is now
triggered for the load of the SVG itself (our current implementation
loads inline SVGs as serialized base64 data: urls). This doesn't match
the blocked URL in the use element though.

  • /content-security-policy/img-src/svg-use-blocked.tentative.html

Signed-off-by: Mukilan Thiyagarajan mukilan@igalia.com

@mukilan mukilan added the T-linux-wpt Do a try run of the WPT label Jul 21, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Jul 21, 2025
Copy link
github-actions bot< 10000 /span> commented Jul 21, 2025

🔨 Triggering try run (#16408777082) for Linux (WPT)

Copy link

Test results for linux-wpt from try job (#16408777082):

Flaky unexpected result (11)
  • OK /FileAPI/url/url-with-fetch.any.worker.html (#21517)
    • FAIL [expected PASS] subtest: Revoke blob URL after calling fetch, fetch should succeed

      promise_test: Unhandled rejection with value: object "TypeError: Network error occurred"
      

  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 1
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 2
  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-dest
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Same site
  • TIMEOUT /html/browsers/history/the-history-interface/001.html (#12580)
    • PASS [expected FAIL] subtest: traversing history must also traverse hash changes
  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html (#22154)
    • NOTRUN [expected FAIL] subtest: Check that popups from a sandboxed iframe do not escape the sandbox
  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html (#24066)
    • FAIL [expected NOTRUN] subtest: Check that popups from a sandboxed iframe do not escape the sandbox

      assert_equals: It came from a sandboxed iframe expected "null" but got "http://web-platform.test:8000"
      

  • OK /html/semantics/embedded-content/the-video-element/intrinsic_sizes.htm (#37173)
    • FAIL [expected PASS] subtest: default object size after src is removed

      assert_equals: expected "300px" but got "320px"
      

  • TIMEOUT [expected OK] /resource-timing/nested-context-navigations-iframe.html (#24311)
    • TIMEOUT [expected PASS] subtest: Test that iframe navigations are not observable by the parent, even after history navigations by the parent

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe refreshes are not observable by the parent
  • TIMEOUT [expected OK] /webmessaging/with-ports/018.html (#24485)
    • TIMEOUT [expected PASS] subtest: origin of the script that invoked the method, javascript:

      Test timed out
      

  • ERROR [expected OK] /workers/constructors/Worker/Worker-constructor.html (#22991)
Stable unexpected results that are known to be intermittent (16)
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • OK /css/css-fonts/variations/at-font-face-font-matching.html (#20684)
    • FAIL [expected PASS] subtest: Matching font-weight: '400' should prefer '350 399' over '351 398'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • FAIL [expected PASS] subtest: Matching font-style: 'oblique 20deg' should prefer 'oblique 0deg' over 'oblique -50deg -20deg'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-site destination

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination
  • ERROR /fetch/metadata/generated/serviceworker.https.sub.html (#36247)
    • PASS [expected FAIL] subtest: sec-fetch-site - Same origin, no options - registration
  • OK /html/browsers/browsing-the-web/navigating-across-documents/009.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url with document.write and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html (#28681)
    • FAIL [expected PASS] subtest: load &amp; pageshow events do not fire on contentWindow of &lt;iframe&gt; element created with src=''

      assert_unreached: load should not be fired Reached unreachable code
      

    • PASS [expected FAIL] subtest: load &amp; pageshow events do not fire on contentWindow of &lt;iframe&gt; element created with src='about:blank'
  • FAIL [expected PASS] /html/canvas/element/manual/text/canvas.2d.disconnected.html (#30063)
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus including no focusable descendants should be skipped

      assert_equals: expected Element node &lt;input autofocus=""&gt;&lt;/input&gt; but got Element node &lt;body&gt;&lt;/body&gt;
      

    • FAIL [expected NOTRUN] subtest: Area element should support autofocus

      promise_test: Unhandled rejection with value: object "TypeError: w.document.querySelector(...) is null"
      

  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (#24066)
  • OK [expected TIMEOUT] /html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html (#29724)
    • PASS [expected TIMEOUT] subtest: reparent-form-during-planned-navigation-task
  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload domInteractive &gt; Original domInteractive
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • OK /preload/prefetch-document.html (#37210)
    • FAIL [expected PASS] subtest: different-site document prefetch with 'as=document' should not be consumed

      assert_equals: expected 2 but got 1
      

  • TIMEOUT [expected OK] /preload/preload-error.sub.html (#37177)
    • FAIL [expected PASS] subtest: success (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?label=style should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: 404 (script): main
    • NOTRUN [expected PASS] subtest: CSP-error (script): preload events
    • PASS [expected FAIL] subtest: success (xhr): main
    • PASS [expected FAIL] subtest: 404 (xhr): main
  • TIMEOUT /preload/preload-resource-match.https.html (#38088)
    • FAIL [expected TIMEOUT] subtest: Loading script (anonymous) with link (no-cors) should discard the preloaded response

      assert_equals: https://www1.web-platform.test:8443/preload/resources/echo-with-cors.py?type=application%2Fjavascript&amp;content=function%20dummy()%20%7B%20%7D&amp;uid=8440c661-2f1f-4d7f-b0c7-17fb4b6302a6&amp;6dd383c0-cd80-4991-9f4f-047e549d43fa expected 2 but got 1
      

    • PASS [expected NOTRUN] subtest: Loading script (anonymous) with link (anonymous) should reuse the preloaded response
    • FAIL [expected NOTRUN] subtest: Loading script (anonymous) with link (use-credentials) should discard the preloaded response

      assert_equals: https://www1.web-platform.test:8443/preload/resources/echo-with-cors.py?type=application%2Fjavascript&amp;content=function%20dummy()%20%7B%20%7D&amp;uid=8440c661-2f1f-4d7f-b0c7-17fb4b6302a6&amp;59078992-b578-4758-83e5-1b3c39da05e0 expected 2 but got 1
      

    • TIMEOUT [expected NOTRUN] subtest: Loading script (use-credentials) with link (no-cors) should discard the preloaded response

      Test timed out
      

  • TIMEOUT [expected OK] /webstorage/localstorage-about-blank-3P-iframe-opens-3P-window.partitioned.html (#29053)
    • TIMEOUT [expected PASS] subtest: StorageKey: test 3P about:blank window opened from a 3P iframe

      Test timed out
      

Stable unexpected results (261)
  • PASS [expected FAIL] /_mozilla/mozilla/svg/svg.html
  • PASS [expected FAIL] /css/CSS2/floats-clear/float-replaced-width-008.xht
  • PASS [expected FAIL] /css/CSS2/floats-clear/float-replaced-width-009.xht
  • PASS [expected FAIL] /css/CSS2/inline-svg-margin-padding-border.html
  • PASS [expected FAIL] /css/CSS2/normal-flow/inline-block-replaced-width-003.xht
  • PASS [expected FAIL] /css/CSS2/normal-flow/inline-replaced-width-003.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-003.xht
  • FAIL [expected PASS] /css/CSS2/positioning/absolute-replaced-width-003a.xht
  • FAIL [expected PASS] /css/CSS2/positioning/absolute-replaced-width-003b.xht
  • FAIL [expected PASS] /css/CSS2/positioning/absolute-replaced-width-003c.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-004.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-010.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-011.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-024.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-025.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-031.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-032.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-038.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-039.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-052.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-053.xht
  • PASS [expected FAIL] /css/CSS2/positioning/absolute-replaced-width-066.xht
  • FAIL [expected PASS] /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg-basic.html
  • FAIL [expected PASS] /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg.html
  • PASS [expected FAIL] /css/compositing/mix-blend-mode/mix-blend-mode-svg.html
  • PASS [expected FAIL] /css/compositing/svg/mix-blend-mode-svg-rectangle.html
  • FAIL [expected PASS] /css/css-borders/tentative/border-shape/border-shape-stroke.html?class=beveljoin
  • FAIL [expected PASS] /css/css-borders/tentative/border-shape/border-shape-stroke.html?class=nostroke
  • FAIL [expected PASS] /css/css-borders/tentative/border-shape/border-shape-stroke.html?class=percent
  • FAIL [expected PASS] /css/css-borders/tentative/border-shape/border-shape-stroke.html?class=roundjoin
  • FAIL [expected PASS] /css/css-borders/tentative/border-shape/border-shape-stroke.html?class=solid
  • PASS [expected FAIL] /css/css-conditional/container-queries/svg-foreignobject-no-size-container.html
  • PASS [expected FAIL] /css/css-conditional/container-queries/svg-g-no-size-container.html
  • PASS [expected FAIL] /css/css-display/display-contents-svg-elements.html
  • PASS [expected FAIL] /css/css-flexbox/svg-root-as-flex-item-001.html
  • PASS [expected FAIL] /css/css-grid/grid-items/replaced-element-002.html
  • PASS [expected FAIL] /css/css-grid/masonry/tentative/masonry-columns-item-containing-block-is-grid-content-width.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-borderBox-1b.html
  • PASS [expected FAIL] /css/css-masking/clip-path/clip-path-borderBox-1c.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-contentBox-1b.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-fillBox-1b.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-marginBox-1a.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-paddingBox-1b.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-strokeBox-1b.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-strokeBox-1c.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-viewBox-1a.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-viewBox-1b.html
  • FAIL [expected PASS] /css/css-masking/clip-path/clip-path-viewBox-1d.html
  • FAIL [expected PASS] /css/css-masking/clip-path/svg-clip-path-circle-offset.html
  • FAIL [expected PASS] /css/css-masking/clip-path/svg-clip-path-ellipse-offset.html
  • PASS [expected FAIL] /css/css-overflow/display-flex-svg-overflow-default.html
  • PASS [expected FAIL] /css/css-sizing/aspect-ratio/replaced-element-007.html
  • PASS [expected FAIL] /css/css-sizing/aspect-ratio/replaced-element-008.html
  • PASS [expected FAIL] /css/css-sizing/aspect-ratio/replaced-element-011.html
  • PASS [expected FAIL] /css/css-sizing/aspect-ratio/replaced-element-015.html
  • PASS [expected FAIL] /css/css-sizing/aspect-ratio/replaced-element-016.html
  • PASS [expected FAIL] /css/css-sizing/intrinsic-percent-replaced-020.html
  • PASS [expected FAIL] /css/css-sizing/replaced-aspect-ratio-stretch-fit-001.html
  • PASS [expected FAIL] /css/css-sizing/replaced-aspect-ratio-stretch-fit-002.html
  • FAIL [expected PASS] /css/css-sizing/svg-intrinsic-size-005.html
  • PASS [expected FAIL] /css/css-transforms/2d-rotate-001.html
  • FAIL [expected PASS] /css/css-transforms/document-styles/svg-document-styles-001.html
  • FAIL [expected PASS] /css/css-transforms/document-styles/svg-document-styles-002.html
  • FAIL [expected PASS] /css/css-transforms/document-styles/svg-document-styles-003.html
  • FAIL [expected PASS] /css/css-transforms/document-styles/svg-document-styles-004.html
  • FAIL [expected PASS] /css/css-transforms/document-styles/svg-document-styles-012.html
  • FAIL [expected PASS] /css/css-transforms/external-styles/svg-external-styles-001.html
  • FAIL [expected PASS] /css/css-transforms/external-styles/svg-external-styles-002.html
  • FAIL [expected PASS] /css/css-transforms/external-styles/svg-external-styles-003.html
  • FAIL [expected PASS] /css/css-transforms/external-styles/svg-external-styles-014.html
  • FAIL [expected PASS] /css/css-transforms/gradientTransform/svg-gradientTransform-combination-001.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-group-008.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-group-011.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-008.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-009.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-013.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-014.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-018.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-019.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-021.html
  • FAIL [expected PASS] /css/css-transforms/group/svg-transform-nested-029.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-001.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-002.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-003.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-004.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-005.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-006.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-010.html
  • FAIL [expected PASS] /css/css-transforms/inline-styles/svg-inline-styles-012.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-005.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-006.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-007.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-008.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-010.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-012.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-016.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-017.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-019.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-020.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-021.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-022.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-023.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-024.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-025.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-026.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-027.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-028.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-029.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-030.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-031.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-032.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-033.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-034.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-035.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-036.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-037.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-038.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-039.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-040.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-041.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-042.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-043.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-044.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-045.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-046.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-047.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-049.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-050.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-051.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-052.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-053.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-054.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-055.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-056.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-058.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-059.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-060.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-061.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-062.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-064.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-065.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-066.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-067.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-068.html
  • FAIL [expected PASS] /css/css-transforms/matrix/svg-matrix-069.html
  • FAIL [expected PASS] /css/css-transforms/preserve3d-and-filter-with-perspective.html
  • FAIL [expected PASS] /css/css-transforms/rotate/svg-rotate-3args-invalid-002.html
  • FAIL [expected PASS] /css/css-transforms/rotate/svg-rotate-angle-45-001.html
  • FAIL [expected PASS] /css/css-transforms/rotate/svg-rotate-angle-45-011.html
  • FAIL [expected PASS] /css/css-transforms/rotate/svg-rotate-angle-45-022.html
  • FAIL [expected PASS] /css/css-transforms/scale/svg-scale-006.html
  • FAIL [expected PASS] /css/css-transforms/scale/svg-scale-007.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewx-001.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewx-006.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewx-011.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewx-016.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewx-021.html
  • FAIL [expected PASS] /css/css-transforms/skewX/svg-skewxy-001.html
  • FAIL [expected PASS] /css/css-transforms/skewY/svg-skewy-006.html
  • FAIL [expected PASS] /css/css-transforms/skewY/svg-skewy-011.html
  • FAIL [expected PASS] /css/css-transforms/skewY/svg-skewy-016.html
  • FAIL [expected PASS] /css/css-transforms/skewY/svg-skewy-021.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/stroke-box-mutation-001.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/stroke-box-mutation-002.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/stroke-box-mutation-003.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/stroke-box-mutation-004.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/svgbox-stroke-box-002.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/svgbox-stroke-box-003.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/svgbox-stroke-box-004.html
  • FAIL [expected PASS] /css/css-transforms/transform-box/svgbox-stroke-box-005.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-001.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-002.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-003.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-004.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-005.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-006.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-007.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-008.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-009.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-010.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-011.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-012.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-013.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-014.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-015.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-016.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-017.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-018.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-019.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-020.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-021.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-022.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-023.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-024.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-025.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-026.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-027.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-028.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-029.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-030.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-031.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-032.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-033.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-034.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-035.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-036.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-037.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-038.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-039.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-040.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-041.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-042.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-043.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-044.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-045.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-046.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-001.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-002.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-003.html
  • FAIL [expected PASS] /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-004.html
  • FAIL [expected PASS] /css/css-transforms/translate/svg-translate-with-units.html
  • FAIL [expected PASS] /css/css-transforms/translate/translate-and-transform-attribute-in-svg.html
  • FAIL [expected PASS] /css/css-transforms/translate/translate-and-transform-css-property-in-svg.html
  • FAIL [expected PASS] /css/css-transforms/translate/translate-in-svg.html
  • PASS [expected FAIL] /css/css-values/ch-unit-001.html
  • OK /css/cssom-view/elementsFromPoint.html
    • PASS [expected FAIL] subtest: SVG element at x,y
  • PASS [expected FAIL] /css/filter-effects/feComposite-intersection-feTile-input-svg.html
  • FAIL [expected PASS] /css/filter-effects/feconvolve-divisor.html
  • FAIL [expected PASS] /css/filter-effects/feconvolve-region-001.html
  • FAIL [expected PASS] /css/filter-effects/feconvolve-region-002.html
  • PASS [expected FAIL] /css/filter-effects/feflood-with-filter-reference.html
  • FAIL [expected PASS] /css/filter-effects/filter-subregion-01.html
  • FAIL [expected PASS] /css/filter-effects/svg-feimage-002.html
  • FAIL [expected PASS] /css/filter-effects/svg-feimage-003.html
  • FAIL [expected PASS] /css/filter-effects/svg-feimage-004.html
  • FAIL [expected PASS] /css/filter-effects/svg-feoffset-001.html
  • PASS [expected FAIL] /css/filter-effects/svg-filter-vs-clip-path.html
  • PASS [expected FAIL] /css/filter-effects/svg-filter-vs-mask.html
  • PASS [expected FAIL] /css/filter-effects/svg-image-root-filter.html
  • PASS [expected FAIL] /css/filter-effects/svg-sourcegraphic-invalidation-001.html
  • FAIL [expected PASS] /css/selectors/sharing-in-svg-use.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.css-filters.blur.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.css-filters.shadow.tentative.html
  • FAIL [expected PASS] /html/canvas/element/layers/2d.layer.ctm.layer-filter.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.html
  • FAIL [expected 8000 PASS] /html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.css-filters.blur.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.css-filters.shadow.tentative.html
  • FAIL [expected PASS] /html/canvas/offscreen/layers/2d.layer.ctm.layer-filter.tentative.html

Copy link

⚠️ Try run (#16408777082) failed.

@mukilan mukilan force-pushed the inline-svg-using-resvg branch from 8479816 to f073919 Compare July 30, 2025 05:57
@mukilan mukilan added the T-linux-wpt Do a try run of the WPT label Jul 30, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Jul 30, 2025
Copy link

🔨 Triggering try run (#16614675580) for Linux (WPT)

Copy link

Test results for linux-wpt from try job (#16614675580):

Flaky unexpected result (17)
  • OK /_webgl/conformance/textures/misc/texture-upload-size.html (#21770)
    • FAIL [expected PASS] subtest: WebGL test #53

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #55

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #57

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #59

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • PASS [expected FAIL] subtest: WebGL test #61
    • PASS [expected FAIL] subtest: WebGL test #63
    • PASS [expected FAIL] subtest: WebGL test #65
    • PASS [expected FAIL] subtest: WebGL test #67
  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 1
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 2
  • OK /custom-elements/form-associated/form-disabled-callback.html
    • PASS [expected FAIL] subtest: A disabled form-associated custom element should not submit an entry for it
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/small-payload.tentative.https.window.html (#35210)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/009.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url with document.write and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html (#28681)
    • FAIL [expected PASS] subtest: load &amp; pageshow events do not fire on contentWindow of &lt;iframe&gt; element created with src=''

      assert_unreached: load should not be fired Reached unreachable code
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/refresh/same-document-refresh.html (#34597)
    • FAIL [expected PASS] subtest: Same-Document Referrer from Refresh

      assert_equals: original page loads expected "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section" but got "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section#section"
      

  • PASS [expected FAIL] /html/canvas/element/manual/text/canvas.2d.disconnected.html (#30063)
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with non-existent fragments should work.

      Test timed out
      

  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with "top" fragments should work.

      Test timed out
      

  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (#24066)
  • OK /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.html (#33948)
    • FAIL [expected PASS] subtest: Revoking a blob URL immediately after calling import will not fail

      promise_test: Unhandled rejection with value: object "TypeError: Dynamic import failed"
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • OK /preload/prefetch-document.html (#37210)
    • FAIL [expected PASS] subtest: different-site document prefetch with 'as=document' should not be consumed

      assert_equals: expected 2 but got 1
      

  • TIMEOUT /preload/preload-resource-match.https.html (#38088)
    • TIMEOUT [expected FAIL] subtest: Loading script (use-credentials) with link (no-cors) should discard the preloaded response

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Loading script (use-credentials) with link (anonymous) should discard the preloaded response
  • CRASH [expected OK] /resource-timing/tentative/document-initiated.html (#37785)
  • OK /xhr/send-redirect.htm (#32026)
    • FAIL [expected PASS] subtest: XMLHttpRequest: send() - Redirects (basics) (303, POST, redirect.py%3Flocation%3Dcontent.py)

      assert_equals: expected (string) "GET" but got (object) null
      

Stable unexpected results that are known to be intermittent (16)
  • OK /FileAPI/url/url-with-fetch.any.worker.html (#21517)
    • PASS [expected FAIL] subtest: Revoke blob URL after calling fetch, fetch should succeed
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/008.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html (#29066)
    • FAIL [expected PASS] subtest: Check execution order from nested timeout

      assert_equals: Expected nested setTimeout to run second expected true but got false
      

    • FAIL [expected PASS] subtest: Check execution order on load handler

      assert_equals: Expected onload to run first expected false but got true
      

  • OK /html/browsers/history/the-history-interface/traverse_the_history_4.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus including no focusable descendants should be skipped

      assert_equals: expected Element node &lt;input autofocus=""&gt;&lt;/input&gt; but got Element node &lt;body&gt;&lt;div autofocus=""&gt;&lt;/div&gt;&lt;input autofocus=""&gt;&lt;/body&gt;
      

    • FAIL [expected NOTRUN] subtest: Area element should support autofocus

      assert_equals: expected Element node &lt;area autofocus="" href="/common/blank.html"&gt;&lt;/area&gt; but got Element node &lt;body&gt;
      &lt;img src="/media/poster.png" usemap="#map"&gt;
      &lt;map n...
      

  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html (#22647)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html (#24057)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html (#22154)
  • OK [expected TIMEOUT] /html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html (#29724)
    • PASS [expected TIMEOUT] subtest: reparent-form-during-planned-navigation-task
  • OK /preload/preload-error.sub.html (#37177)
    • FAIL [expected PASS] subtest: success (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?label=style should be loaded expected a number greater than 0 but got 0
      

    • FAIL [expected PASS] subtest: 404 (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?pipe=status%28404%29&amp;label=style should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: success (script): main
    • FAIL [expected PASS] subtest: 404 (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.js?pipe=status%28404%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: Decode-error (style): main
  • CRASH [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
  • OK [expected TIMEOUT] /webmessaging/without-ports/017.html (#24486)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, about:blank

Copy link

⚠️ Try run (#16614675580) failed.

Copy link

Test results for linux-wpt from try job (#16614675580):

Flaky unexpected result (17)
  • OK /_webgl/conformance/textures/misc/texture-upload-size.html (#21770)
    • FAIL [expected PASS] subtest: WebGL test #53

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #55

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #57

      assert_true: Texture was smaller than the expected size 2x2 expected true got false
      

    • FAIL [expected PASS] subtest: WebGL test #59

      assert_true: getError expected: INVALID_VALUE. Was NO_ERROR : when calling texSubImage2D with the same texture upload with offset 1, 1 expected true got false
      

    • PASS [expected FAIL] subtest: WebGL test #61
    • PASS [expected FAIL] subtest: WebGL test #63
    • PASS [expected FAIL] subtest: WebGL test #65
    • PASS [expected FAIL] subtest: WebGL test #67
  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 1
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 2
  • OK /custom-elements/form-associated/form-disabled-callback.html
    • PASS [expected FAIL] subtest: A disabled form-associated custom element should not submit an entry for it
  • OK [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/small-payload.tentative.https.window.html (#35210)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/009.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url with document.write and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html (#28681)
    • FAIL [expected PASS] subtest: load &amp; pageshow events do not fire on contentWindow of &lt;iframe&gt; element created with src=''

      assert_unreached: load should not be fired Reached unreachable code
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/refresh/same-document-refresh.html (#34597)
    • FAIL [expected PASS] subtest: Same-Document Referrer from Refresh

      assert_equals: original page loads expected "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section" but got "http://web-platform.test:8000/html/browsers/browsing-the-web/navigating-across-documents/refresh/resources/refresh-with-section.sub.html?url=%23section#section"
      

  • PASS [expected FAIL] /html/canvas/element/manual/text/canvas.2d.disconnected.html (#30063)
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with non-existent fragments should work.

      Test timed out
      

  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with "top" fragments should work.

      Test timed out
      

  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (#24066)
  • OK /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.html (#33948)
    • FAIL [expected PASS] subtest: Revoking a blob URL immediately after calling import will not fail

      promise_test: Unhandled rejection with value: object "TypeError: Dynamic import failed"
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • OK /preload/prefetch-document.html (#37210)
    • FAIL [expected PASS] subtest: different-site document prefetch with 'as=document' should not be consumed

      assert_equals: expected 2 but got 1
      

  • TIMEOUT /preload/preload-resource-match.https.html (#38088)
    • TIMEOUT [expected FAIL] subtest: Loading script (use-credentials) with link (no-cors) should discard the preloaded response

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Loading script (use-credentials) with link (anonymous) should discard the preloaded response
  • CRASH [expected OK] /resource-timing/tentative/document-initiated.html (#37785)
  • OK /xhr/send-redirect.htm (#32026)
    • FAIL [expected PASS] subtest: XMLHttpRequest: send() - Redirects (basics) (303, POST, redirect.py%3Flocation%3Dcontent.py)

      assert_equals: expected (string) "GET" but got (object) null
      

Stable unexpected results that are known to be intermittent (16)
  • OK /FileAPI/url/url-with-fetch.any.worker.html (#21517)
    • PASS [expected FAIL] subtest: Revoke blob URL after calling fetch, fetch should succeed
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/008.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/empty-iframe-load-event.html (#29066)
    • FAIL [expected PASS] subtest: Check execution order from nested timeout

      assert_equals: Expected nested setTimeout to run second expected true but got false
      

    • FAIL [expected PASS] subtest: Check execution order on load handler

      assert_equals: Expected onload to run first expected false but got true
      

  • OK /html/browsers/history/the-history-interface/traverse_the_history_4.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • OK [expected TIMEOUT] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • FAIL [expected NOTRUN] subtest: Host element with delegatesFocus including no focusable descendants should be skipped

      assert_equals: expected Element node &lt;input autofocus=""&gt;&lt;/input&gt; but got Element node &lt;body&gt;&lt;div autofocus=""&gt;&lt;/div&gt;&lt;input autofocus=""&gt;&lt;/body&gt;
      

    • FAIL [expected NOTRUN] subtest: Area element should support autofocus

      assert_equals: expected Element node &lt;area autofocus="" href="/common/blank.html"&gt;&lt;/area&gt; but got Element node &lt;body&gt;
      &lt;img src="/media/poster.png" usemap="#map"&gt;
      &lt;map n...
      

  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html (#22647)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html (#24057)< 10BC0 /li>
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html (#22154)
  • OK [expected TIMEOUT] /html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html (#29724)
    • PASS [expected TIMEOUT] subtest: reparent-form-during-planned-navigation-task
  • OK /preload/preload-error.sub.html (#37177)
    • FAIL [expected PASS] subtest: success (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?label=style should be loaded expected a number greater than 0 but got 0
      

    • FAIL [expected PASS] subtest: 404 (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?pipe=status%28404%29&amp;label=style should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: success (script): main
    • FAIL [expected PASS] subtest: 404 (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.js?pipe=status%28404%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: Decode-error (style): main
  • CRASH [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
  • OK [expected TIMEOUT] /webmessaging/without-ports/017.html (#24486)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, about:blank

Copy link

⚠️ Try run (#16614675580) failed.

@mukilan mukilan force-pushed the inline-svg-using-resvg branch from f073919 to 462f4b8 Compare August 4, 2025 05:34
@mukilan mukilan added the T-linux-wpt Do a try run of the WPT label Aug 4, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Aug 4, 2025
Copy link
github-actions bot commented Aug 4, 2025

🔨 Triggering try run (#16714893623) for Linux (WPT)

Copy link
github-actions bot commented Aug 4, 2025

Test results for linux-wpt from try job (#16714893623):

Flaky unexpected result (24)
  • OK /FileAPI/url/url-with-fetch.any.worker.html (#21517)
    • FAIL [expected PASS] subtest: Revoke blob URL after calling fetch, fetch should succeed

      promise_test: Unhandled rejection with value: object "TypeError: Network error occurred"
      

  • FAIL [expected PASS] /_mozilla/css/dirty_viewport.html (#13731)
  • OK [expected TIMEOUT] /_webgl/conformance/textures/misc/tex-video-using-tex-unit-non-zero.html
    • PASS [expected NOTRUN] subtest: Overall test
  • OK /css/css-fonts/variations/at-font-face-font-matching.html (#20684)
    • FAIL [expected PASS] subtest: Matching font-weight: '400' should prefer '350 399' over '351 398'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • FAIL [expected PASS] subtest: Matching font-weight: '399' should prefer '340 360' over '200 300'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • FAIL [expected PASS] subtest: Matching font-stretch: '90%' should prefer '90% 100%' over '50% 80%'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • FAIL [expected PASS] subtest: Matching font-style: 'italic' should prefer 'oblique 30deg 60deg' over 'oblique 40deg 50deg'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • PASS [expected FAIL] subtest: Matching font-style: 'oblique 21deg' should prefer 'oblique -40deg -30deg' over 'italic'
    • PASS [expected FAIL] subtest: Matching font-style: 'oblique 0deg' should prefer 'oblique -40deg -30deg' over 'italic'
    • PASS [expected FAIL] subtest: Matching font-style: 'oblique -20deg' should prefer 'oblique 40deg 50deg' over 'italic'
  • OK /css/cssom-view/elementsFromPoint-iframes.html (#38362)
    • PASS [expected FAIL] subtest: elementsFromPoint on the root document for points in iframe elements
  • OK /custom-elements/form-associated/ElementInternals-setFormValue.html (#29174)
    • PASS [expected FAIL] subtest: Single value - name is missing
  • TIMEOUT [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/max-payload.tentative.https.window.html (#35210)
  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-dest
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Cross-site
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-origin destination
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-window-open.html (#28691)
    • FAIL [expected PASS] subtest: load event does not fire on window.open('about:blank')

      assert_unreached: load should not be fired Reached unreachable code
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/javascript-url-return-value-handling-dynamic.html (#28066)
    • FAIL [expected PASS] subtest: 0041 set in href="" targeting a frame and clicked

      assert_equals: expected "A" but got ""
      

    • FAIL [expected PASS] subtest: 0080 00FF set in href="" targeting a frame and clicked

      assert_equals: expected "�ÿ" but got ""
      

    • FAIL [expected PASS] subtest: 0080 00FF 0100 set in href="" targeting a frame and clicked

      assert_equals: expected "�ÿĀ" but got ""
      

    • FAIL [expected PASS] subtest: D83D DE0D set in href="" targeting a frame and clicked

      assert_equals: expected "😍" but got ""
      

    • FAIL [expected PASS] subtest: DE0D 0041 set in href="" targeting a frame and clicked

      assert_equals: expected "\ufffdA" but got ""
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-click.html (#28697)
    • PASS [expected FAIL] subtest: aElement.click() before the load event must NOT replace
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-top.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with "top" fragments should work.

      Test timed out
      

  • TIMEOUT [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html (#22667)
    • TIMEOUT [expected FAIL] subtest: Check that popups from a sandboxed iframe escape the sandbox if allow-popups-to-escape-sandbox is used

      Test timed out
      

  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html (#24057)
  • OK /html/semantics/embedded-content/the-video-element/intrinsic_sizes.htm (#37173)
    • PASS [expected FAIL] subtest: default object size after src is removed
  • OK /html/semantics/forms/form-submission-0/form-submit-iframe-then-location-navigate.html (#29634)
    • PASS [expected FAIL] subtest: Verifies that location navigations take precedence when following form submissions.
  • OK [expected TIMEOUT] /html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html (#29724)
    • PASS [expected TIMEOUT] subtest: reparent-form-during-planned-navigation-task
  • CRASH [expected OK] /html/semantics/forms/the-fieldset-element/disabled-003.html (#31730)
  • OK /html/semantics/scripting-1/the-script-element/execution-timing/077.html (#22139)
    • FAIL [expected PASS] subtest: adding several types of scripts through the DOM and removing some of them confuses scheduler

      assert_array_equals: expected property 1 to be "Script #1 ran" but got "Script #3 ran" (expected array ["Script #2 ran", "Script #1 ran", "Script #3 ran", "Script #4 ran"] got ["Script #2 ran", "Script #3 ran", "Script #4 ran", "Script #1 ran"])
      

  • TIMEOUT /preload/preload-resource-match.https.html (#38088)
    • TIMEOUT [expected FAIL] subtest: Loading script (use-credentials) with link (no-cors) should discard the preloaded response

      Test timed out
      

    • NOTRUN [expected TIMEOUT] subtest: Loading script (use-credentials) with link (anonymous) should discard the preloaded response
  • TIMEOUT [expected OK] /resource-timing/nested-context-navigations-iframe.html (#24311)
    • TIMEOUT [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe refreshes are not observable by the parent
  • OK [expected TIMEOUT] /webmessaging/without-ports/018.html (#24485)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, javascript:
  • ERROR [expected OK] /workers/constructors/Worker/Worker-constructor.html (#22991)
Stable unexpected results that are known to be intermittent (17)
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • FAIL [expected PASS] /_mozilla/mozilla/sslfail.html (#10760)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 1
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 2
  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /html/browsers/browsing-the-web/navigating-across-documents/009.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url with document.write and href navigation
  • OK /html/browsers/history/the-history-interface/traverse_the_history_5.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • TIMEOUT [expected FAIL] subtest: Element with tabindex should support autofocus

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Non-HTMLElement should not support autofocus
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus should support autofocus
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus including no focusable descendants should be skipped
    • NOTRUN [expected FAIL] subtest: Area element should support autofocus
  • OK /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html (#22647)
    • FAIL [expected TIMEOUT] subtest: Check that popups from a sandboxed iframe escape the sandbox if allow-popups-to-escape-sandbox is used

      assert_equals: It came from a sandboxed iframe expected "null" but got "http://web-platform.test:8000"
      

  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html (#22154)
  • CRASH [expected TIMEOUT] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html (#24066)
  • OK /preload/preload-error.sub.html (#37177)
    • FAIL [expected PASS] subtest: success (style): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?label=style should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: success (script): main
    • FAIL [expected PASS] subtest: 404 (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.js?pipe=status%28404%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

    • FAIL [expected PASS] subtest: CORS (script): main

      assert_greater_than: http://not-web-platform.test:8000/preload/resources/dummy.js?pipe=header%28Access-Control-Allow-Origin%2C*%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: success (xhr): main
    • FAIL [expected PASS] subtest: 404 (xhr): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.xml?pipe=status%28404%29&amp;label=xhr should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: Decode-error (style): main
    • FAIL [expected PASS] subtest: Decode-error (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.xml?pipe=header%28Content-Type%2Ctext%2Fjavascript%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

  • OK /resize-observer/eventloop.html (#33599)
    • PASS [expected FAIL] subtest: test0: multiple notifications inside same event loop
  • ERROR /service-workers/idlharness.https.any.html (#36250)
    • PASS [expected TIMEOUT] subtest: ServiceWorkerContainer interface: operation register((TrustedScriptURL or USVString), optional RegistrationOptions)
    • PASS [expected TIMEOUT] subtest: NavigationPrelo FC51 adManager interface: operation enable()
    • PASS [expected TIMEOUT] subtest: NavigationPreloadManager interface: operation disable()
    • PASS [expected TIMEOUT] subtest: NavigationPreloadManager interface: operation setHeaderValue(ByteString)
    • PASS [expected TIMEOUT] subtest: NavigationPreloadManager interface: operation getState()
  • CRASH [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
  • OK /webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html (#22849)
    • FAIL [expected PASS] subtest: X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}. Index Actual Expected AbsError RelError Test threshold [15300] 1.0312826880000000e+10 -8.2017236948013306e-1 1.0312826880820173e+10 1.2573975013760786e+10 9.0957000000000003e-5 [15301] -2.1671967605912945e-12 -8.5440337657928467e-1 8.5440337657711751e-1 9.9999999999746358e-1 9.0957000000000003e-5 Max AbsError of 1.0312826880820173e+10 at index of 15300. Max RelError of 1.2573975013760786e+10 at index of 15300.

      assert_true: expected true got false
      

    • FAIL [expected PASS] subtest: X SNR (-156.83346860403506 dB) is not greater than or equal to 85.58. Got -156.83346860403506.

      assert_true: expected true got false
      

  • OK [expected TIMEOUT] /webmessaging/with-ports/017.html (#24486)
    • PASS [expected TIMEOUT] subtest: origin of the script that invoked the method, about:blank

Copy link
github-actions bot commented Aug 4, 2025

✨ Try run (#16714893623) succeeded.

@mukilan mukilan marked this pull request as ready for review August 4, 2025 06:27
Copy link
Member
@mrobinson mrobinson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We all agree that it's a hack, but it's a pretty straightforward one! Nice work. Just a couple small things here:

@mukilan mukilan force-pushed the inline-svg-using-resvg branch from 462f4b8 to 005d381 Compare August 11, 2025 04:30
@mukilan mukilan added the T-linux-wpt Do a try run of the WPT label Aug 11, 2025
@github-actions github-actions bot removed the T-linux-wpt Do a try run of the WPT label Aug 11, 2025
Copy link

🔨 Triggering try run (#16871551539) for Linux (WPT)

Copy link

Test results for linux-wpt from try job (#16871551539):

Flaky unexpected result (18)
  • FAIL [expected PASS] /css/CSS2/text/text-indent-067.xht
  • FAIL [expected PASS] /css/WOFF2/metadatadisplay-schema-license-006.xht
  • OK /css/css-cascade/layer-font-face-override.html (#35935)
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 1
    • PASS [expected FAIL] subtest: @font-face override update with appended sheet 2
  • OK /css/css-fonts/variations/at-font-face-font-matching.html (#20684)
    • FAIL [expected PASS] subtest: Matching font-weight: '400' should prefer '350 399' over '351 398'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

    • FAIL [expected PASS] subtest: Matching font-weight: '501' should prefer '390 410' over '300 350'

      assert_equals: Unexpected font on test element expected 487 but got 532
      

  • PASS [expected FAIL] /css/css-grid/grid-items/grid-auto-margin-and-replaced-item-001.html (#37162)
  • TIMEOUT [expected ERROR] /fetch/fetch-later/quota/same-origin-iframe/max-payload.tentative.https.window.html (#35210)
  • OK /fetch/metadata/generated/css-font-face.https.sub.tentative.html (#32732)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Cross-site
  • TIMEOUT /fetch/metadata/generated/css-images.sub.tentative.html (#29047)
    • TIMEOUT [expected PASS] subtest: background-image sec-fetch-site - Not sent to non-trustworthy cross-site destination

      Test timed out
      

  • TIMEOUT [expected OK] /html/browsers/browsing-the-web/navigating-across-documents/anchor-fragment-form-submit-longfragment.html
  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/autofocus-dialog.html (#29087)
    • TIMEOUT [expected FAIL] subtest: &lt;dialog&gt;-contained autofocus element gets focused when the dialog is shown

      Test timed out
      

  • TIMEOUT [expected OK] /html/interaction/focus/the-autofocus-attribute/document-with-fragment-nonexistent.html (#28259)
    • TIMEOUT [expected FAIL] subtest: Autofocus elements in top-level browsing context's documents with non-existent fragments should work.

      Test timed out
      

  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-2.html (#22667)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-3.html (#24057)
  • OK /html/semantics/forms/form-submission-0/urlencoded2.window.html (#28687)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: Basic test (normal form)
    • PASS [expected FAIL] subtest: application/x-www-form-urlencoded: \r\n in filename (formdata event)
  • OK /html/semantics/scripting-1/the-script-element/module/dynamic-import/blob-url.any.html (#33948)
    • FAIL [expected PASS] subtest: Revoking a blob URL immediately after calling import will not fail

      promise_test: Unhandled rejection with value: object "TypeError: Dynamic import failed"
      

  • OK /html/webappapis/user-prompts/print-during-unload.html (#35944)
    • FAIL [expected PASS] subtest: print() during unload

      assert_array_equals: expected property 1 to be "destination" but got "error: window.print is not a function" (expected array ["start", "destination"] got ["start", "error: window.print is not a function"])
      

  • TIMEOUT [expected OK] /resource-timing/nested-context-navigations-iframe.html (#24311)
    • TIMEOUT [expected PASS] subtest: Test that iframe navigations are not observable by the parent, even after history navigations by the parent

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent, even after history navigations by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent, even after history navigations by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe navigations are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that crossorigin iframe refreshes are not observable by the parent
    • NOTRUN [expected PASS] subtest: Test that cross-site iframe refreshes are not observable by the parent
  • ERROR /service-workers/idlharness.https.any.html (#36250)
    • TIMEOUT [expected PASS] subtest: ServiceWorkerContainer interface: operation register((TrustedScriptURL or USVString), optional RegistrationOptions)

      Test timed out
      

    • TIMEOUT [expected PASS] subtest: NavigationPreloadManager interface: operation enable()

      Test timed out
      

    • TIMEOUT [expected PASS] subtest: NavigationPreloadManager interface: operation disable()

      Test timed out
      

    • TIMEOUT [expected PASS] subtest: NavigationPreloadManager interface: operation setHeaderValue(ByteString)

      Test timed out
      

    • TIMEOUT [expected PASS] subtest: NavigationPreloadManager interface: operation getState()

      Test timed out
      

Stable unexpected results that are known to be intermittent (26)
  • FAIL [expected PASS] /_mozilla/css/stacked_layers.html (#15988)
  • FAIL [expected PASS] /_mozilla/mozilla/sslfail.html (#10760)
  • TIMEOUT [expected OK] /_mozilla/mozilla/window_resize_event.html (#36741)
    • TIMEOUT [expected PASS] subtest: Popup onresize event fires after resizeTo

      Test timed out
      

  • OK /content-security-policy/frame-ancestors/frame-ancestors-path-ignored.window.html (#36468)
    • FAIL [expected PASS] subtest: A 'frame-ancestors' CSP directive with a URL that includes a path should be ignored.

      assert_unreached: The IFrame should have been blocked (or cross-origin). It wasn't. Reached unreachable code
      

  • TIMEOUT [expected FAIL] /dom/xslt/large-cdata.html (#38029)
  • OK /fetch/metadata/generated/css-font-face.sub.tentative.html (#34624)
    • PASS [expected FAIL] subtest: sec-fetch-storage-access - Not sent to non-trustworthy same-origin destination
    • FAIL [expected PASS] subtest: sec-fetch-storage-access - Not sent to non-trustworthy cross-site destination

      promise_test: Unhandled rejection with value: object "Error: Failed to query for recorded headers."
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/005.html (#27062)
    • PASS [expected FAIL] subtest: Link with onclick navigation and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/008.html (#24456)
    • PASS [expected FAIL] subtest: Link with onclick form submit to javascript url and href navigation
  • OK /html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/load-pageshow-events-iframe-contentWindow.html (#28681)
    • FAIL [expected PASS] subtest: load &amp; pageshow events do not fire on contentWindow of &lt;iframe&gt; element created with src='about:blank'

      assert_unreached: load should not be fired Reached unreachable code
      

  • OK /html/browsers/browsing-the-web/navigating-across-documents/navigation-unload-same-origin.window.html (#29049)
    • PASS [expected FAIL] subtest: Same-origin navigation started from unload handler must be ignored
  • OK /html/browsers/history/the-history-interface/traverse_the_history_5.html (#21383)
    • PASS [expected FAIL] subtest: Multiple history traversals, last would be aborted
  • PASS [expected FAIL] /html/canvas/element/manual/drawing-text-to-the-canvas/canvas.2d.disconnected-font-size-math.html (#30063)
  • TIMEOUT /html/interaction/focus/the-autofocus-attribute/supported-elements.html (#24145)
    • TIMEOUT [expected FAIL] subtest: Element with tabindex should support autofocus

      Test timed out
      

    • NOTRUN [expected PASS] subtest: Non-HTMLElement should not support autofocus
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus should support autofocus
    • NOTRUN [expected FAIL] subtest: Host element with delegatesFocus including no focusable descendants should be skipped
  • OK /html/semantics/embedded-content/the-iframe-element/iframe-loading-lazy-reload-location-reload.html (#32595)
    • PASS [expected FAIL] subtest: Reloading iframe loading='lazy' before it is loaded: location.reload
  • TIMEOUT [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_escaping-1.html (#22647)
  • OK [expected CRASH] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-1.html (#24066)
  • CRASH [expected OK] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-2.html (#22154)
  • OK [expected TIMEOUT] /html/semantics/embedded-content/the-iframe-element/iframe_sandbox_popups_nonescaping-3.html (#24066)
    • FAIL [expected NOTRUN] subtest: Check that popups from a sandboxed iframe do not escape the sandbox

      assert_equals: It came from a sandboxed iframe expected "null" but got "http://web-platform.test:8000"
      

  • OK /html/semantics/embedded-content/the-video-element/intrinsic_sizes.htm (#37173)
    • FAIL [expected PASS] subtest: default object size after src is removed

      assert_equals: expected "300px" but got "320px"
      

  • OK [expected TIMEOUT] /html/semantics/forms/form-submission-0/reparent-form-during-planned-navigation-task.html (#29724)
    • PASS [expected TIMEOUT] subtest: reparent-form-during-planned-navigation-task
  • OK /html/semantics/forms/historical.html (#28568)
    • FAIL [expected PASS] subtest: &lt;input name=isindex&gt; should not be supported

      assert_regexp_match: expected object "/\?isindex=x$/" but got "about:blank"
      

  • OK /navigation-timing/test-navigation-type-reload.html (#33334)
    • PASS [expected FAIL] subtest: Reload domComplete &gt; Original domComplete
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventEnd &gt; Original domContentLoadedEventEnd
    • PASS [expected FAIL] subtest: Reload domContentLoadedEventStart &gt; Original domContentLoadedEventStart
    • PASS [expected FAIL] subtest: Reload fetchStart &gt; Original fetchStart
    • PASS [expected FAIL] subtest: Reload loadEventEnd &gt; Original loadEventEnd
    • PASS [expected FAIL] subtest: Reload loadEventStart &gt; Original loadEventStart
  • OK /preload/preload-error.sub.html (#37177)
    • PASS [expected FAIL] subtest: success (style): main
    • PASS [expected FAIL] subtest: 404 (style): main
    • PASS [expected FAIL] subtest: CORS (style): main
    • PASS [expected FAIL] subtest: success (script): main
    • FAIL [expected PASS] subtest: 404 (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.js?pipe=status%28404%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

    • PASS [expected FAIL] subtest: 404 (xhr): main
    • PASS [expected FAIL] subtest: Decode-error (style): main
    • PASS [expected FAIL] subtest: Decode-error (script): main
    • FAIL [expected PASS] subtest: MIME-error (script): main

      assert_greater_than: http://web-platform.test:8000/preload/resources/dummy.css?pipe=header%28Content-Type%2Ctext%2Fnotjavascript%29&amp;label=script should be loaded expected a number greater than 0 but got 0
      

  • CRASH [expected TIMEOUT] /trusted-types/trusted-types-navigation.html?06-10 (#37920)
  • OK /webaudio/the-audio-api/the-audiobuffersourcenode-interface/sub-sample-buffer-stitching.html (#22849)
    • FAIL [expected PASS] subtest: X Stitched sine-wave buffers at sample rate 44100 does not equal [0,0.06264832615852356,0.12505052983760834,0.18696144223213196,0.24813786149024963,0.308339387178421,0.36732959747314453,0.4248766601085663,0.480754554271698,0.5347436666488647,0.5866320133209229,0.6362156271934509,0.6832997798919678,0.7276994585990906,0.7692402601242065,0.8077589869499207...] with an element-wise tolerance of {"absoluteThreshold":0.000090957,"relativeThreshold":0}. Index Actual Expected AbsError RelError Test threshold [14970] 9.5815062522888184e-3 7.6832914352416992e-1 7.5874763727188110e-1 9.8752942494366358e-1 9.0957000000000003e-5 [14971] 4.5767809143312850e-41 7.2672140598297119e-1 7.2672140598297119e-1 1.0000000000000000e+0 9.0957000000000003e-5 Max AbsError of 7.5874763727188110e-1 at index of 14970. Max RelError of 1.0000000000000000e+0 at index of 14971.

      assert_true: expected true got false
      

    • FAIL [expected PASS] subtest: X SNR (43.00509556970765 dB) is not greater than or equal to 85.58. Got 43.00509556970765.

      assert_true: expected true got false
      

  • OK [expected ERROR] /workers/constructors/Worker/Worker-constructor.html (#22991)

Copy link

✨ Try run (#16871551539) succeeded.

@mukilan mukilan requested a review from mrobinson August 11, 2025 06:15
This patch adds support for rendering static inline SVG documents in the
DOM tree by serializing the SVGElement's subtree and leveraging the
existing resvg based SVG stack for rendering. Serialiing the subtree is
necessary as resvg's tree representation (roxmltree) is immutable, so we
can't construct the tree incrementally.

Few other design choices here:
1. The `SVGSVGElement` is now treated as a replaced element and the
   layout code is responsible for plumbing the serialized SVG source
   (encoded as a base64 data: url) into the image cache, much like how
   background images are handled.
2. The serialization is done on the script thread after an initial
   layout pass. This is necessary because the serialization code asserts
   that it is invoked from script thread i.e we can't call it from layout
   workers.
3. The serialized SVG data: url is cached to avoid recomputing it on
   subsequent layouts. The cache is invalidated when the SVGSVGElement's
   subtree is mutated.

The original SVGSVGElement code was behind the `dom_svg_enabled` pref.
This patch also removes the preference and make SVG support using resvg
available unconditionally.

Below is the analysis of the new test failures:

These tests use inline SVG but used to pass by accident.
They now fail because they contain SVG with no intrinsic
sizing which is not handled by resvg in a way that would
allows us to distinguish it from the sized case. The same
limitation applies to non-inline SVG.

 - /css/CSS2/positioning/absolute-replaced-width-003a.xht
 - /css/CSS2/positioning/absolute-replaced-width-003b.xht
 - /css/CSS2/positioning/absolute-replaced-width-003c.xht

These tests employ CSS styles in the HTML that
target the elements in inline SVG, which is not currently
supported.

 - /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg-basic.html
 - /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg.html

This is a tentative test that uses the unsupported 'border-shape' CSS
property. The ref uses SVG, so it used to pass accidentally. The ref
still doesn't render correctly since it also relies on styling SVG
elements using CSS classes in the HTML (instead of inline in SVG).

 - /css/css-borders/tentative/border-shape/border-shape-stroke.html

These tests use the attribute 'clip-path=circle(...)' in the
test, but this doesn't seem to work in resvg.

 - /css/css-masking/clip-path/clip-path-borderBox-1b.html
 - /css/css-masking/clip-path/clip-path-contentBox-1b.html
 - /css/css-masking/clip-path/clip-path-contentBox-1c.html
 - /css/css-masking/clip-path/clip-path-fillBox-1b.html
 - /css/css-masking/clip-path/clip-path-marginBox-1a.html
 - /css/css-masking/clip-path/clip-path-paddingBox-1b.html
 - /css/css-masking/clip-path/clip-path-strokeBox-1b.html
 - /css/css-masking/clip-path/clip-path-strokeBox-1c.html
 - /css/css-masking/clip-path/clip-path-viewBox-1a.html
 - /css/css-masking/clip-path/clip-path-viewBox-1b.html
 - /css/css-masking/clip-path/clip-path-viewBox-1d.html
 - /css/css-masking/clip-path/svg-clip-path-circle-offset.html
 - /css/css-masking/clip-path/svg-clip-path-ellipse-offset.html

Additionally, the below two tests use a `foreignObject` SVG element which
embeds a html div fragment. This is also not supported by resvg.

 - /css/css-masking/clip-path/clip-path-viewBox-1d.html
 - /css/css-masking/clip-path/clip-path-fillBox-1b.html

The following test fails because of apparent pixel differences
between a circle rendered purely using CSS clip-path vs a circle
rendered in SVG using resvg.

 - /css/css-masking/clip-path/clip-path-contentBox-1c.html

These tests style the inline SVG elements using CSS in the HTML or
separate stylesheet. This is not supported by this implementation.

 - /css-transforms/document-styles/svg-document-styles-001.html
 - /css-transforms/document-styles/svg-document-styles-002.html
 - /css-transforms/document-styles/svg-document-styles-003.html
 - /css-transforms/document-styles/svg-document-styles-004.html
 - /css-transforms/document-styles/svg-document-styles-012.html
 - /css-transforms/external-styles/svg-external-styles-001.html
 - /css-transforms/external-styles/svg-external-styles-002.html
 - /css-transforms/external-styles/svg-external-styles-003.html
 - /css-transforms/external-styles/svg-external-styles-004.html
 - /css-transforms/external-styles/svg-external-styles-014.html

These tests seem like they should pass, but they fail because of what
seems like an anti-aliasing issue in the rendering engine. The
transformed element has a thin outline which is causing pixel difference
with the ref:

 - /css/css-transforms/group/svg-transform-group-008.html
 - /css/css-transforms/group/svg-transform-group-009.html
 - /css/css-transforms/group/svg-transform-nested-009.html
 - /css/css-transforms/group/svg-transform-nested-013.html
 - /css/css-transforms/group/svg-transform-nested-014.html
 - /css/css-transforms/group/svg-transform-nested-018.html
 - /css/css-transforms/group/svg-transform-nested-019.html
 - /css/css-transforms/group/svg-transform-nested-008.html

The below tests fail because resvg is calculating the wrong size for the
'rect' inside the SVG. The dimensions of the SVG are established via the
CSS in the HTML, so it seems resvg is using incorrect coordinates for
the children of the svg when explict width/height are not specified in
the root svg element.

 - /css/css-transforms/group/svg-transform-group-011.html
 - /css/css-transforms/group/svg-transform-nested-021.html
 - /css/css-transforms/group/svg-transform-nested-029.html

All these tests use an SVG that doesn't have width nor height attributes
and this causes resvg to use incorrect coordinates for the SVG's
children. In addition, the following tests use the CSS syntax for
transforms inside the SVG (using style attribute) which is not supported
by resvg (it only supports the SVG 1.1 transform syntax).

 - /css/css-transforms/inline-styles/svg-inline-styles-001.html
 - /css/css-transforms/inline-styles/svg-inline-styles-002.html
 - /css/css-transforms/inline-styles/svg-inline-styles-003.html
 - /css/css-transforms/inline-styles/svg-inline-styles-004.html
 - /css/css-transforms/inline-styles/svg-inline-styles-012.html

In the case of these four tests, the `style` attribute specifies an
invalid transform, but resvg doesn't fallback to the transform specified
via the `transform`  attribute on the same element.

 - /css/css-transforms/inline-styles/svg-inline-styles-005.html
 - /css/css-transforms/inline-styles/svg-inline-styles-006.html
 - /css/css-transforms/inline-styles/svg-inline-styles-010.html
 - /css/css-transforms/inline-styles/svg-inline-styles-013.html

The following test fails because of the lack of width/height in SVG as
described above but it also exposes gaps in our CSS tranform
implementation.

 - /css/css-transforms/preserve3d-and-filter-with-perspective.html

These tests failure because resvg doesn't handle the SVG without
explicit width and height, but specified via CSS in the HTML. In
addition, there are pixel differences between the ref due to
antialiasing issues.

 - /css/css-transforms/matrix/svg-matrix-005.html
 - /css/css-transforms/matrix/svg-matrix-006.html
 - /css/css-transforms/matrix/svg-matrix-007.html
 - /css/css-transforms/matrix/svg-matrix-008.html
 - /css/css-transforms/matrix/svg-matrix-010.html
 - /css/css-transforms/matrix/svg-matrix-012.html
 - /css/css-transforms/matrix/svg-matrix-015.html
 - /css/css-transforms/matrix/svg-matrix-016.html
 - /css/css-transforms/matrix/svg-matrix-017.html
 - /css/css-transforms/matrix/svg-matrix-018.html
 - /css/css-transforms/matrix/svg-matrix-019.html
 - /css/css-transforms/matrix/svg-matrix-020.html
 - /css/css-transforms/matrix/svg-matrix-021.html
 - /css/css-transforms/matrix/svg-matrix-022.html
 - /css/css-transforms/matrix/svg-matrix-023.html
 - /css/css-transforms/matrix/svg-matrix-024.html
 - /css/css-transforms/matrix/svg-matrix-025.html
 - /css/css-transforms/matrix/svg-matrix-026.html
 - /css/css-transforms/matrix/svg-matrix-027.html
 - /css/css-transforms/matrix/svg-matrix-028.html
 - /css/css-transforms/matrix/svg-matrix-029.html
 - /css/css-transforms/matrix/svg-matrix-030.html
 - /css/css-transforms/matrix/svg-matrix-031.html
 - /css/css-transforms/matrix/svg-matrix-032.html
 - /css/css-transforms/matrix/svg-matrix-033.html
 - /css/css-transforms/matrix/svg-matrix-034.html
 - /css/css-transforms/matrix/svg-matrix-035.html
 - /css/css-transforms/matrix/svg-matrix-036.html
 - /css/css-transforms/matrix/svg-matrix-037.html
 - /css/css-transforms/matrix/svg-matrix-038.html
 - /css/css-transforms/matrix/svg-matrix-039.html
 - /css/css-transforms/matrix/svg-matrix-040.html
 - /css/css-transforms/matrix/svg-matrix-041.html
 - /css/css-transforms/matrix/svg-matrix-042.html
 - /css/css-transforms/matrix/svg-matrix-043.html
 - /css/css-transforms/matrix/svg-matrix-044.html
 - /css/css-transforms/matrix/svg-matrix-045.html
 - /css/css-transforms/matrix/svg-matrix-046.html
 - /css/css-transforms/matrix/svg-matrix-047.html
 - /css/css-transforms/matrix/svg-matrix-048.html
 - /css/css-transforms/matrix/svg-matrix-049.html
 - /css/css-transforms/matrix/svg-matrix-050.html
 - /css/css-transforms/matrix/svg-matrix-051.html
 - /css/css-transforms/matrix/svg-matrix-052.html
 - /css/css-transforms/matrix/svg-matrix-053.html
 - /css/css-transforms/matrix/svg-matrix-054.html
 - /css/css-transforms/matrix/svg-matrix-055.html
 - /css/css-transforms/matrix/svg-matrix-056.html
 - /css/css-transforms/matrix/svg-matrix-057.html
 - /css/css-transforms/matrix/svg-matrix-058.html
 - /css/css-transforms/matrix/svg-matrix-059.html
 - /css/css-transforms/matrix/svg-matrix-060.html
 - /css/css-transforms/matrix/svg-matrix-061.html
 - /css/css-transforms/matrix/svg-matrix-062.html
 - /css/css-transforms/matrix/svg-matrix-063.html
 - /css/css-transforms/matrix/svg-matrix-064.html
 - /css/css-transforms/matrix/svg-matrix-065.html
 - /css/css-transforms/matrix/svg-matrix-066.html
 - /css/css-transforms/matrix/svg-matrix-067.html
 - /css/css-transforms/matrix/svg-matrix-068.html
 - /css/css-transforms/matrix/svg-matrix-069.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-001.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-011.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-022.html
 - /css/css-transforms/scale/svg-scale-006.html
 - /css/css-transforms/scale/svg-scale-007.html

These tests seem to be failing due to some sort of antialiasing issue,
where a transformed SVG element has a thin border that causes pixel
differences compared to the solid colored reference.

 - /css/css-transforms/skewX/svg-skewx-001.html
 - /css/css-transforms/skewX/svg-skewx-006.html
 - /css/css-transforms/skewX/svg-skewx-011.html
 - /css/css-transforms/skewX/svg-skewx-016.html
 - /css/css-transforms/skewX/svg-skewx-021.html
 - /css/css-transforms/skewX/svg-skewxy-001.html
 - /css/css-transforms/skewY/svg-skewy-001.html
 - /css/css-transforms/skewY/svg-skewy-006.html
 - /css/css-transforms/skewY/svg-skewy-011.html
 - /css/css-transforms/skewY/svg-skewy-016.html
 - /css/css-transforms/skewY/svg-skewy-021.html

These tests specify several SVG attributes such as transform,
vector-effect etc via CSS in the HTML (rather than inline in SVG). The
current implementation doesn't support this.

 - /css/css-transforms/transform-box/stroke-box-mutation-001.html
 - /css/css-transforms/transform-box/stroke-box-mutation-002.html
 - /css/css-transforms/transform-box/stroke-box-mutation-003.html
 - /css/css-transforms/transform-box/stroke-box-mutation-004.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-002.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-003.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-004.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-005.html

These tests depend on 'transform-origin' specified on an element inside
an SVG, but this transform is influenced by the 'tranform-box' set via
CSS in the HTML itself (not the SVG). The current implementation doesn't
support styling the SVG using document styles, so these tests just fail.

 - /css/css-transforms/transform-origin/svg-origin-relative-length-001.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-002.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-003.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-004.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-005.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-006.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-007.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-008.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-009.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-010.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-011.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-012.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-013.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-014.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-015.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-016.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-017.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-018.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-019.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-020.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-021.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-022.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-023.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-024.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-025.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-026.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-027.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-028.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-029.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-030.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-031.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-032.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-033.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-034.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-035.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-036.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-037.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-038.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-039.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-040.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-041.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-042.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-043.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-044.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-045.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-046.html

These tests check the fallback behaviour when invalid syntax is
encountered in the 'transform-origin' value. resvg doesn't correctly
fallback to 0,0 causing the tests to fail.

 - /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-001.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-002.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-003.html
 - /css/css-transforms/transform-origin/svg-origin-relative-length-invalid-004.html

These tests use unimplemented Canvas APIs like 'beginLayer' and
the 'CanvasFilter' constructor and hence fail at runtime.

 - /html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
 - /html/canvas/element/filters/2d.filter.layers.gaussianBlur.tentative.html
 - /html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
 - /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
 - /html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
 - /html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.tentative.html
 - /html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.tentative.html
 - /html/canvas/element/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
 - /html/canvas/element/layers/2d.layer.css-filters.blur.tentative.html
 - /html/canvas/element/layers/2d.layer.css-filters.shadow.tentative.html
 - /html/canvas/element/layers/2d.layer.ctm.layer-filter.tentative.html
 - /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
 - /html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
 - /html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.html
 - /html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.css-filters.blur.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.css-filters.shadow.tentative.html
 - /html/canvas/offscreen/layers/2d.layer.ctm.layer-filter.tentative.html

These tests fail because resvg doesn't seem to honour the 'translate'
CSS property specified on an SVG element using an inline 'style'
attribute.

 - /css/css-transforms/translate/svg-translate-with-units.html
 - /css/css-transforms/translate/translate-and-transform-attribute-in-svg.html
 - /css/css-transforms/translate/translate-and-transform-css-property-in-svg.html
 - /css/css-transforms/translate/translate-in-svg.html

These tests seem to fail due to the filter effect implementation in
resvg either not being complete or spec compliant.

 - /css/filter-effects/feconvolve-divisor.html
 - /css/filter-effects/feconvolve-region-001.html
 - /css/filter-effects/feconvolve-region-002.html
 - /css/filter-effects/filter-subregion-01.html
 - /css/filter-effects/svg-feimage-002.html
 - /css/filter-effects/svg-feimage-003.html
 - /css/filter-effects/svg-feimage-004.html
 - /css/filter-effects/svg-feoffset-001.html

The test /css/filter-effects/svg-feimage-004.html should ideally PASS
but currently fails because we don't propagate height/width set using
CSS in HTML element to the root SVG, so resvg uses the wrong dimensions
when rendering the children of the SVG.

These failures are due to deficienies in our current implementation
i.e we don't support styling SVG elements using CSS in HTML.

 - /css/css-transforms/gradientTransform/svg-gradientTransform-combination-001.html
 - /css/selectors/sharing-in-svg-use.html

The below test fails as our current implementation relies on resvg to
tell us the intrinsic ratio of the SVG, but this doesn't always work
correctly.

 - /css/css-sizing/svg-intrinsic-size-005.html

This failure is due to lack of proper fallback to no-op transform in
resvg when the `rotate()` syntax is specified with an invalid list e.g
`rotate(90,)`.

 - /css/css-transforms/rotate/svg-rotate-3args-invalid-002.html

This test only passes in CI and based on the raw log output, it seems
that no text inside the SVG is rendered in the CI. This could be an font
stack related issue.

 - /css/css-display/display-contents-svg-elements.html

This test asserts that the CSP blocks loads triggered using `use`
elements in SVG. It used to TIMEOUT as without inline SVG support, no
CSP violation event was triggered. It fails now since the event is now
triggered for the load of the SVG itself (our current implementation
loads inline SVGs as serialized base64 data: urls). This doesn't match
the blocked URL in the use element though.

 - /content-security-policy/img-src/svg-use-blocked.tentative.html

Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
@mukilan mukilan force-pushed the inline-svg-using-resvg branch from 005d381 to 43e2c08 Compare August 11, 2025 09:25
@mukilan
Copy link
Member Author
mukilan commented Aug 11, 2025

Thanks for the review! I've squashed all the commits to preserve the analysis of test failures into the final commit 43e2c08

@mukilan mukilan enabled auto-merge August 11, 2025 09:27
@mrobinson
Copy link
Member
FC51 mrobinson commented Aug 11, 2025

@mukilan You'll also need to update the PR description so that the analysis is included in the final commit in Servo (which comes entirely from the PR). You might want to try to use wildcards to limit the size of the commit description.

@mukilan mukilan disabled auto-merge August 11, 2025 09:38
@mukilan mukilan enabled auto-merge August 11, 2025 09:48
@mukilan mukilan added this pull request to the merge queue Aug 11, 2025
@github-merge-queue github-merge-queue bot removed this pull request from the merge queue due to failed status checks Aug 11, 2025
@mukilan mukilan added this pull request to the merge queue Aug 11, 2025
Merged via the queue into servo:main with commit 4c05758 Aug 11, 2025
22 checks passed
@mukilan mukilan deleted the inline-svg-using-resvg branch August 11, 2025 12:03
@Loirooriol
Copy link
Contributor

For the sizing problems, I think it will be best to just ignore the metadata provided by usvg, and instead check the viewbox, width and height attributes manually.

Also inline SVG are special because they can have an intrinsic ratio without intrinsic sizes, and then they stretch, which will need some special handling.

abdelrahman1234567 pushed a commit to abdelrahman1234567/servo that referenced this pull request Aug 13, 2025
This patch adds support for rendering static inline SVG documents in the
DOM tree by serializing the SVGElement's subtree and leveraging the
existing resvg based SVG stack for rendering. Serialiing the subtree is
necessary as resvg's tree representation (roxmltree) is immutable, so we
can't construct the tree incrementally.

Few other design choices here:
1. The `SVGSVGElement` is now treated as a replaced element and the
   layout code is responsible for plumbing the serialized SVG source
   (encoded as a base64 data: url) into the image cache, much like how
   background images are handled.
2. The serialization is done on the script thread after an initial
   layout pass. This is necessary because the serialization code asserts
that it is invoked from script thread i.e we can't call it from layout
   workers.
3. The serialized SVG data: url is cached to avoid recomputing it on
   subsequent layouts. The cache is invalidated when the SVGSVGElement's
   subtree is mutated.

The original SVGSVGElement code was behind the `dom_svg_enabled` pref.
This patch also removes the preference and make SVG support using resvg
available unconditionally.

Below is the analysis of the new test failures:

These tests use inline SVG but used to pass by accident.
They now fail because they contain SVG with no intrinsic
sizing which is not handled by resvg in a way that would
allows us to distinguish it from the sized case. The same
limitation applies to non-inline SVG.

 - /css/CSS2/positioning/absolute-replaced-width-003a.xht
 - /css/CSS2/positioning/absolute-replaced-width-003b.xht
 - /css/CSS2/positioning/absolute-replaced-width-003c.xht

These tests employ CSS styles in the HTML that
target the elements in inline SVG, which is not currently
supported.

-
/css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg-basic.html
 - /css/compositing/mix-blend-mode/mix-blend-mode-plus-lighter-svg.html

This is a tentative test that uses the unsupported 'border-shape' CSS
property. The ref uses SVG, so it used to pass accidentally. The ref
still doesn't render correctly since it also relies on styling SVG
elements using CSS classes in the HTML (instead of inline in SVG).

 - /css/css-borders/tentative/border-shape/border-shape-stroke.html

These tests use the attribute 'clip-path=circle(...)' in the
test, but this doesn't seem to work in resvg.

 - /css/css-masking/clip-path/clip-path-borderBox-1b.html
 - /css/css-masking/clip-path/clip-path-contentBox-1b.html
 - /css/css-masking/clip-path/clip-path-contentBox-1c.html
 - /css/css-masking/clip-path/clip-path-fillBox-1b.html
 - /css/css-masking/clip-path/clip-path-marginBox-1a.html
 - /css/css-masking/clip-path/clip-path-paddingBox-1b.html
 - /css/css-masking/clip-path/clip-path-strokeBox-1b.html
 - /css/css-masking/clip-path/clip-path-strokeBox-1c.html
 - /css/css-masking/clip-path/clip-path-viewBox-1a.html
 - /css/css-masking/clip-path/clip-path-viewBox-1b.html
 - /css/css-masking/clip-path/clip-path-viewBox-1d.html
 - /css/css-masking/clip-path/svg-clip-path-circle-offset.html
 - /css/css-masking/clip-path/svg-clip-path-ellipse-offset.html

Additionally, the below two tests use a `foreignObject` SVG element
which
embeds a html div fragment. This is also not supported by resvg.

 - /css/css-masking/clip-path/clip-path-viewBox-1d.html
 - /css/css-masking/clip-path/clip-path-fillBox-1b.html

The following test fails because of apparent pixel differences
between a circle rendered purely using CSS clip-path vs a circle
rendered in SVG using resvg.

 - /css/css-masking/clip-path/clip-path-contentBox-1c.html

These tests style the inline SVG elements using CSS in the HTML or
separate stylesheet. This is not supported by this implementation.

 - /css-transforms/document-styles/svg-document-styles-{001..004}.html
 - /css-transforms/document-styles/svg-document-styles-012.html
 - /css-transforms/external-styles/svg-external-styles-{001..004}.html
 - /css-transforms/external-styles/svg-external-styles-014.html

These tests seem like they should pass, but they fail because of what
seems like an anti-aliasing issue in the rendering engine. The
transformed element has a thin outline which is causing pixel difference
with the ref:

 - /css/css-transforms/group/svg-transform-group-008.html
 - /css/css-transforms/group/svg-transform-group-009.html
 - /css/css-transforms/group/svg-transform-nested-009.html
 - /css/css-transforms/group/svg-transform-nested-013.html
 - /css/css-transforms/group/svg-transform-nested-014.html
 - /css/css-transforms/group/svg-transform-nested-018.html
 - /css/css-transforms/group/svg-transform-nested-019.html
 - /css/css-transforms/group/svg-transform-nested-008.html

The below tests fail because resvg is calculating the wrong size for the
'rect' inside the SVG. The dimensions of the SVG are established via the
CSS in the HTML, so it seems resvg is using incorrect coordinates for
the children of the svg when explict width/height are not specified in
the root svg element.

 - /css/css-transforms/group/svg-transform-group-011.html
 - /css/css-transforms/group/svg-transform-nested-021.html
 - /css/css-transforms/group/svg-transform-nested-029.html

All these tests use an SVG that doesn't have width nor height attributes
and this causes resvg to use incorrect coordinates for the SVG's
children. In addition, the following tests use the CSS syntax for
transforms inside the SVG (using style attribute) which is not supported
by resvg (it only supports the SVG 1.1 transform syntax).

 - /css/css-transforms/inline-styles/svg-inline-styles-{001..004}.html
 - /css/css-transforms/inline-styles/svg-inline-styles-012.html

In the case of these four tests, the `style` attribute specifies an
invalid transform, but resvg doesn't fallback to the transform specified
via the `transform`  attribute on the same element.

 - /css/css-transforms/inline-styles/svg-inline-styles-005.html
 - /css/css-transforms/inline-styles/svg-inline-styles-006.html
 - /css/css-transforms/inline-styles/svg-inline-styles-010.html
 - /css/css-transforms/inline-styles/svg-inline-styles-013.html

The following test fails because of the lack of width/height in SVG as
described above but it also exposes gaps in our CSS tranform
implementation.

 - /css/css-transforms/preserve3d-and-filter-with-perspective.html

These tests failure because resvg doesn't handle the SVG without
explicit width and height, but specified via CSS in the HTML. In
addition, there are pixel differences between the ref due to
antialiasing issues.

 - /css/css-transforms/matrix/svg-matrix-{005...008}.html
 - /css/css-transforms/matrix/svg-matrix-010.html
 - /css/css-transforms/matrix/svg-matrix-012.html
 - /css/css-transforms/matrix/svg-matrix-{015..069}.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-001.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-011.html
 - /css/css-transforms/rotate/svg-rotate-angle-45-022.html
 - /css/css-transforms/scale/svg-scale-006.html
 - /css/css-transforms/scale/svg-scale-007.html

These tests seem to be failing due to some sort of antialiasing issue,
where a transformed SVG element has a thin border that causes pixel
differences compared to the solid colored reference.

 - /css/css-transforms/skewX/svg-skewx-001.html
 - /css/css-transforms/skewX/svg-skewx-006.html
 - /css/css-transforms/skewX/svg-skewx-011.html
 - /css/css-transforms/skewX/svg-skewx-016.html
 - /css/css-transforms/skewX/svg-skewx-021.html
 - /css/css-transforms/skewX/svg-skewxy-001.html
 - /css/css-transforms/skewY/svg-skewy-001.html
 - /css/css-transforms/skewY/svg-skewy-006.html
 - /css/css-transforms/skewY/svg-skewy-011.html
 - /css/css-transforms/skewY/svg-skewy-016.html
 - /css/css-transforms/skewY/svg-skewy-021.html

These tests specify several SVG attributes such as transform,
vector-effect etc via CSS in the HTML (rather than inline in SVG). The
current implementation doesn't support this.

 - /css/css-transforms/transform-box/stroke-box-mutation-001.html
 - /css/css-transforms/transform-box/stroke-box-mutation-002.html
 - /css/css-transforms/transform-box/stroke-box-mutation-003.html
 - /css/css-transforms/transform-box/stroke-box-mutation-004.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-002.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-003.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-004.html
 - /css/css-transforms/transform-box/svgbox-stroke-box-005.html

These tests depend on 'transform-origin' specified on an element inside
an SVG, but this transform is influenced by the 'tranform-box' set via
CSS in the HTML itself (not the SVG). The current implementation doesn't
support styling the SVG using document styles, so these tests just fail.

- /css/css-transforms/transform-origin/svg-origin-relative-length-*.html

These tests check the fallback behaviour when invalid syntax is
encountered in the 'transform-origin' value. resvg doesn't correctly
fallback to 0,0 causing the tests to fail.

-
/css/css-transforms/transform-origin/svg-origin-relative-length-invalid-001.html
-
/css/css-transforms/transform-origin/svg-origin-relative-length-invalid-002.html
-
/css/css-transforms/transform-origin/svg-origin-relative-length-invalid-003.html
-
/css/css-transforms/transform-origin/svg-origin-relative-length-invalid-004.html

These tests use unimplemented Canvas APIs like 'beginLayer' and
the 'CanvasFilter' constructor and hence fail at runtime.

-
/html/canvas/element/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
-
/html/canvas/element/filters/2d.filter.layers.gaussianBlur.tentative.html
-
/html/canvas/element/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
-
/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
-
/html/canvas/element/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
-
/html/canvas/element/layers/2d.layer.anisotropic-blur.x-only.tentative.html
-
/html/canvas/element/layers/2d.layer.anisotropic-blur.y-only.tentative.html
-
/html/canvas/element/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
 - /html/canvas/element/layers/2d.layer.css-filters.blur.tentative.html
- /html/canvas/element/layers/2d.layer.css-filters.shadow.tentative.html
 - /html/canvas/element/layers/2d.layer.ctm.layer-filter.tentative.html
-
/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.dropShadow.tentative.html
-
/html/canvas/offscreen/filters/2d.filter.canvasFilterObject.gaussianBlur.tentative.html
-
/html/canvas/offscreen/filters/2d.filter.layers.dropShadow.tentative.html
-
/html/canvas/offscreen/filters/2d.filter.layers.gaussianBlur.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.isotropic.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-x.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.mostly-y.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.x-only.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.anisotropic-blur.y-only.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.css-filters.blur-and-shadow.tentative.html
- /html/canvas/offscreen/layers/2d.layer.css-filters.blur.tentative.html
-
/html/canvas/offscreen/layers/2d.layer.css-filters.shadow.tentative.html
- /html/canvas/offscreen/layers/2d.layer.ctm.layer-filter.tentative.html

These tests fail because resvg doesn't seem to honour the 'translate'
CSS property specified on an SVG element using an inline 'st
C1E1
yle'
attribute.

 - /css/css-transforms/translate/svg-translate-with-units.html
-
/css/css-transforms/translate/translate-and-transform-attribute-in-svg.html
-
/css/css-transforms/translate/translate-and-transform-css-property-in-svg.html
 - /css/css-transforms/translate/translate-in-svg.html

These tests seem to fail due to the filter effect implementation in
resvg either not being complete or spec compliant.

 - /css/filter-effects/feconvolve-divisor.html
 - /css/filter-effects/feconvolve-region-001.html
 - /css/filter-effects/feconvolve-region-002.html
 - /css/filter-effects/filter-subregion-01.html
 - /css/filter-effects/svg-feimage-002.html
 - /css/filter-effects/svg-feimage-003.html
 - /css/filter-effects/svg-feimage-004.html
 - /css/filter-effects/svg-feoffset-001.html

The test /css/filter-effects/svg-feimage-004.html should ideally PASS
but currently fails because we don't propagate height/width set using
CSS in HTML element to the root SVG, so resvg uses the wrong dimensions
when rendering the children of the SVG.

These failures are due to deficienies in our current implementation
i.e we don't support styling SVG elements using CSS in HTML.

-
/css/css-transforms/gradientTransform/svg-gradientTransform-combination-001.html
 - /css/selectors/sharing-in-svg-use.html

The below test fails as our current implementation relies on resvg to
tell us the intrinsic ratio of the SVG, but this doesn't always work
correctly.

 - /css/css-sizing/svg-intrinsic-size-005.html

This failure is due to lack of proper fallback to no-op transform in
resvg when the `rotate()` syntax is specified with an invalid list e.g
`rotate(90,)`.

 - /css/css-transforms/rotate/svg-rotate-3args-invalid-002.html

This test only passes in CI and based on the raw log output, it seems
that no text inside the SVG is rendered in the CI. This could be an font
stack related issue.

 - /css/css-display/display-contents-svg-elements.html

This test asserts that the CSP blocks loads triggered using `use`
elements in SVG. It used to TIMEOUT as without inline SVG support, no
CSP violation event was triggered. It fails now since the event is now
triggered for the load of the SVG itself (our current implementation
loads inline SVGs as serialized base64 data: urls). This doesn't match
the blocked URL in the use element though.

 - /content-security-policy/img-src/svg-use-blocked.tentative.html

Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>

Signed-off-by: Mukilan Thiyagarajan <mukilan@igalia.com>
@MichaelMcDonnell
Copy link
Contributor

Thank you everyone involved! Google.com now looks so much better! 😃

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants
0