From 350f9b61992b4b0728997d5fe0aec4d9a3a5eae5 Mon Sep 17 00:00:00 2001 From: Robert Longson Date: Sat, 4 Feb 2023 17:46:57 +0000 Subject: [PATCH] Bug 1815061 - Fix handling of startOffset and stroke-dasharray when the pathLength attribute is zero r=emilio See https://github.com/w3c/svgwg/issues/81 Differential Revision: https://phabricator.services.mozilla.com/D168899 --- dom/svg/SVGContentUtils.cpp | 2 +- dom/svg/SVGGeometryElement.cpp | 2 +- layout/svg/SVGTextFrame.cpp | 8 +++++++- .../svg/path/distance/pathLength-zero-percentage.svg.ini | 3 --- .../meta/svg/path/distance/pathLength-zero.svg.ini | 3 --- .../meta/svg/path/distance/pathlength-path-zero.svg.ini | 2 -- 6 files changed, 9 insertions(+), 11 deletions(-) delete mode 100644 testing/web-platform/meta/svg/path/distance/pathLength-zero-percentage.svg.ini delete mode 100644 testing/web-platform/meta/svg/path/distance/pathLength-zero.svg.ini delete mode 100644 testing/web-platform/meta/svg/path/distance/pathlength-path-zero.svg.ini diff --git a/dom/svg/SVGContentUtils.cpp b/dom/svg/SVGContentUtils.cpp index a12af123ca4d..94581b6a2aba 100644 --- a/dom/svg/SVGContentUtils.cpp +++ b/dom/svg/SVGContentUtils.cpp @@ -184,7 +184,7 @@ static DashState GetStrokeDashData( pathScale = static_cast(aElement)->GetPathLengthScale( SVGGeometryElement::eForStroking); - if (pathScale <= 0) { + if (pathScale <= 0 || !IsFinite(pathScale)) { return eContinuousStroke; } } diff --git a/dom/svg/SVGGeometryElement.cpp b/dom/svg/SVGGeometryElement.cpp index c3fb19cd672c..70fd37f1ca2f 100644 --- a/dom/svg/SVGGeometryElement.cpp +++ b/dom/svg/SVGGeometryElement.cpp @@ -253,7 +253,7 @@ float SVGGeometryElement::GetPathLengthScale(PathLengthScaleForType aFor) { MOZ_ASSERT(aFor == eForTextPath || aFor == eForStroking, "Unknown enum"); if (mPathLength.IsExplicitlySet()) { float authorsPathLengthEstimate = mPathLength.GetAnimValue(); - if (authorsPathLengthEstimate > 0) { + if (authorsPathLengthEstimate >= 0) { RefPtr path = GetOrBuildPathForMeasuring(); if (!path) { // The path is empty or invalid so its length must be zero and diff --git a/layout/svg/SVGTextFrame.cpp b/layout/svg/SVGTextFrame.cpp index 12b49407e598..cbbf8689d3be 100644 --- a/layout/svg/SVGTextFrame.cpp +++ b/layout/svg/SVGTextFrame.cpp @@ -4605,12 +4605,18 @@ gfxFloat SVGTextFrame::GetStartOffset(nsIFrame* aTextPathFrame) { &tp->mLengthAttributes[SVGTextPathElement::STARTOFFSET]; if (length->IsPercentage()) { + if (!IsFinite(GetOffsetScale(aTextPathFrame))) { + // Either pathLength="0" for this path or the path has 0 length. + return 0.0; + } RefPtr data = GetTextPath(aTextPathFrame); return data ? length->GetAnimValInSpecifiedUnits() * data->ComputeLength() / 100.0 : 0.0; } - return length->GetAnimValue(tp) * GetOffsetScale(aTextPathFrame); + float lengthValue = length->GetAnimValue(tp); + // If offsetScale is infinity we want to return 0 not NaN + return lengthValue == 0 ? 0.0 : lengthValue * GetOffsetScale(aTextPathFrame); } void SVGTextFrame::DoTextPathLayout() { diff --git a/testing/web-platform/meta/svg/path/distance/pathLength-zero-percentage.svg.ini b/testing/web-platform/meta/svg/path/distance/pathLength-zero-percentage.svg.ini deleted file mode 100644 index e381dc03ae03..000000000000 --- a/testing/web-platform/meta/svg/path/distance/pathLength-zero-percentage.svg.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pathLength-zero-percentage.svg] - expected: - FAIL diff --git a/testing/web-platform/meta/svg/path/distance/pathLength-zero.svg.ini b/testing/web-platform/meta/svg/path/distance/pathLength-zero.svg.ini deleted file mode 100644 index e17103e36411..000000000000 --- a/testing/web-platform/meta/svg/path/distance/pathLength-zero.svg.ini +++ /dev/null @@ -1,3 +0,0 @@ -[pathLength-zero.svg] - expected: - FAIL diff --git a/testing/web-platform/meta/svg/path/distance/pathlength-path-zero.svg.ini b/testing/web-platform/meta/svg/path/distance/pathlength-path-zero.svg.ini deleted file mode 100644 index f488c8e42160..000000000000 --- a/testing/web-platform/meta/svg/path/distance/pathlength-path-zero.svg.ini +++ /dev/null @@ -1,2 +0,0 @@ -[pathlength-path-zero.svg] - expected: FAIL