- From: Glenn Maynard <glenn@zewt.org>
- Date: Fri, 1 Mar 2013 09:48:15 -0600
- To: "Kang-Hao (Kenny) Lu" <kanghaol@oupeng.com>
- Cc: WHAT Working Group <whatwg@whatwg.org>, 王铁套 <wang.tietao@outlook.com>
On Fri, Mar 1, 2013 at 7:49 AM, Kang-Hao (Kenny) Lu <kanghaol@oupeng.com>wrote: > The spec currently says > > # 1. If the image argument is an HTMLImageElement object that is not > # fully decodable, or if the image argument is an HTMLVideoElement > # object whose readyState attribute is either HAVE_NOTHING or > # HAVE_METADATA, then return bad and abort these steps. > > An <img> without @src isn't fully decodable by definition and therefore > no exception should be thrown. > > However, I worry that WebKit would not be willing to change this to to > reflect the spec as I think this behavior has been existing for a long > time (correct me if I am wrong here). Firefox has a bug for this[1] but > I can't find one in WebKit yet. > To be specific, testing WebKit (in Chrome 24) and Firefox 19 ( https://zewt.org/~glenn/test-drawimage-exception.html): - In Chrome, drawImage(img, dx, dy) before the image is downloaded does nothing. - In Chrome, drawImage(img, dx, dy, dw, dh) before the image is downloaded does nothing. - In Chrome, drawImage(img, dx, dy) after the image fails to download does nothing. - In Chrome, drawImage(img, dx, dy, dw, dh) after the image fails to download throws an exception. - In Firefox, drawImage(img, dx, dy) before the image is downloaded does nothing. - In Firefox, drawImage(img, dx, dy, dw, dh) before the image is downloaded does nothing. - In Firefox, drawImage(img, dx, dy) after the image fails to download throws an exception. - In Firefox, drawImage(img, dx, dy, dw, dh) after the image fails to download throws an exception. IE9 matches Firefox. It looks like the pattern is to not throw an exception for drawing before the image finishes loading, but to throw an exception if the image fetch did complete, but failed. Chrome in the 3rd case above seems like the exception. I imagine one of the Chrome cases is a bug, since it doesn't make sense that the three-argument and five-argument versions have different behavior. (I really hope that's just a bug, and not weird web-compat.) I think the spec should also reflect what browsers are converging on: throw an exception if the image is in the "broken" state, but not in "unavailable" or "partially available". # Moreover, Opera has lazy loading of images (only loading images > # that are rendered or have some event handlers or were created with > # new Image() etc), so we'd probably want to just load the image when > # the script tries to draw it instead of throwing. > By then it's too late to load the image in time to draw it, since drawImage needs to be able to be completed synchronously. Also, even if you happen to be able to safely get the image synchronously (eg. if it's in memory cache or something), the draw is would still be required to not happen, since img.complete was false. -- Glenn Maynard
Received on Friday, 1 March 2013 15:48:45 UTC