W3C

Streams API

W3C Working Draft 14 February 2013

This version:
http://www.w3.org/TR/2013/WD-streams-api-20130214/
Latest published version:
http://www.w3.org/TR/streams-api/
Previous version:
None
Latest editor's draft:
https://dvcs.w3.org/hg/streams-api/raw-file/tip/Overview.htm
Editor:
Feras Moussa, Invited Expert

Abstract

This specification provides an API for representing binary data in web applications as a Stream object, as well as programmatically building and reading its contents. This includes:

Additionally, this specification defines objects to be used within threaded web applications for the synchronous reading of a Stream.

This API is designed to be used in conjunction with other APIs and elements on the web platform, notably: File [FILE-API], XMLHttpRequest (e.g. with an overloaded send() method and response object for Stream objects) [XMLHTTPREQUEST2], postMessage, and Web Workers [WEBWORKERS].

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 was published as a First Public Working Draft by the W3C Web Applications (WebApps) as a Working Draft. This document is intended to become a W3C Recommendation. If you wish to make comments regarding this document, please send them to public-webapps@w3.org (subscribe, archives). All comments are welcome.

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.

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.

Table of Contents

1. Introduction

This section is non-normative.

Web applications should have the ability to acquire and manipulate data in a wide variety of forms, including as a sequence of data made available over time. This specification defines the basic representation for Streams, errors raised by Streams, and programmatic ways to read and create Streams.

The Stream interface represents binary data which can be obtained over time. A Stream can come from APIs such as XMLHttpRequest, or can be built using StreamBuilder. The StreamReader interface represents a way to read data from a Stream as a Blob, DataURL, ArrayBuffer, or as Text, and should happen asynchronously on the user agent’s main thread, with an optional synchronous API used within threaded web applications. An asynchronous API for reading Streams prevents blocking and UI “freezing” on a user agent’s main thread. This specification defines an asynchronous API based on an event model to read and access a Stream, which is closely based on the FileReader interface defined in the [FILE-API]. A StreamReader object provides asynchronous read methods to access the Stream's data as a Blob, DataURL, ArrayBuffer, or as Text through event handler attributes and the firing of events. The use of events and event handlers allows separate code blocks the ability to monitor the progress of the read (which is particularly useful for long Stream reads or high latency network requests) and error conditions that may arise during reading of a Stream. An example will be illustrative.

In the example below, different code blocks handle progress, error, and success conditions. The example demonstrates how to read a Stream using StreamReader.

Example 1
function startRead(stream) {
        
  var reader = new StreamReader();
  
  // Handle progress, success, and errors
  reader.onprogress = updateProgress;
  reader.onload = loaded;
  reader.onerror = errorHandler;
  
    // Read the first 1024 bytes of the stream as UTF-8      
  reader.readAsText(stream, "UTF-8", 1024);
}

function updateProgress(evt) {
    var bytesLoaded = (evt.loaded / 1024);
    // Increase bytes loaded counter
}

function loaded(evt) {  
  // Obtain the read stream data    
  var streamRead = evt.target.result;
  
}

function errorHandler(evt) {
  if(evt.target.error.name == "NOT_READABLE_ERR") {
    // The stream could not be read
  }
}

In the example below, different code blocks handle progress, error, and success conditions. The example below demonstrates how to obtain a Stream from XMLHttpRequest to begin playing a large video in readystate 3.

Example 2
function handler() {
  if(this.readyState == this.LOADING) {
	var theStream = this.response;
	var streamURL = URL.createObjectURL(theStream);
	document.getElementById("myVideoTag").src = streamURL;
  }
}

var client = new XMLHttpRequest();
client.onreadystatechange = handler;
client.setRequestHeader('customHeader', 'value');
client.setRequestHeader('customHeader2', 'value2');
client.open("GET", "myvideo.h264");
client.responseType = "stream";
client.send();

In addition to reading a Stream, this specification introduces a programatic way to build a Stream with the StreamBuilder interface. The StreamBuilder interface represents a way to provide the data to be read from a Stream by appending the data to an internal buffer. StreamBuilder supports appending Blob, ArrayBuffer, and Text data to the buffer. StreamBuilder also provides an event to notify when the data available to be read from the buffer has fallen below a given threshold.

The example below demonstrates how to use StreamBuilder to load a stream into the audio tag, whose data is processed and built dynamically at read time. The thresholdReached event is fired when the buffer falls below 1024 bytes.

Example 3
function thresholdReached(){
  var moreData = //do work to create more data to place into the stream
  
  //if we have no more data to process and place in the stream, we close
  if(moreData == null){
  	sbuilder.close();
  } else{
  	sbuiler.append(moreData);
  }
}

var sbuilder = new StreamBuilder("audio/mp3", 1024);
var sbuilder.onthresholdreached = thresholdReached;
  
var streamURL = URL.createObjectURL(sbuilder.stream);
document.getElementById('audioTag').src = streamURL;

2. The Stream Interface

This interface represents a raw sequence of linear data which can be read over time. It provides an attribute representing the type of data represented by the Stream.

A Stream is an object that:

interface Stream {
    readonly attribute DOMString type;
    void close ();
};

2.1 Attributes

type of type DOMString, readonly
The ASCII-encoded string in lower case representing the media type of the Stream, expressed as an RFC2046 MIME type [RFC2046]. Conforming user agents should return the MIME type of the Stream, if it is known. If conforming user agents cannot determine the media type of the Stream, they must return the empty string. A string is a valid MIME type if it matches the media-type token defined in section 3.7 "Media Types" of RFC 2616 [HTTP11].

2.2 Methods

close
This method should close the Stream and not allow any future reads. This is done by returning on the next and subsequent reads with no data. This is an irreversible and non-idempotent operation; once a Stream has been closed, it cannot be used again; dereferencing a Stream URI bound to a Stream object on which close has been called results in a 500 Error.
No parameters.
Return type: void

3. The StreamReader Interface

This interface provides methods to read the data of a Stream using progress events and event handler attributes. It is desirable to read data from Streams asynchronously in the main thread of user agents. This interface provides such an asynchronous API, and is specified to be used with the global object (Window [HTML5]). The StreamReader is designed in a way to closely follow the W3C FileReader [FILE-API], and thus only identifies changes or additions to the way FileReader methods behave.

When the StreamReader() constructor is invoked, the user agent must return a new StreamReader object.

In environments where the global object is represented by a Window or a WorkerGlobalScope object, the StreamReader constructor must be available.

For event handler attributes, event handlers for StreamReader should mimic 6.4.3 Event Handler Attributes of the File API specification. [FILE-API]

For states, event handlers for StreamReader should mimic 6.4.4 FileReader States of the File API specification, except as defined below for DONE (numeric value of 2). [FILE-API]

Multiple reads on StreamReader should mimic 6.4.5.1 Multiple Reads of the File API specification. [FILE-API]

interface StreamReader : EventTarget {
    void readAsBlob (Stream stream, unsigned long long maxSize);
    void readAsArrayBuffer (Stream stream, optional unsigned long long maxSize);
    void readAsText (Stream stream, optional DOMString encoding, optional unsigned long long maxSize);
    void readAsDataURL (Stream Stream, optional unsigned long long maxSize);
    void abort ();
    const unsigned short EMPTY = 0;
    const unsigned short LOADING = 1;
    const unsigned short DONE = 2;
    readonly attribute unsigned short readyState;
    readonly attribute any            result;
    readonly attribute StreamError    error;
             attribute Function       onloadstart;
             attribute Function       onprogress;
             attribute Function       onload;
             attribute Function       onabort;
             attribute Function       onerror;
             attribute Function       onloadend;
};

3.1 Attributes

error of type StreamError, readonly
onabort of type Function
This event handler should mimic the FileReader.onabort event handler.
onerror of type Function
This event handler should mimic the FileReader.onerror event handler.
onload of type Function
This event handler should mimic the FileReader.onload event handler.
onloadend of type Function
This event handler should mimic the FileReader.onloadend event handler.
onloadstart of type Function
This event handler should mimic the FileReader.onloadstart event handler.
onprogress of type Function
This event handler should mimic the FileReader.onprogress event handler.
readyState of type unsigned short, readonly
result of type any, readonly
This attribute should mimic the FileReader.result attribute, with the following addition:
  • On getting, if the readAsBlob read method is used, this attribute must return a Blob of the data read from the Stream with the type property set as the type of the Stream.

3.2 Methods

abort
This method should mimic FileReader.abort(). [FILE-API]
No parameters.
Return type: void
readAsArrayBuffer

This method should mimic FileReader.readAsArrayBuffer(). [FILE-API] The only addition is the addition of a maxSize parameter, which has the following adjustment:

  • If maxSize is less than one, throw an Invalid Argument exception. Terminate these overall steps.
  • When the stream has been fully read, or the number of bytes specified by maxSize has been reached, set readyState to DONE.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: void
readAsBlob

When this method is called, the user agent must run the steps below (unless otherwise indicated).

  1. If maxSize is less than one, through an Invalid Argument exception. Terminate these overall steps.
  2. If readyState is LOADING, raise a NOT_ALLOWED_ERR exception and terminate these steps.
  3. If an error occurs during reading the stream parameter, set readyState to DONE and set result to null. Proceed to the error steps below.
    1. Dispatch a progress event called error. Set the error attribute; on getting, the error attribute must be a StreamError object with a valid error code that indicates the kind of file error that has occurred.
    2. Dispatch a progress event called loadend.
    3. Terminate this overall set of steps.
  4. If no error has occurred, set readyState to LOADING.
  5. Fire a progress event called loadstart.
  6. Make progress notifications.
  7. Continue reading on the Stream:
    1. If the optional maxSize parameter has been set, set the readyState to DONE when the number of bytes read reaches MAX_SIZE or the stream has been fully read and the number of bytes is less than MAX_SIZE.
    2. If the optional parameter has not been set, set readyState to DONE when the stream has been fully read.
  8. Set the result attribute to be stream’s data content represented as a Blob; on getting, the result result returns the (complete) data of stream as a Blob.
  9. Terminate this overall set of steps.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: void
readAsDataURL

This method should mimic FileReader.readAsDataURL(). [FILE-API] The only addition is the addition of a maxSize parameter, which has the following adjustment.

  • If maxSize is less than one, through an Invalid Argument exception. Terminate these overall steps.
  • Queue a task to update the result attribute with the Stream as a DataURL [RFC2397] after the stream has been fully read, or the number of bytes specified by maxSize has been reached; on getting, the result attribute returns the (complete) data of stream as a DataURL [RFC2397].
ParameterTypeNullableOptionalDescription
StreamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completionk
Return type: void
readAsText

This method should mimic FileReader.readAsText(). [FILE-API] The only addition is the addition of a maxSize parameter, which has the following adjustment:

  1. If maxSize is less than one, through an Invalid Argument exception. Terminate these overall steps.
  2. If no encoding is specified, use the encoding determination algorithm specified in the [FILE-API].
  3. If no maxSize is specified, continue reading until the stream has been completed.
  4. When the stream has been fully read, or the number of bytes specified by maxSize has been reached, set readyState to DONE.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
encodingDOMStringThe encoding format
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: void

3.3 Constants

DONE of type unsigned short
The current read request has been completed, or an error occurred during read, or the read was aborted using abort(). The StreamReader is no longer reading a Stream.
EMPTY of type unsigned short
This state should mimic the EMPTY state of the FileReader States
LOADING of type unsigned short
This state should mimic the LOADING state of the FileReader States
StreamReader implements EventTarget;

All instances of the StreamReader type are defined to also implement the EventTarget interface.

3.4 Event Handler Attributes

The following are the event handler attributes (and their corresponding event handler event types) that user agents must support on StreamReader as DOM attributes:

event handler attribute event handler event type
onloadstart loadstart
onprogress progress
onload load
onabort abort
onerror error
onloadend loadend

3.4.1 Event Summary

The following are the events that are fired at StreamReader objects; firing events is defined in DOM Level 3 Events [DOM-LEVEL-3-EVENTS], and the table below is normative for the events in this specification.

Event name Interface Fired when…
loadstart ProgressEvent When the read starts.
progress ProgressEvent While reading (and decoding) a stream, and reporting progress.
abort ProgressEvent When the read has been aborted. For instance, by invoking the abort() method.
error ProgressEvent When the read has failed (see errors).
load ProgressEvent When the read has successfully completed.
loadend ProgressEvent When the request has completed (either in success or failure).

4. The StreamReaderSync Interface

This interface provides methods to read the data of a Stream.

When the StreamReaderSync() constructor is invoked, the user agent must return a new StreamReaderSync object.

In environments where the global object is represented by a WorkerGlobalScope object, the StreamReaderSync constructor must be available.

interface StreamReaderSync {
    Blob        readAsBlob (Stream stream, optional unsigned long long maxSize);
    ArrayBuffer readAsArrayBuffer (Stream stream, optional unsigned long long maxSize);
    DOMString   readAsText (Stream stream, optional DOMString encoding, optional unsigned long long maxSize);
    DOMString   readAsDataURL (Stream stream, optional unsigned long long maxSize);
};

4.1 Methods

readAsArrayBuffer

This method should mimic FileReader.readAsArrayBuffer(). [FILE-API] The only addition is the addition of a maxSize parameter that affects the amount of bytes to read from the Stream.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: ArrayBuffer
readAsBlob

When this method is called, the following steps must be followed:

  1. If an error occurs during reading the stream parameter, throw a StreamException with the appropriate error code. Terminate these overall steps.
  2. If no error has occurred, read stream until the end is reached, or the number of bytes specified by maxSize have been read. Return the data contents of stream as a blob with the type property set as the type of the Stream.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: Blob
readAsDataURL

This method should mimic FileReader.readAsDataURL(). [FILE-API] The only addition is the addition of a maxSize parameter that affects the amount of the amount of bytes to read from the Stream.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: DOMString
readAsText

This method should mimic FileReader.readAsText(). [FILE-API] The only addition is the addition of a maxSize parameter that affects the amount of the amount of bytes to read from the Stream.

ParameterTypeNullableOptionalDescription
streamStreamThe Stream to be read
encodingDOMStringThe encoding format
maxSizeunsigned long longThe maximum number of bytes to be read before completion
Return type: DOMString

5. Determining an empty Stream

StreamReader will read a Stream until maxSize has been reached or the Stream has no further data to return. If a Stream has been read until the end, then there is no further data to return. Subsequent read calls will return the following:

If read is readAsBlob
Return an empty Blob with size zero
If read is readAsArrayBuffer
Return an ArrayBuffer with length zero
If read is readAsText
Return an empty string
If read is readAsDataURL
Return an empty string

6. Errors and Exceptions

6.1 StreamError

This interface should mimic the FileError Interface, and contain the same error codes.

6.2 StreamException

This interface should mimic the FileException Interface, , and contain the same error codes.

7. The StreamBuilder Interface

The StreamBuilder interface provides a way for developers to create a Stream by appending data. During a read on the stream from a StreamBuilder, the data is read 'First in, First out', in the order it was appended. StreamBuilder provides methods for appending different data, as well as a thresholdreached event to be notified when the amount of data available for read has fallen below a specified threshold.

When the StreamBuilder(in contentType) constructor is invoked, the user agent must return a new StreamBuilder object. If the StreamBuilder(in contentType) constructor is invoked with the optional thresholdLimit overload, then this limit will be used to fire the thresholdreached event.

In environments where the global object is represented by a WorkerGlobalScope object, the StreamBuilder() constructor must be available.

[Constructor, Constructor(DOMString contentType, optional int thresholdLimit)]
interface StreamBuilder : EventTarget {
    void append (String data);
    void append (Blob data);
    void append (ArrayBuffer data);
    void close ();
    readonly attribute Stream             stream;
    readonly attribute unsigned long long availableDataSize;
             attribute Function           onthresholdreached;
};

7.1 Attributes

availableDataSize of type unsigned long long, readonly
The number of bytes of data available for read from the stream
onthresholdreached of type Function
Handler for thresholdreached events.
stream of type Stream, readonly
Returns the underlying Stream represented by the StreamBuilder.

7.2 Methods

append

Appends the supplied text to the data available for the Stream, writing it as UTF-8.

Thrown if append is called on a closed StreamBuilder
ParameterTypeNullableOptionalDescription
dataStringThe data to append
Return type: void
append

Appends the supplied Blob to the data available for the Stream.

Thrown if append is called on a closed StreamBuilder
ParameterTypeNullableOptionalDescription
dataBlobThe data to append
Return type: void
append

Appends the supplied ArrayBuffer to the data available for the Stream.

Thrown if append is called on a closed StreamBuilder
ParameterTypeNullableOptionalDescription
dataArrayBufferThe data to append
Return type: void
close
This method should close the Stream. This is done by returning on the next and subsequent reads with no data.
No parameters.
Return type: void

7.3 Reads on a Stream from StreamBuilder

When a read on a stream from StreamBuilder is made, the following steps must be followed:

  1. If there is enough data available to satisfy the amount requested in the read, return the amount specified. The data should be returned in the order the data was appended.
  2. If there is not enough data available to satisfy the amount requested in the read:
    • If the Stream has been closed, return all the data available, and set availableDataSize to zero.
    • Else, keep the request pending and do not return until there is enough data available to satisfy the requset.
  3. If during the read request the value of availableDataSize fell below the thresholdLimit value specified in the constructor, fire an event called thresholdreached.

7.4 Event Handler Attributes

The following are the event handler attributes (and their corresponding event handler event types) that user agents must support on StreamBuilder as DOM attributes:

event handler attribute event handler event type
onthresholdreached thresholdreached

7.4.1 Event Summary

The following are the events that are fired at StreamBuilder objects; firing events is defined in DOM Level 3 Events [DOM-LEVEL-3-EVENTS], and the table below is normative for the events in this specification.

Event name Interface Fired when…
thresholdreached StreamBuilder The availableDataSize has fallen below the thresholdLimit value specified in the constructor

8. URIs for Stream

To reference a Stream, the same URI used for Blobs and Files in 6.7. A URI for Blob and File reference of the File API spec should be used. [FILE-API] The definitions of Origin, Lifetime, Referencing, and Dereferencing of a Blob should be applied to a Stream.

8.1 Creating and Revoking a Stream URI

A Stream URI is a Blob URI that is referencing a Stream. These URIs are created and revoked using methods exposed on the URL object, as defined in 6.7.5. Creating and Revoking a Blob URI of the File API spec. [FILE-API]

URL.createObjectURL and URL.revokeObjectURL should both be extended as follows:

interface URL {
    static DOMString createObjectURL (any object);
    static void      revokeObjectURL (DOMString url);
};

8.1.1 Methods

createObjectURL, static

The extension onto createObjectURL should have the following steps added.

  1. If this method is called with a Blob or Stream argument that is not valid, then the user agent must return null.
  2. If this method is called with a valid Blob or Stream argument, user agents must return a unique Blob URI that can be used to dereference the blob or stream argument.
ParameterTypeNullableOptionalDescription
objectany
Return type: DOMString
revokeObjectURL, static

The extension onto revokeObjectURL should have the following steps added.

  1. If the URL refers to a Blob or Stream that is both valid and in the same origin of the global object’s URL property on which this static method was called, user agents must return a 404 response code when the URL is dereferenced.
  2. If the URL refers to a Blob or Stream that is not valid or if the value provided for the URL argument is not a Blob URI or if the URL argument refers to a Blob or Stream that is not in the same origin as the global object’s URL property, this method call does nothing. User agents may display a message on their error console.
ParameterTypeNullableOptionalDescription
urlDOMString
Return type: void

9. Security Considerations

A Stream should have the same security considerations as a Blob. This is outlined in 6.8. Security Considerations of the File API specification. [FILE-API] Because a Stream uses a Blob URI, cross origin requests on a Stream will not be supported.

10. Extension of XMLHttpRequest

This specification proposes an extension to XMLHttpRequest [XMLHTTPREQUEST2] to add support for Stream. This section is temporary and is meant to provide a recommendation for how Stream should be incorporated into XMLHttpRequest. This will extend XMLHttpRequest to allow for receiving and uploading of a Stream. One such scenario is providing access to data during readyState 3 (loading). The sections below document in detail what extensions must be done to XMLHttpRequest to support Stream.

10.1 Addition of stream responseType

A responseType of ‘stream’ should be introduced to XMLHttpRequest.

Section 4.7.7 the responseType attribute in XMLHttpRequest Level 2 [XMLHTTPREQUEST2] should now read:

On setting the responseType attribute these steps must be run:

  1. If the state is not OPENED or HEADERS_RECEIVED raise an INVALID_STATE_ERR exception and terminate these steps.
  2. If the given value is not the empty string, "arraybuffer", "blob", "document", "stream", or "text" terminate these steps.
  3. Set the responseType attribute's value to the given value.

Section 4.7.8 the response attribute in XMLHttpRequest Level 2 [XMLHTTPREQUEST2] should now read:

The response attribute must return the result of running these steps:

If responseType is the empty string or "text"
  1. If the state is not LOADING or DONE return the empty string and terminate these steps.
  2. If the error flag is true return the empty string and terminate these steps.
  3. Return the text response entity body.
If responseType is “stream
  1. If the state is not LOADING or DONE return null and terminate these steps.
  2. If the error flag is true return null and terminate these steps.
  3. Return the stream response entity body.
Otherwise
  1. If the state is not DONE return null and terminate these steps.
  2. If the error flag is true return null and terminate these steps.
  3. If responseType is "arraybuffer"
    Return the arraybuffer response entity body.
    If responseType is "blob"
    Return the blob response entity body.
    If responseType is "document"
    Return the document response entity body.

10.2 readyState 3 changes

A stream is binary data obtained sequentially over time. Given this, a Stream should be accessible in readyState 3 (LOADING).

Section 4.7.5 Response Entity Body in XMLHttpRequest Level 2 [XMLHTTPREQUEST2] should have the following additions:

The stream response entity body is a Stream representing the response entity body. If the stream response entity body has no value assigned to it let it be the return value of the following algorithm:

  1. If the response entity body is null, return an empty Stream object and terminate these steps.
  2. Return a Stream object representing the response entity body.

10.3 send()

Section 4.6.6 The send() method in XMLHttpRequest Level 2 [XMLHTTPREQUEST2] should have the following additions:

If data is a Stream

If the object's type attribute is not the empty string let mime type be its value.

Let the request entity body be the raw data represented by data.

11. Requirements and Use Cases

The Stream type allows for completion of several end-to-end experiences. This section covers what the requirements are for this API, and illustrates some use cases.

A. Acknowledgements

Thanks to Eliot Graff for editorial assistance. Special thanks to the W3C.

B. References

B.1 Normative references

[DOM-LEVEL-3-EVENTS]
Travis Leithead; Jacob Rossi; Doug Schepers; Björn Höhrmann; Philippe Le Hégaret; Tom Pixley. Document Object Model (DOM) Level 3 Events Specification. 06 September 2012. W3C Working Draft. URL: http://www.w3.org/TR/2012/WD-DOM-Level-3-Events-20120906
[FILE-API]
Arun Ranganathan; Jonas Sicking. File API. 25 October 2012. W3C Working Draft. URL: http://www.w3.org/TR/2012/WD-FileAPI-20121025
[HTML5]
Robin Berjon et al. HTML5. 17 December 2012. W3C Candidate Recommendation. URL: http://www.w3.org/TR/html5/
[HTTP11]
R. Fielding et al. Hypertext Transfer Protocol - HTTP/1.1. June 1999. RFC 2616. URL: http://www.ietf.org/rfc/rfc2616.txt
[RFC2046]
N. Freed; N. Borenstein. Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. November 1996. RFC 2046. URL: http://www.ietf.org/rfc/rfc2046.txt
[RFC2397]
L. Masinter. The "data" URL scheme. August 1998. RFC 2397. URL: http://www.ietf.org/rfc/rfc2397.txt
[WEBWORKERS]
Ian Hickson. Web Workers. 01 May 2012. W3C Candidate Recommendation. URL: http://www.w3.org/TR/2012/CR-workers-20120501
[XMLHTTPREQUEST2]
Anne van Kesteren. XMLHttpRequest Level 2. 30 September 2008. W3C Working Draft. URL: http://www.w3.org/TR/2008/WD-XMLHttpRequest2-20080930