throw or not when sw or sh is zero in drawImage(img, 0, 0, sw, wh, ...) (WHATWG r7589)

There is a discrepancy between the W3C spec and the WHATWG spec in
handing this case

  ctx.drawImage(img, 0, 0, sw, wh, ...)

where one of sw and sh is zero. The relevant proses are

  # If one of the sw or sh arguments is zero, the implementation must
  # throw an IndexSizeError exception.

of W3C and

  # 3. If one of the sw or sh arguments is zero, abort these steps.
  # Nothing is painted.

of WHATWG. The change happened at WHATWG r7589[1], which unfortunately
was around the time when the W3C version transitioned to CR. The
relevant case is 2d.drawImage.zerosource.html, which is again quite
unfortunately, approved.


Our team unfortunately falls into the dilemma as which to follow, and,
you know, it's very difficult to explain why there's a difference
between the two specs, the W3C process and such. So... I guess my
question is why isn't r7589 applied to W3C Canvas Level2 when it's
applied in HTML5.1[2] and what's the process here? (That is, if the
changed in at least applied in Level2, we can be more convinced that
it's the way to go.)


== Technical Arguments ==

Not sure if this helps the process but here are the reasons why not
throwing is better:

1. It's just the better behavior

It's not at all clear to me why the spec asked UA to throw at the
beginning. There are many situations where it's very natural to have
either sw or sh be zero here. For example, a straightforward
implementation of the background of a side-scrolling game would divide
the background image into two and one of which, at times, would have a
sw of zero.

If the error here is to help Web developers spot logical flaws in the
game then I think it makes more sense to make drawImage throw only when
sw is zero *but dw is not*.


2. Compatibility

Currently only WebKit implements the WHATWG behavior (not throwing).
However, it seems very likely that this part of the Web (the WebKit Web
:( ) is already depending on drawImage not throwing. Google
"IndexSizeError" gives [3][4][5], and I bet there are much more. Also,
it is known that getting the Android WebView to change is hard, and
therefore not throwing seems like the way to converge.


Anyway, the baseline is that we shouldn't have a difference between the
two specs.


== Rant ==

Having discrepancy in these two versions of the spec is no fun. Really.


[1] http://html5.org/tools/web-apps-tracker?from=7588&to=7589
[2] http://lists.w3.org/Archives/Public/public-html/2013Jan/0022
[3] https://github.com/Animatron/player/pull/70
[4] https://github.com/aduros/flambe/issues/55
[5] http://groups.google.com/group/melonjs/msg/571b36150fd2760b


Cheers,
Kenny
-- 
Web Specialist, Opera Sphinx Game Force, Oupeng Browser, Beijing
Try Oupeng: http://www.oupeng.com/

Received on Thursday, 21 March 2013 08:29:04 UTC