W3C

Progress events 1.0

Editor's Draft 5 March 2009

This version:
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.30
Latest Editor's version:
http://dev.w3.org/2006/webapi/progress/Progress.html
Previous version:
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.29
Editor:
Charles McCathieNevile, Opera Software

Abstract

This document describes event types that can be used for monitoring the progress of an operation taking place. It is primarily intended for contexts such as data transfer operations specified by XMLHttpRequest [XHR], or Media Access Events [MAE].


Status of this Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This document is an editor's draft specification of the ProgressEvent events from the Web API group, part of the Rich Web Client Activity. It defines events which can be used to monitor a process and provide feedback to a user, particularly for network-based events. This editor's draft does not imply any consensus of or endorsement by any member of the working group, and may contain minor or major errors.

This version is published following comments on the last formal draft in October 2008, and subsequent Editor's drafts. All comments are welcome and should be sent to the new Working Group list at public-webapps@w3.org with the marker [progress] in the subject line. All messages received at this address are viewable in a public archive (Please note that a different list was used until mid 2008, so some old messages are archived there instead). If no new issues are raised by review of this draft, the specification will be published as a Last Call Working draft. At the time of publication the editor believes that issue-79 has been resolved, and that there are no other known substantive issues.

This document was produced by a group operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

Table of Contents

1. Conformance

The terms must, should, may, must not, should not, are used in this document in accordance with [RFC2119]. A conformant implementation of this specification meets all relevant requirements identified by the use of these terms.

All sections of this document are normative, except examples, which are informative, and any section that begins with a statement identifying it as informative.

There are three classes of conformance to this specification:

Specification
A specification may describe how progress events can be dispatched for some operation. A conformant specification is one which includes all the requirements identified in the section Referring to progress events from other specifications, and implements all requirements explicitly stated for specifications in normative sections of this specification. A conforming specification should also implement all recommendations made for specifications.
User agent
A user agent must implement all the requirements described for user agents throughout this specification in order to be a conforming user agent. A conforming user agent should implement all the recommendations for user agents as well.
User Agents must listen for and fire events as required by content they processes, even if that content is non-conforming.
Content
Conforming content must generate and consume progress events in accordance with the definitions of those events in this specification, and in accordance with any additional conformance requirements defined by a specification which describes an operation that can lead to progress events being dispatched.
(Note that content which meets the requirements of a specification which is not conformant to this specification may still be conforming content as defined for this specification).

2. The ProgressEvent events

2.1 Event definitions

The following events are defined in this specification:

Name Description How often? When?
loadstart The operation has begun once Must be dispatched first
progress The operation is in progress zero or more May be dispatched zero or more times after a loadstart event, before any error, abort or load event is dispatched
stalled The operation has temporarily stopped proceeding zero or more May be dispatched zero or more times after a loadstart event, before any error, abort or load event is dispatched
suspend The operation has been temporarily halted by the user agent (e.g. as the result of a user action) zero or more May be dispatched zero or more times after a loadstart event, before any error, abort or load event is dispatched
error The operation failed to complete, e.g. as a result of a network error never or once Exactly one of these must be dispatched
abort The operation was cancelled, e.g. as a result of user interaction never or once
load The operation successfuly completed never or once
loadend The operation has finished once This must be fired after the operation has completed (i.e. following error, abort or load events)

User agents must ensure that these events trigger event listeners attached on Element nodes for the relevant event and on the capture and target phases.

No default action is defined in this specification for these events. Specifications may define default actions. Specifications should define whether events bubble or are cancelable. User Agents must implement the events as defined by any such specification.

For a Specification which has not defined whether these events bubble or are cancelable, User agents must implement these events such that by default the events do not bubble, and are not cancelable.

Specifications should use the events defined in this specification in preference to other events (e.g. in a different namespace, or with a different name) that offer the same functionality.

These events are in "no namespace", that is for the purposes of namespaced systems they use the null namespace. (For further information on namespaces, see "Namespaces in XML" [XMLNames]).

Two kinds of initialisation methods are provided: one (initProgressEventNS) in which the namespace is required and must be null (any event in another namespace is not defined by this specification), and one (initProgressEvent) which assigns the null namespace automatically. This specification does not recommend use of one method over the other, and authors may choose whichever method suits them better for any given usage.

2.2 Event firing order

In short, there must be at least one loadstart event, followed by zero or more progress events, followed by one event which may be any of error, abort or load, according to the outcome of the operation, and finally a loadend event must be fired.

2.3 Interface definitions

Where this specification repeats information from the DOM Level 3 Events specification [D3E], the repeated information in this section is informative. In the case of any conflict between the specifications the DOM Level 3 Events specification is normative.

Note: To create an instance of the ProgressEvent interface, use the DocumentEvent.createEvent("ProgressEvent") method call.

IDL Definition
interface ProgressEvent : events::Event {
     readonly attribute boolean         lengthComputable;
     readonly attribute unsigned long long  loaded;
     readonly attribute unsigned long long  total;
     void               initProgressEvent(in DOMString typeArg,
                                          in boolean       canBubbleArg,
                                          in boolean       cancelableArg,
                                          in boolean       lengthComputableArg,
                                          in unsigned long long loadedArg,
                                          in unsigned long long totalArg)
     void               initProgressEventNS(in DOMString namespaceURI,
                                            in DOMString typeArg,
                                            in boolean       canBubbleArg,
                                            in boolean       cancelableArg,
                                            in boolean       lengthComputableArg,
                                            in unsigned long long loadedArg,
                                            in unsigned long long totalArg)
};


Attributes
readonly boolean lengthComputable
Specifies whether the total size of the transfer is known.
readonly unsigned long long loaded
Specifies the number of bytes currently loaded. A conformant specification must define whether headers and overhead from the transaction are included in calculating this value. Where there is a content-encoding or transfer-encoding this refers to the number of bytes to be transferred, i.e. with the relevant encodings applied. Where a specification has not defined this, conformant user agents should exclude headers and similar overhead.

For example, an HTTP GET request should calculate the size of the body only.

Because HTTP headers can include the users password, sometimes in clear text, a site that knows the size of the default headers for a given implementation can determine the size of the users password, which has the potential to assist in cracking it. Therefore the amount of content transferred should not be available from a HEAD request.For more details on HTTP see [RFC2616].

readonly unsigned long long total
Specifies the expected total number of bytes of the content transferred in the operation. Where the size of the transfer is for some reason unknown, the value of this attribute must be zero. Similar to requirements for the loaded attribute, conformant specifications must define whether headers and overhead from the transaction are included in calculating this value. Where there is a content-encoding or transfer-encoding this value refers to the number of bytes to be transferred, i.e. with the relevant encodings applied. Where a specification has not defined this, conformant user agents should exclude headers and similar overhead.
Methods
initProgressEvent
This method is used to initialize the value of a ProgressEvent object and has the same behavior as Event.initEventNS(), where the value of the namespace parameter is specified as null [D3E].
Parameters
typeArg of type DOMString
Unless the value of this parameter is one of loadstart, progress, stalled, suspend, error, abort, load or loadend this specification does not define the resulting event. Refer to the Event.initEvent() method [D3E] for further description of this parameter.
canBubbleArg of type boolean
Specifies Event.bubbles. This parameter overrides the intrinsic bubbling behavior of the event and determines whether the event created will bubble
cancelableArg of type boolean
Specifies Event.cancelable. This parameter overrides the intrinsic cancel behavior of the event and determines whether the event created is cancelable
lengthComputableArg of type boolean
If the user agent has reliable information about the value of total, then this should be true. If the user agent does not have reliable information about the value of total, this should be false
loadedArg of type unsigned long long
This parameter specifies the total number of bytes already transferred. If this value is not a non-negative number, the user agent must change it to zero.
totalArg of type unsigned long long
This specifies the total number of bytes to be transferred. If lengthComputable is false, this should be zero.
No Return Value
No Exceptions
initProgressEventNS
This method is used to initialize the value of a namespaced ProgressEvent object and has the same behavior as Event.initEventNS() [D3E]. Except as described below, parameters are the same as for initProgressEvent.
Parameters
namespaceURIArg of type DOMString
For all events defined in this specification, the value of this parameter is null.
No Return Value
No Exceptions

3. Referring to progress events from other specifications

A progress event occurs when the user agent makes progress in some data transfer operation, such as loading a resource from the web via XMLHttpRequest [XHR]. Conforming specifications which use progress events must define the targets on which progress events are dispatched.

Either by reference or by direct inclusion, conforming specifications must maintain and must not contradict the requirements for and definition of the events as described in the section The ProgressEvent events, including such characteristics as the order of firing. As noted in that section, specifications may define additional characteristics subject to this restriction.

Example 1: Using progress events in another specification:

This example is informative.

FooAPI has a sendAndRetrieve() method, which sends some content via a predefined SMTP server and retrieves some other content via HTTP HEAD from a URI given as a parameter. It specifies two event targets send and receive. Progress events as specified in the ProgressEvent events specification may be dispatched on these targets for the send and receive phases respectively.

If any progress events are dispatched, then at least one start event, one progress or, if the rate of transfer falls below 10 bytes / second, one stalled event per second, one of error, abort, or load and one loadend event must be dispatched on each target.

For the send phase, the total attribute of the progress events measures the size of the RFC822 message body. For the receive phase, the total attribute specifies the size of the content to be returned in the HTTP HEAD operation. If the rate of transfer falls below 1kb / second one stalled event per second may be fired for as long as the rate remains below 1kb/second. If no bytes are transferred for 4 seconds an error event followed by a loadend event must be fired and the transfer terminated.

3.1 Firing a Progress Event

Firing a Progress event means to dispatch an event [D3E] described in section 2 The ProgressEvent events, with relevant further definition provided in the host specification, at a given target.

4. Using progress events in Web content

Scripts may use progress events in order to provide feedback on operations performed by an application.

Example 2: Using Progress events in an SVG document.

This example is informative and does not necessarily illustrate best practice.

In this example, the application uses the information in progress events emitted as an image loads in order to fill a progress bar as it receives progress events. Where the size of a download is unknown or there has been no progress yet there is simply a block moving back and forth within the progress bar to indicate that there is still some kind of activity.

<?xml version="1.1" ?>
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     viewBox="0 0 400 400">
   
   <script type="application/ecmascript"><![CDATA[
   var xlinkNS = "http://www.w3.org/1999/xlink"

   function showImage(imageHref) {
       var image = document.getElementById('myImage');
       image.setAttributeNS(xlinkNS, "href", imageHref);
       image.addEventListener("progress",imageLoadProgress,false);
       image.addEventListener("load",imageLoadComplete,false);
       image.addEventListener("error",imageLoadComplete,false);
       image.addEventListener("abort",imageLoadComplete,false);
   }           

   function imageLoadProgress(evt) {  
       if (evt.lengthComputable && evt.total != 0) { // size is known, not zero
          var progressBar = document.getElementById('progressBar');
          progressBar.setAttribute("width", 100*evt.loaded/evt.total);
          var loadAnimation = document.getElementById('loadAnimation');
          loadAnimation.endElement();
       } else { // we don't know the size and we need not to divide by zero
          var progressBar = document.getElementById('progressBar');
          progressBar.setAttribute("width", 20);
          var loadAnimation = document.getElementById('loadAnimation');
          loadAnimation.beginElement();
       }   
   }
               
   function imageLoadComplete(evt) {
       var progressBar = document.getElementById('progressBar');  
       progressBar.setAttribute("width", 100);
        var loadAnimation = document.getElementById('loadAnimation');
       loadAnimation.endElement();
               
   }
   ]]></script>

   <image id="myImage" xlink:href="imageA.png" y="15" width="400" height="300"/>

<g id="button" onclick="showImage('imageB.png')">
   <rect width="120" 
         height="30" y="350" id="button" fill="#aaa"/>
         <text x="20" y="370" font-size="15">Change Image</text>
</g>

   <animate id="loadAnimation" xlink:href="#progressBar" attributeName="x" 
     by="80" dur="1s" begin="button.click" repeatCount="indefinite"/>

   <g id="meter" opacity="0">
     <set attributeName="opacity" to=".7" begin="button.click" end="myImage.load"/>
     <rect width="101" fill="none" stroke="black" height="5"
       x="5" y="5" stroke-width="1"/>
     <rect id="progressBar" fill="#444" height="4" x="5.5" y="5.5"/>
  </g>
</svg>

Download example 2 (requires SVG support)

Example 3: Using Progress events in an HTML document.

This example is informative and does not necessarily illustrate best practice.

In this example, the application creates an XMLHttpRequest [XHR], in an HTML5 [HTML5] document and checks whether it makes progress. (Note that this relies on draft specifications and may need to change)

<!DOCTYPE html>
 <html>
  <head>
   <title>Using Progress Events</title>  
   <script>
    var theTransfer = new XMLHttpRequest();
    //start up the request properly...
    
    theTransfer.addEventListener("progress",updateProgress,false);
    theTransfer.addEventListener("load",worky,false);
    theTransfer.addEventListener("error",failToWorky,false);
    theTransfer.addEventListener("abort",whatForYouDoThat,false);

   theTransfer.open()

   function updateProgress(evt) {  
          var progressCount = document.getElementById('progressCount');
          progressCount.child[0].data = evt.loaded;
       if (evt.lengthComputable && evt.total != 0) {        // show progress
          var totalCount = document.getElementById('total');
          totalCount.child[0].data = evt.total;
       } else {       // we don't know the size
          var totalCount = document.getElementById('totalCount');
          totalCount.setAttribute("irrelevant", "irrelevant");
       }   
   }
               
   function worky(evt) {
       alert("Yuk! Modal dialog! But the transfer completed ;) ");
   }
               
   function failToWorky(evt) {
       alert("Oh! The horror! The transfer failed!!1");
   }
               
   function whatForYouDoThat(evt) {
       alert("Hey! User control is not relevant here...");
   }
   </script>

  </head>
  <body>
    <p id="theProgress">So far, I have loaded 
     <span id="progressCount">0</span> bytes
     <span id="totalCount" irrelevant="irrelevant">of the total transfer of 
     <span id="total">the total</span></span></p>
  </body>
 </html>

5. References

5.1 Normative references

[D3E] DOM Level 3 Events.
Björn Höhrmann, ed. W3C Working draft, available at http://www.w3.org/TR/DOM-Level-3-Events/
[RFC2119] Key words for use in RFCs to indicate Requirement Levels
S Bradner, 1997. The specification for how to use english to specify normatively, as if it were a technical language. Available at http://rfc.net/rfc2119.html
[RFC2616] Hypertext Transfer Protocol -- HTTP/1.1
R Fielding et al., 1999. Available at http://rfc.net/rfc2616.html

5.2 Informative references

[HTML5] HTML 5
Ian Hickson, ed. Latest draft available at http://www.w3.org/TR/html5
[IEoP] onProgress event in Internet Explorer
Documentation that was available at http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/html/07b3e629-a558-4a0e-8307-ca922f56e00c.asp
[MAE] Media Access Events
Ola Anderson, Jean-Claude Duford, Roland Lundblad, eds. W3C Working Draft available at http://www.w3.org/TR/MediaAccessEvents/
[SVGD] The proposed progress event in SVG 1.2
Available at http://www.w3.org/TR/2006/CR-SVGMobile12-20060810/svgudom.html#events__ProgressEvent
[WPE] The progress element proposed by WHAT-WG
I Hickson, ed. Latest version available at http://www.whatwg.org/specs/web-apps/current-work/#progress0
[XHR] XMLHttpRequest
A van Kesteren, ed. Latest draft available at http://www.w3.org/TR/xmlhttprequest
[XMLNames] Namespaces in XML 1.0
T Bray et al., eds. Latest draft available at http://www.w3.org/TR/xml-names

6. Acknowledgements

The editor would like to thank the SVG working group for producing the draft [SVGD] that this was initially based on. The WHATWG's proposed progress element [WPE] and the documentation for Internet Explorer's onProgress implementation [IEoP] were also useful as an initial reference for this specification. In addition, the following individuals' comments have been invaluable in preparing this draft:

Robin Berjon, Jean-Yves Bitterlich, Marcos Caceres, Suresh Chitturi, Alex Danilo, Erik Dahlström, Jean-Claude Duford, Andrew Emmons, João Eiras, Gorm Eriksen, Kartikaya Gupta, Ian Hickson, Bjoern Hoehrmann, Björn Hoehrmann, David Håsäther, Björn Höhrmann, Bjoern H�hrmann, Philip Jägenstedt, Anne van Kesteren, Travis Leithead, Aaron Leventhal, Jim Ley, Chris Lilley, Cameron McCormack, Olli Pettay, Michael Antony Puls, Nandini Ramani, Robert Sayre, Alan Schepers, Doug Schepers, Rich Schwerdtfeger, Lisa Seeman, Andrew Shellshear, Ellen Siegel, Andy Sledd, Garret Smith, Maciej Stachowiak, Boris Zbarsky, Gottfried Zimmermann

The editor apologises to anyone who has inadvertently been left off this list, and welcomes corrections.

7. Change History

http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.30 (Intended basis for Last Call Working Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.29 (Intended basis for Last Call Working Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.27 (Intended basis for Last Call Working Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.26 (Interim draft of intended basis for Last Call Working Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.25
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.24
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.22
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.21 (based on proposed Third Public Working Draft)
Editorial changes designed to clarify conformance requirements for each type of conformance.
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.20
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.18
Copy of the Public Working Draft http://www.w3.org/TR/WD-progress-event-20071023
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.17 (basis for Second Public Workling Draft)
Only editorial tweaks
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.16 (intended basis for new Public Workling Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.15 (intended basis for new Public Working Draft)
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.12
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.11 (Basis for first Public Working Draft http://www.w3.org/TR/2007/WD-progress-events-20070419 )
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.10
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.9
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.8
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.7
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.4
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.3
http://dev.w3.org/cvsweb/~checkout~/2006/webapi/progress/Progress.html?rev=1.2
First real version

Various editorial changes and corrections and modifications to the examples are made from draft to draft. These are generally not noted in the change history.