[whatwg] ProgressEvents for Images

Ian Hickson ian at hixie.ch
Thu Jan 3 16:49:46 PST 2013


On Thu, 12 Jan 2012, Hans Muller wrote:
>
> A group of us at Adobe has been looking into adding support for 
> ProgressEvents to images.  The overall goal is to simplify image 
> download progress reporting by supporting roughly the same progress 
> events as XHR and the File API for image elements.  For example one 
> could connect an image to a progress element like this:
> 
> <img id="image" src="sample.jpg"
>     onloadstart="showProgressBar()"
>     onprogress="updateProgressBar(event)"
>     onloadend="hideProgressBar()"/>
> 
> Developers have taken various tacks to enable progress reporting, for 
> example in some cases XHR can be used to download image files.  Max 
> Vujovic just published a blog about the practicalities of doing so: 
> http://blogs.adobe.com/openweb/2012/01/13/html5-image-progress-events/.  
> We think it would be preferable to provide support for image progress 
> events directly.
> 
> We're working on a prototype implementation for WebKit and have filed a 
> bug that explains what we're up to in a little more detail: 
> https://bugs.webkit.org/show_bug.cgi?id=76102).
> 
> It's probably worth pointing out that the beforeload event, which is 
> currently under discussion, addresses a different use case.  Our 
> proposal is intended to enable applications to give the user feedback 
> about image download progress, it's not intended to enable security or 
> efficiency by preemptively blocking or transforming image downloads.

I've added progress events (loadstart, progress, and loadend) to <img> 
processing.


On Mon, 23 Jan 2012, Jonas Sicking wrote:
> 
> For cross-site images this would leak the compressed size in bytes of 
> the loaded image (except when the crossorigin attribute is set). This 
> would very unfortunately in many cases leak sensitive information.
> 
> But if we restrict these events to only fire for same-origin loads, as 
> well as loads where the crossorigin attribute is in effect, then this 
> sounds like an awesome idea.

I've restricted the events in this way. ('loadstart' always fires; 
'progress' only fires if it's CORS-same-origin, and 'load', 'error', and 
'loadend' fire as simple rather than progress events if it's not 
CORS-same-origin).


On Mon, 23 Jan 2012, Hans Muller wrote:
> 
> A normalized image ProgressEvent would still reveal a little bit about 
> the server, even dispatching ProgressEvents with lengthComputable=false 
> would do so.  As you pointed out, we could avoid this issue altogether 
> by not dispatching progress events at all in the unauthorized cross-site 
> case, although doing so diminishes the utility of dispatching the 
> events.

If you want the events, just use CORS.


On Thu, 23 Feb 2012, Hans Muller wrote:
>
> Ian Hickson and I have been debating the merits of adding support for 
> the loadend event to images on 
> https://bugs.webkit.org/show_bug.cgi?id=76102. Dirk Schulze requested 
> that the discussion be relocated here, since it's about a feature and 
> not the details of an implementation change.
> 
> Here's a recap, if you don't want to wade through the bug comments:
> 
>   Hans - You're saying that the [image] loadend event is useless?
> 
>   Ian - Yes.  It only saves typing a few characters, img.onloadend =
> function () { }; vs:  img.onload = img.onerror = function () { };
> 
>   Hans - It's useful if you want your listener to run after all of the
> load listeners have run, and code that you haven't written adds its own
> load listeners.
> 
>   Ian - That seems like a rather obscure edge case, and you can work
> around it using setTimeout() (in the load/error event handler) anyway.
> 
> Before carrying on, I should point out that the proposal to add 
> loadstart, progress, and loadend events to Image was modeled on XHR and 
> based on the ProgressEvent spec http:// www.w3.org/TR/progress-events/. 

Note that progress events are now specced in http://xhr.spec.whatwg.org/.

 
> It may be that supporting the complete set of ProgressEvents for images 
> doesn't add enough utility to be warranted.  We proposed supporting all 
> of the ProgressEvents (even loadend) for the sake of consistency.  And 
> we're aware of the CORS issues.

I did add them all for consistency (well, almost all, I didn't add 
'stalled' and 'timeout'), but loadend is still basically useless. :-)


On Fri, 24 Feb 2012, Glenn Maynard wrote:
>
> It seems odd that loadend is considered useful enough to be recommended 
> by Progress Events, but not useful enough to be used here.

I don't think it's useful in other uses of Progress Events either.


> As an aside, it's odd that if images are unsupported or disabled, no 
> event is fired at all ("update the image data", step 4).  That means 
> that if you do this:
> 
> var url = URL.createObjectURL(blob);
> img.src = url;
> img.onload = img.onerror = function(e) { URL.revokeObjectURL(url); }
> 
> the blob will leak a reference if images are disabled.  This seems like 
> a very easy mistake to make, with no clean workaround...

It'd be pretty sad to use up all that bandwidth for no reason...

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'


More information about the whatwg mailing list