[Bug 28148] Improve parsing of numbers for coords attribute

https://www.w3.org/Bugs/Public/show_bug.cgi?id=28148

--- Comment #9 from Simon Pieters <simonp@opera.com> ---
Blink's coords parsing is at
https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/platform/Length.cpp&sq=package:chromium&type=cs&l=71&rcl=1452688339

it seems to replace all characters other than [0-9\.-] with space and then
split on spaces, e.g. coords="0x0x,x,10 10" is parsed the same as
coords="0,0,10,10".

Gecko's coords parsing is described in
https://lists.w3.org/Archives/Public/public-html/2009Jan/0086.html . Jonas
notes that they have some bugs filed e.g. for not ignoring a leading comma.

In webdevdata I find some interesting cases but in particular this from
babyneo.de:

<map name='header1'>
  <area shape="rect" alt="Zur Startseite" coords="='69,8,153,86' "
href="http://www.babyneo.de/" title="Zur Startseite" >
  <area shape="rect" alt="Zur Startseite" coords="='5,85,223,140' "
href="http://www.babyneo.de/" title="Zur Startseite" >
  <area shape="rect" alt="Warenkorb anzeigen" coords="='824,49,950,74'  "
href="http://www.babyneo.de/shopping_cart.php" title="Warenkorb anzeigen" >
</map>

In Gecko the first value of each get parsed into 0, but IE/Blink/WebKit/Presto
parse into the given number ignoring the leading garbage, which appears to more
closely match what was intended.

I didn't see any using ; in coords. But some with consecutive commas or
leading/trailing garbage.

I implemented the spec's algorithm in JS and wrote a new different
implementation [1], and compared the output of real-world coords values [2],
and checked the result against the some of the actual pages to see what would
be an improvement in terms of web compat. I believe it's somewhat of a mix of
what all browsers do give the best results, and I ended up with the following:

function newCoords(input) {
  var numbers = [];
  // split
  var tokens = input.split(/[\s,]+/);
  // for each token in tokens
  for (var i = 0; i < tokens.length; ++i) {
    var token = tokens[i];
    // replace garbage with spaces
    token = token.replace(/[^\d\.-]/g, ' ');
    // parse as float; add to numbers
    numbers.push(parseFloat(token, 10) || 0);
  }
  // return numbers
  return numbers;
}

[1] https://gist.github.com/zcorpan/baa697e081a3e1aa5da0
[2] https://gist.github.com/zcorpan/37050c2b556c5d0b5b88

-- 
You are receiving this mail because:
You are the QA Contact for the bug.

Received on Wednesday, 13 January 2016 22:58:32 UTC