- From: Boris Zbarsky <bzbarsky@mit.edu>
- Date: Mon, 01 May 2006 01:40:26 -0500
- To: "Web APIs WG (public)" <public-webapi@w3.org>
OK, so I'd like to summarize where we seem to stand on progress events:
I propose we define a WebAPIProgressEvent interface as follows:
interface WebAPIProgressEvent : events::Event {
readonly attribute unsigned long long currentProgress;
readonly attribute unsigned long long maxProgress;
};
Here "unsigned long long" is some type that can reasonably represent 64-bit
integers. In Mozilla's XPIDL this would actually be "unsigned long long", but
I'm not sure what, if anything, it would be in the IDL being used for the spec;
help would be appreciated here. The names of the properties are just straw-man
proposals; my only concern is that they NOT have the same names as either
LSProgressEvent [1] or SVG's ProgressEvent [2], since the types are not really
compatible with the other interfaces. Basically, I want to be able to implement
both WebAPIProgressEvent and LSProgressEvent on the same object, and they have
different behavior when the numbers get large. The name of the interface is
also a straw-man, of course. I welcome naming suggestions. Both properties are
measured in bytes.
I'm happy to either add a boolean indicating whether the maxProgress number
makes sense (a la SVG's ProgressEvent), or to define maxProgress to be 0, or
0xFFFFFFFFFFFFFFFF or whatever for cases when the total size is not known.
Note that I'm not happy with the proposal to just report a fraction-of-total
number. Far too often, this would make it impossible to report anything at all,
whereas with two separate properties things can work ok if there is out-of-band
size information.
With this interface in hand, I propose the following text; the parts in square
brackets are my comments about remaining issues, etc:
--------------------------------------------------------------------------
Listeners registered for the "progress" event on the XMLHttpRequest object may
receive events implementing the WebAPIProgressEvent interface as data is
returned from the server. The events received, if any, must satisfy the
following constraints:
1) The currentProgress property values must be nondecreasing. [There's the
question of how this should interact with multipart responses; right now in
Gecko multiple parts of a multipart response would just continue to increment
the currentProgress to indicate the progress made on the overall multipart data,
while the readyState would cycle 2 -> 3 -> 4 for every part; that behavior is
consistent with everything I say below, though we may need to filter progress
notifications out during the 2 and 4 stages in Gecko to be fully compliant with
my proposal.]
2) For HTTP, the currentProgress and maxProgress property values correspond to
the data before any content-encoding or transfer-encoding conversions are
applied by the UA [because for something like streaming gzip decompression it's
not possible to know the total data size up front, so reporting the number of
compressed bytes processed out of the total number of bytes seems like a better
bet than reporting the decompressed number out of an unknown total]. Other
protocols may have similar situations.
3) The events must fire while readyState has the value 3.
4) The events must not bubble and must not be cancelable.
5) [Maybe] A progress event indicating all progress to date must be dispatched
before readyState changes value from 3.
While the progress events must generally track changes to responseText, it is
not defined whether new text is added to responseText before or after the
corresponding progress event fires. Since responseText represents data after
content-encoding has been undone while the progress numbers refer to
still-encoded data, there is no correlation between the actual value of
responseText.length and the properties of any given progress event.
Apart from condition (5) above, this specification does not mandate any
particular frequency of firing for progress events.
Listeners registered for the "uploadprogress" event on the XMLHttpRequest object
may receive events implementing the WebAPIProgressEvent interface as data is
sent to the server. The events received, if any, must satisfy the following
constraints:
1) The currentProgress property values must be nondecreasing.
2) The maxProgress property must represent the total size of the request being
sent to the server [note that this should always be known by the client for
HTTP, since it has to send a Content-Length. I'm not sure whether we should
require this for other protocols...].
3) The events must fire while readyState has the value 2.
4) The events must not bubble and must not be cancelable
5) [Maybe] An uploadprogress event indicating all progress to date must be
dispatched before readyState changes value from 2.
Apart from condition (5) above, this specification does not mandate any
particular frequency of firing for upload progress events.
--------------------------------------------------------------------------------
Thoughts?
-Boris
[1]
http://www.w3.org/TR/2004/REC-DOM-Level-3-LS-20040407/load-save.html#LS-LSProgressEvent
[2] http://www.w3.org/TR/SVGMobile12/svgudom.html#events::ProgressEvent
Received on Monday, 1 May 2006 06:40:36 UTC