| Summary: | [SVG2] Allow leading and trailing whitespace in svg attributes using <integer>, <angle>, <number>, <length> and <percentage> | ||
|---|---|---|---|
| Product: | WebKit | Reporter: | Ahmad Saleem <ahmad.saleem792> |
| Component: | SVG | Assignee: | Karl Dubost <karlcow> |
| Status: | NEW --- | ||
| Severity: | Normal | CC: | cdumez, heycam, karlcow, rbuis, sabouhallawa, simon.fraser, webkit-bug-importer, zimmermann |
| Priority: | P2 | Keywords: | BrowserCompat, InRadar |
| Version: | WebKit Nightly Build | ||
| Hardware: | Unspecified | ||
| OS: | Unspecified | ||
| See Also: | https://bugs.webkit.org/show_bug.cgi?id=267873 | ||
| Bug Depends on: | 267560 | ||
| Bug Blocks: | |||
|
Description
Ahmad Saleem
2023-09-17 12:39:28 PDT
The test:
data:text/html,<svg id="testcontainer"><defs><marker></marker><stop></stop><filter><feTurbulence></feTurbulence></filter></defs></svg>
document.getElementsByTagName('stop')[0].setAttribute('offset', '-47a')
Then they try to
document.getElementsByTagName('stop')[0].getAttribute('offset')
which returns '-47a' in all browsers.
Where it differs is when requesting:
document.getElementsByTagName('stop')[0].offset.baseVal
it returns
-47 in Safari
0 in Firefox
0 in Chrome
It seems Safari is normalizing the value by ignoring the trailing garbage.
While the others are saying bad values let's reset it.
In fact
document.getElementsByTagName('stop')[0].offset returns on Safari.
{animVal: -47, baseVal: -47}
https://svgwg.org/svg2-draft/pservers.html#GradientStopAttributes
the initial value is indeed 0.
The values
<number>
A number usually ranging from 0 to 1.
<percentage>
A percentage usually ranging from 0% to 100%.
I don't remember where are the processing rules for the invalid values in CSS.
But baseVal and animVal are defined in
https://svgwg.org/svg2-draft/types.html#__svg__SVGAnimatedString__baseVal
Related(?) to https://searchfox.org/wubkat/rev/f997a9edb80cd79caeb1d0a1b87610ffd7a56e88/Source/WebCore/svg/SVGStopElement.cpp#53-63 It converts to float but doesn't to check if the input value if the value looks like a float before converting it to a float. The patch from Chromium contains a parseNumber https://src.chromium.org/viewvc/blink/trunk/Source/core/svg/SVGParserUtilities.cpp?annotate=175785&pathrev=175785#l230 I wonder if it exists in WebKit? So Chris Dumez helped me understand better
WTF_EXPORT_PRIVATE float toFloat(bool* ok = nullptr) const;
So we could do something like
bool success = false;
float result = attribute.toFloat(&success);
if (success)
// use result.
else
// ...
Ahmad, I think I have a patch for this. It needs a bit more work but It's passing a lot more tests. OK My patch gets all green for Test Case (svg/parser/whitespace-number.html) - https://jsfiddle.net/34nqh1uy/show Now let's see the other. :) Test Case (svg/parser/whitespace-length.html) - https://jsfiddle.net/34nqh1uy/1/show |