Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: d9714228c9f87cd777e4106916ee38087b9e0e49
      
https://github.com/WebKit/WebKit/commit/d9714228c9f87cd777e4106916ee38087b9e0e49
  Author: Karl Dubost <[email protected]>
  Date:   2026-09-13 (Sun, 13 Sep 2026)

  Changed paths:
    M LayoutTests/TestExpectations
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks-expected.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks-ref.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl-expected.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl-ref.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-expected.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-ref.svg
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero.svg
    M 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/w3c-import.log
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-dynamic-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-dynamic.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-idl-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-idl.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-moveto-only-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-moveto-only.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-positions-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-positions.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-smil.tentative-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-smil.tentative.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-startoffset-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-startoffset.html
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-pathlength-zero-startoffset-expected.txt
    A 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-pathlength-zero-startoffset.html
    M 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/w3c-import.log
    M Source/WebCore/rendering/svg/RenderSVGTextPath.cpp
    M Source/WebCore/rendering/svg/RenderSVGTextPath.h
    M Source/WebCore/rendering/svg/SVGTextLayoutEngine.cpp
    M Source/WebCore/rendering/svg/SVGTextLayoutEngine.h
    M Source/WebCore/svg/SVGTextPathElement.cpp
    M Source/WebCore/svg/SVGTextPathElement.h

  Log Message:
  -----------
  [SVG2] Implement the path attribute on <textPath>
https://bugs.webkit.org/show_bug.cgi?id=322537
rdar://185831618

Reviewed by Nikolas Zimmermann.

SVG 2 lets a <textPath> carry its own path data instead of pointing at a
<path> element with href. Chrome, Edge and Firefox all support it.
Safari ignored the attribute and used href instead, or rendered nothing
when there was no href to fall back to.

Fix by registering path as an SVGAnimatedPath property, the way <path>
registers its own d. Registering is also what lets SMIL reach it, which
Chrome and Firefox both do.

Two things the href route does that the inline one must not: inline data
is already in the user space of the <text> element, so it takes no
supplemental transform, and a pathLength on an overridden href has no
author-declared length to measure startOffset against.

Twenty-one tests. One is tentative because no rule in SVG 2 reaches the
animation the other engines perform, filed as svgwg#1174. Three upstream
files now pass, so their TestExpectations lines go away.

Four of them cover pathLength="0" on a referenced path, which nothing
covered before. Measured in all three engines; what each one pins down,
and where it is expected to fail, is noted against the file below.

This will be exported to WPT.

Tests: 
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks-ref.html
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks.html
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl-ref.html
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl.html
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-expected.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-ref.svg
       
imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero.svg
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-dynamic.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-idl.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-moveto-only.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-positions.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-smil.tentative.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-startoffset.html
       
imported/w3c/web-platform-tests/svg/text/scripted/textpath-pathlength-zero-startoffset.html

* LayoutTests/TestExpectations:
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-ancestor-transform.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks-expected.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks-ref.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-combining-marks.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-dangling-href.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-multiple-subpaths.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-pathlength-ignored.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl-expected.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl-ref.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-rtl.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-side-right.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-truncated-coordinate.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-two-textpaths.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-user-space.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-path-attr-whitespace-fallback.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-percentage.svg:
 Added.
pathLength has no effect on a percentage startOffset, so 50% still lands
halfway. Chrome and Firefox both put it at the path start instead, so
this one is expected to fail there.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-positive.svg:
 Added.
A positive startOffset becomes +Infinity, so every glyph falls beyond
the end and nothing is drawn. Carries a second text on a plain path that
must draw, so a document rendering nothing at all cannot match the
reference by accident. Chrome draws about one glyph at the origin, so
this one is expected to fail there.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-expected.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero-ref.svg:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/textpath-pathlength-zero-offset-zero.svg:
 Added.
A declared zero scales by infinity, but zero scaled infinitely stays
zero, so the text sits at the path start. Green in all three engines,
which makes it the regression test: it covers the guard that keeps zero
times infinity from becoming a NaN.
* LayoutTests/imported/w3c/web-platform-tests/svg/text/reftests/w3c-import.log:
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-dynamic-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-dynamic.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-idl-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-idl.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-moveto-only-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-moveto-only.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-positions-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-positions.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-smil.tentative-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-smil.tentative.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-startoffset-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-path-attr-startoffset.html:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-pathlength-zero-startoffset-expected.txt:
 Added.
* 
LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/textpath-pathlength-zero-startoffset.html:
 Added.
The same positions read through getStartPositionOfChar instead of
pixels: font independent, and a failure reports where the text went
rather than only that two images differ.
* LayoutTests/imported/w3c/web-platform-tests/svg/text/scripted/w3c-import.log:
* Source/WebCore/rendering/svg/RenderSVGTextPath.cpp:
(WebCore::RenderSVGTextPath::usesPathAttribute const):
(WebCore::RenderSVGTextPath::layoutPath const):
* Source/WebCore/rendering/svg/RenderSVGTextPath.h:
* Source/WebCore/rendering/svg/SVGTextLayoutEngine.cpp:
(WebCore::SVGTextLayoutEngine::computeTextPathStartOffset const):
(WebCore::SVGTextLayoutEngine::beginTextPathLayout):
* Source/WebCore/rendering/svg/SVGTextLayoutEngine.h:
* Source/WebCore/svg/SVGTextPathElement.cpp:
(WebCore::SVGTextPathElement::SVGTextPathElement):
(WebCore::SVGTextPathElement::attributeChanged):
(WebCore::SVGTextPathElement::byteStreamForPathAttribute const):
(WebCore::SVGTextPathElement::pathForPathAttribute const):
* Source/WebCore/svg/SVGTextPathElement.h:

Canonical link: https://commits.webkit.org/321038@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to