CARVIEW |
Presentation API
W3C Working Draft
- This version:
- https://www.w3.org/TR/2016/WD-presentation-api-20160211/
- Latest published version:
- https://www.w3.org/TR/presentation-api/
- Latest editor's draft:
- https://w3c.github.io/presentation-api/
- Previous version:
- https://www.w3.org/TR/2015/WD-presentation-api-20151013/
- Editors:
- Mark Foltz, Google, mfoltz@google.com
- Dominik Röttsches, Intel (until April 2015)
- Version history:
- GitHub w3c/presentation-api/commits
- Participate:
- GitHub w3c/presentation-api
- File an issue
- Open issues
- Mailing-list (public-secondscreen@w3.org)
Copyright © 2016 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and document use rules apply.
Abstract
This specification defines an API to enable web content to access external presentation-type displays and use them for presenting web content.
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 https://www.w3.org/TR/.
This document was published by the Second Screen Presentation Working Group 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-secondscreen@w3.org (subscribe, archives). All comments are welcome.
Since publication as Working Draft on 13 October 2015, the Working Group has refined the interfaces and significantly improved all procedures. Security and privacy considerations have been completed based on feedback and interactions with other W3C groups. The Working Group intends to publish a Candidate Recommentation soon and seeks wide review of this document. Horizontal reviews and feedback from early experimentations and developers willing to use this specification are encouraged.
Some open issues remain, including on ways to pass the language settings from the controller to the presentation and on whether the messaging channel should expose a congestion control mechanism; please check the group's issue tracker on GitHub for a complete list of open issues.
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.
This document is governed by the 1 September 2015 W3C Process Document.
Table of Contents
- 1. Introduction
- 2. Use cases and requirements
- 3. Conformance
- 4. Terminology
- 5.
Examples
- 5.1 Monitor availability of presentation displays example
- 5.2 Starting a new presentation example
- 5.3 Reconnect to a presentation example
- 5.4 Presentation initation by the controlling UA example
- 5.5 Monitor connection's state and exchange data example
- 5.6 Monitor available connection(s) and say hello
- 6.
API
- 6.1 Common idioms
- 6.2
Interface
Presentation
- 6.3
Interface
PresentationRequest
- 6.4
Interface
PresentationAvailability
- 6.5
Interface
PresentationConnection
- 6.5.1 Establishing a presentation connection
- 6.5.2
Sending a message through
PresentationConnection
- 6.5.3
Receiving a message through
PresentationConnection
- 6.5.4
Interface
PresentationConnectionClosedEvent
- 6.5.5
Closing a
PresentationConnection
- 6.5.6 Terminating a presentation in a controlling browsing context
- 6.5.7 Terminating a presentation in a receiving browsing context
- 6.5.8 Handling a termination confirmation in a controlling user agent
- 6.5.9 Event Handlers
- 6.6
Interface
PresentationReceiver
- 6.7
Interface
PresentationConnectionList
- 6.8
Sandboxing and the
allow-presentation
keyword
- 7. Security and privacy considerations
- 8. Acknowledgments
- A. References
1. Introduction
This section is non-normative.
This specification aims to make presentation displays such as projectors or connected TVs, available to the Web and takes into account displays that are attached using wired (HDMI, DVI, or similar) and wireless technologies (Miracast, Chromecast, DLNA, AirPlay, or similar).
Devices with limited screen size lack the ability to show content to a larger audience, for example, a group of colleagues in a conference room, or friends and family at home. Showing content on an external large presentation display helps to improve the perceived quality and impact of the presented content.
At its core, this specification enables an exchange of messages between a page that acts as the controller and another page that represents the presentation shown in the presentation display. How the messages are transmitted is left to the UA in order to allow the use of presentation display devices that can be attached in a wide variety of ways. For example, when a presentation display device is attached using HDMI or Miracast, the same UA that acts as the controller renders the presentation. Instead of displaying the presentation in another window on the same device, however, it can use whatever means the operating system provides for using the external presentation displays. In such a case, both the controller and presentation run on the same UA and the operating system is used to route the presentation display output to the presentation display. This is commonly referred to as the 1-UA case. This specification imposes no requirements on the presentation display devices connected in such a manner.
If the presentation display is able to render HTML documents and communicate with the controller, the controller does not need to render the presentation. In this case, the UA acts as a proxy that requests the presentation display to show and render the presentation itself. This is commonly referred to as the 2-UA case. This way of attaching to displays could be enhanced in the future by defining a standard protocol for delivering these types of messages that display devices could choose to implement.
The API defined here is intended to be used with UAs that attach to presentation display devices through any of the above means.
2. Use cases and requirements
Use cases and requirements are captured in a separate Presentation API Use Cases and Requirements document.
3. Conformance
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, SHOULD, and SHOULD NOT are to be interpreted as described in [RFC2119].
Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and terminate these steps") are to be interpreted with the meaning of the key word ("MUST", "SHOULD", "MAY", etc.) used in introducing the algorithm.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)
3.1 Conformance Classes
This specification describes the conformance criteria for two classes of user agents.
- Controlling user agent
-
Web browsers that conform to the specifications of a controlling user agent must be able to start and control presentations by providing a controlling browsing context as described in this specification. This context implements the
Presentation
,
,PresentationConnection
, andPresentationConnectionAvailableEvent
interfaces.PresentationRequest
- Receiving user agent
-
Web browsers that conform to the specifications of a receiving user agent must be able to render presentations by providing a receiving browsing context as described in this specification. This context implements the
Presentation
,
,PresentationConnection
, andPresentationConnectionAvailableEvent
interfaces.PresentationReceiver
One user agent may act both as a controlling user agent and as a receiving user agent, if it provides both browsing contexts and implements all of their required interfaces. This can happen when the same user agent is able to host the controlling browsing context and the receiving browsing context for a presentation, as in the 1-UA implementation of the API.
Conformance requirements phrased against a user agent apply either to a controlling user agent, a receiving user agent or to both classes, depending on the context.
4. Terminology
The terms browsing context, nested browsing context, event handler, event handler event type, firing an event, firing a simple event, navigate, queue a task, trusted event, allowed to show a popup, top-level browsing context, unload a document, session history, sandboxing flag set, active sandboxing flag set, parse a sandboxing directive, sandboxed auxiliary navigation browsing context flag, sandboxed top-level navigation browsing context flag, and settings object are defined in [HTML5].
The term in parallel is defined in [HTML51].
This document provides interface definitions using the Web IDL standard ([WEBIDL]). The terms Promise, ArrayBuffer, ArrayBufferView are defined in [WEBIDL].
The term throw in this specification is used as defined in [WEBIDL]. The following exception names are defined by WebIDL and used by this specification:
-
AbortError
-
InvalidAccessError
-
NotFoundError
-
NotSupportedError
-
OperationError
-
SecurityError
-
SyntaxError
The terms resolving a Promise, and rejecting a Promise are used as explained in [PROMGUIDE].
The term URL is defined in the WHATWG URL standard [URL].
The term Blob is defined in the File API specification [FILEAPI].
The term RTCDataChannel is defined in the WebRTC API specification [WEBRTC].
The term cookie store is defined in RFC 6265 [COOKIES].
The terms permission and permission state are defined in [PERMISSIONS].
The term database is defined in [INDEXEDDB].
The terms localStorage
and sessionStorage
are defined in [WEBSTORAGE].
The terms potentially secure, a priori unauthenticated URL, and prohibits mixed security contexts algorithm are defined in [MIXED-CONTENT].
5. Examples
This section shows example codes that highlight the usage of main
features of the Presentation API. In these examples,
controller.html
implements the controller and
presentation.html
implements the presentation. Both pages
are served from the domain https://example.org
(https://example.org/controller.html
and
https://example.org/presentation.html
). These examples
assume that the controlling page is managing one presentation at a
time. Please refer to the comments in the code examples for further
details.
5.1 Monitor availability of presentation displays example
<!-- controller.html --> <button id="presentBtn" style="display: none;">Present</button> <script> // The Present button is visible if at least one presentation display is available var presentBtn = document.getElementById("presentBtn"); // It is also possible to use relative presentation URL e.g. "presentation.html" var presUrl = "https://example.com/presentation.html"; // show or hide present button depending on display availability var handleAvailabilityChange = function(available) { presentBtn.style.display = available ? "inline" : "none"; }; // Promise is resolved as soon as the presentation display availability is // known. var request = new PresentationRequest(presUrl); request.getAvailability().then(function(availability) { // availability.value may be kept up-to-date by the controlling UA as long // as the availability object is alive. It is advised for the web developers // to discard the object as soon as it's not needed. handleAvailabilityChange(availability.value); availability.onchange = function() { handleAvailabilityChange(this.value); }; }).catch(function() { // Availability monitoring is not supported by the platform, so discovery of // presentation displays will happen only after request.start() is called. // Pretend the devices are available for simplicity; or, one could implement // a third state for the button. handleAvailabilityChange(true); }); </script>
5.2 Starting a new presentation example
<!-- controller.html --> <script> presentBtn.onclick = function () { // Start new presentation. request.start() // The connection to the presentation will be passed to setConnection on // success. .then(setConnection); // Otherwise, the user canceled the selection dialog or no screens were // found. }; </script>
5.3 Reconnect to a presentation example
<!-- controller.html --> <button id="reconnectBtn" style="display: none;">Reconnect</button> <script> var reconnect = function () { // read presId from localStorage if exists var presId = localStorage["presId"]; // presId is mandatory when reconnecting to a presentation. if (!!presId) { request.reconnect(presId) // The new connection to the presentation will be passed to // setConnection on success. .then(setConnection); // No connection found for presUrl and presId, or an error occurred. } }; // On navigation of the controller, reconnect automatically. document.addEventListener("DOMContentLoaded", reconnect); // Or allow manual reconnection. reconnectBtn.onclick = reconnect; </script>
5.4 Presentation initation by the controlling UA example
<!-- controller.html --> <!-- Setting presentation.defaultRequest allows the page to specify the PresentationRequest to use when the controlling UA initiates a presentation. --> <script> navigator.presentation.defaultRequest = new PresentationRequest(defaultUrl); navigator.presentation.defaultRequest.onconnectionavailable = function(evt) { setConnection(evt.connection); }; </script>
5.5 Monitor connection's state and exchange data example
<!-- controller.html --> <button id="disconnectBtn" style="display: none;">Disconnect</button> <button id="terminateBtn" style="display: none;">Stop</button> <script> var connection; // The Disconnect and Stop buttons are visible if there is a connected presentation var disconnectBtn = document.getElementById("disconnectBtn"); var stopBtn = document.getElementById("stopBtn"); stopBtn.onclick = function () { connection && connection.terminate(); }; var setConnection = function (theConnection) { // Disconnect from existing presentation, if any close(); // Set the new connection and save the presentation ID connection = theConnection; localStorage["presId"] = connection.id; // monitor connection's state connection.onconnect = function () { // Allow the user to disconnect from or terminate the presentation disconnectBtn.style.display = "inline"; stopBtn.style.display = "inline"; reconnectBtn.style.display = "none"; // register message handler this.onmessage = function (message) { console.log("receive message", message.data); }; // send initial message to presentation page this.send("say hello"); }; connection.onclose = reset; connection.onterminate = function () { // remove presId from localStorage if exists delete localStorage["presId"]; // Reset the UI reset(); }; }; var reset = function () { connection = null; disconnectBtn.style.display = "none"; stopBtn.style.display = "none"; reconnectBtn.style.display = localStorage["presId"] ? "inline" : "none"; }; var close = function () { connection && connection.close(); }; disconnectBtn.onclick = close; </script>
5.6 Monitor available connection(s) and say hello
<!-- receiver.html --> <script> var addConnection = function(connection) { connection.onconnect = function () { this.onmessage = function (message) { if (message.data == "say hello") this.send("hello"); }; }; }; navigator.presentation.receiver.connectionList.then(function (list) { list.connections.map(function (connection) { addConnection(connection); }); list.connections.onconnectionavailable = function (connections) { addConnection(connections[connections.length - 1]); }; }); </script>
6. API
6.1 Common idioms
A presentation display refers to an external screen available to the user agent via an implementation specific connection technology.
A presentation connection is an object relating a controlling browsing context to its receiving browsing context and enables two-way-messaging between them. Each presentation connection has a presentation connection state, a presentation identifier to distinguish it from other presentations, and a presentation URL that is a URL used to create or resume the presentation. A valid presentation identifier consists of alphanumeric ASCII characters only and is at least 16 characters long.
A controlling
browsing context (or controller for short) is a
browsing context that has connected to a presentation
by calling
or
start
()
, or
received a presentation connection via a reconnect
()connectionavailable
event.
The receiving browsing context (or presentation for short) is the browsing context responsible for rendering to a presentation display. A receiving browsing context can reside in the same user agent as the controlling browsing context or a different one. A receiving browsing context is created by following the steps to create a receiving browsing context.
In a procedure, the destination browsing context is the receiving browsing context when the procedure is initiated at the controlling browsing context, or the controlling browsing context if it is initiated at the receiving browsing context.
The set of controlled presentations, initially empty,
contains the presentation connections created by the
controlling browsing contexts for the controlling user
agent (or a specific user profile within that user agent). The
set of controlled presentations is represented by a list of
PresentationConnection
objects that represent the underlying
presentation connections. Several
PresentationConnection
objects may share the same
presentation URL and presentation identifier in that
set, but there can be only one PresentationConnection
with a
specific presentation URL and presentation identifier
for a given controlling browsing context.
The set of presentation controllers, initially empty,
contains the presentation connections created by a
receiving browsing context for the receiving user
agent. The set of presentation controllers is represented
by a list of PresentationConnection
objects that represent the
underlying presentation connections. All presentation
connections in this set share the same presentation URL
and presentation identifier.
6.2
Interface Presentation
partial interface Navigator { [SameObject] readonly attribute Presentation?presentation
; }; interface Presentation { attributePresentationRequest
?defaultRequest
; [SameObject] readonly attributePresentationReceiver
?receiver
; };
The presentation
attribute is
used to retrieve an instance of the Presentation
interface. If presentation is disabled, the attribute MUST
return null. Otherwise, it MUST return the
Presentation
instance.
6.2.1 Controlling user agent
In a controlling user agent, the defaultRequest
attribute MUST
return the default presentation request if any,
null
otherwise.
If set by the controller, the value of the defaultRequest
attribute SHOULD be used by the
controlling user agent as the default presentation
request for that controller. When the controlling user
agent wishes to initiate a PresentationConnection
on the
controller's behalf, it MUST start a presentation using the
default presentation request for the controller (as
if the controller had called defaultRequest.start()
).
The controlling user agent SHOULD initiate presentation using the default presentation request only when the user has expressed an intention to do so, for example by clicking a button in the browser.
defaultRequest
would have no effect.
6.2.2 Receiving user agent
In a receiving user agent, the receiver
attribute MUST return
the
instance associated
with the receiving browsing context and created by the
receiving user agent when the receiving browsing
context is created. In any other browsing context, it
MUST return PresentationReceiver
null
.
A user agent that is a receiving user agent but not a
controlling user agent MUST always return null
for the defaultRequest
attribute. It MUST
treat setting the defaultRequest
attribute as a no-op.
A user agent that is a controlling user agent but not a
receiving user agent MUST always return null
for the receiver
attribute.
6.3
Interface PresentationRequest
PresentationRequest
[Constructor(DOMString url)]
interface PresentationRequest : EventTarget {
Promise<PresentationConnection
> start
();
Promise<PresentationConnection
> reconnect
(DOMString presentationId);
Promise<PresentationAvailability
> getAvailability
();
attribute EventHandler onconnectionavailable
;
};
A
object is associated with a
request to initiate or reconnect to a presentation made by a
controlling browsing context. The
PresentationRequest
object MUST be implemented in
a controlling browsing context provided by a controlling
user agent.
PresentationRequest
When a
is constructed, the
given PresentationRequest
url
MUST be used as the presentation request
URL which is the presentation URL for the
instance.
PresentationRequest
6.3.1
Constructing a PresentationRequest
When the PresentationRequest
constructor is called,
the controlling user agent MUST run these steps:
- Input
- url, the presentation request URL
- Output
-
A
PresentationRequest
object
- Resolve url relative to the API base URL specified by the entry settings object, and let presentationUrl be the resulting absolute URL, if any.
- If the resolve a URL algorithm failed, then throw a
SyntaxError
exception and abort the remaining steps. - Construct a new
PresentationRequest
object with presentationUrl as the constructor argument and return it.
6.3.2 Starting a presentation
When the start
method is called, the user agent MUST run the following
steps to start a presentation:
- Input
-
presentationRequest, the
PresentationRequest
object - presentationUrl, the presentation request URL
- Output
- A Promise
- If the algorithm isn't allowed to show a popup, return a
Promise rejected with an
InvalidAccessError
exception and abort these steps. - Using the document's settings object, run the prohibits mixed security contexts algorithm.
- If the result of the algorithm is
"Prohibits Mixed Security Contexts"
and presentationUrl is an a priori unauthenticated URL, then return a Promise rejected with aSecurityError
. - If there is already an unsettled Promise from a previous
call to
start
for the same controlling browsing context, return a Promise rejected with anOperationError
exception and abort all remaining steps. - Let P be a new Promise.
- Return P, but continue running these steps in parallel.
- If the user agent is not monitoring the list of available presentation displays, run the steps to monitor the list of available presentation displays in parallel.
- Request user permission for the use of a presentation display and selection of one presentation display.
- If either of the following is true:
- The list of available presentation displays is empty and will remain so before the request for user permission is completed.
- No member in the list of available presentation displays is a compatible presentation display for presentationUrl.
-
Reject P with a
NotFoundError
exception. - Abort all remaining steps.
- If the user denied permission to use a display, reject
P with an
AbortError
exception, and abort all remaining steps. - Otherwise, the user granted permission to use a display; let D be that display.
- Let I be a new valid presentation identifier unique among all presentation identifiers for known presentation connections in the set of controlled presentations.
- Create a new
PresentationConnection
S. - Set the presentation identifier of S to I.
- Set the presentation URL of S to presentationUrl.
- Set the presentation connection state of S to
connecting
. - Add S to the set of controlled presentations.
- Resolve P with S.
-
Queue a task to fire a trusted event with
the name
connectionavailable
, that uses thePresentationConnectionAvailableEvent
interface, with theconnection
attribute initialized to S, at presentationRequest. The event must not bubble, must not be cancelable, and has no default action. - If any of the following steps fails, abort all remaining steps
and close the presentation connection S with
error
as closeReason, and a human readable message describing the failure as closeMessage. - Create a receiving browsing context on D and let R be the result.
- Navigate R to presentationUrl.
- Establish a presentation connection with S.
http
or https
schemes; behavior for other schemes is not
defined by this specification.
6.3.3 Reconnecting to a presentation
When the reconnect(presentationId)
method
is called on a PresentationRequest
presentationRequest, the user agent MUST run the
following steps to reconnect to a presentation:
- Input
-
presentationRequest, the
PresentationRequest
object that
was called on.reconnect
() - presentationId, a presentation identifier
- Output
- P, a Promise
- Let P be a new Promise.
- Using the document's settings object, run the prohibits mixed security contexts algorithm.
- If the result of the algorithm is
"Prohibits Mixed Security Contexts"
and the presentation request URL of presentationRequest is an a priori unauthenticated URL, then reject P with aSecurityError
. - Return P, but continue running these steps in parallel.
- Search the set of controlled presentations for a
PresentationConnection
that meets the following criteria: its controlling browsing context is the current browsing context, its presentation connection state is notterminated
, its presentation URL is equal to the presentation request URL of presentationRequest, and its presentation identifier is equal to presentationId. - If such a
PresentationConnection
exists, run the following steps:- Let S be that
PresentationConnection
. - Resolve P with S.
- If the presentation connection state of S
is
connecting
orconnected
, then abort all remaining steps. - Set the presentation connection state of
S to
connecting
. - Establish a presentation connection with S.
- Abort all remaining steps.
- Let S be that
- Search the set of controlled presentations for the first
PresentationConnection
that meets the following criteria: its presentation connection state is notterminated
, its presentation URL is equal to the presentation request URL of presentationRequest, and its presentation identifier is equal to presentationId. - If such a
PresentationConnection
exists, run the following steps:- Create a new
PresentationConnection
S. - Set the presentation identifier of S to presentationId.
- Set the presentation URL of S to the presentation request URL of presentationRequest.
- Set the presentation connection state of
S to
connecting
. - Add S to the set of controlled presentations.
- Resolve P with S.
-
Queue a task to fire a trusted event
with the name
connectionavailable
, that uses thePresentationConnectionAvailableEvent
interface, with theconnection
attribute initialized to S, at presentationRequest. The event must not bubble, must not be cancelable, and has no default action. - Establish a presentation connection with S.
- Abort all remaining steps.
- Create a new
-
Reject P with a
NotFoundError
exception.
6.3.4 Event Handlers
The following are the event handlers (and their corresponding event
handler event types) that must be supported, as event handler IDL
attributes, by objects implementing the PresentationRequest
interface:
Event handler | Event handler event type |
---|---|
onconnectionavailable
|
connectionavailable
|
6.4
Interface PresentationAvailability
interface PresentationAvailability : EventTarget {
readonly attribute boolean value
;
attribute EventHandler onchange
;
};
A
object is associated
with available presentation displays and represents the
presentation display availability for a presentation
request. If the controlling user agent can monitor the list
of available presentation displays in the background (without a
pending request to PresentationAvailability
), the
start
()
object MUST be
implemented in a controlling browsing context.
PresentationAvailability
The value
attribute MUST
return the last value it was set to. The value is updated by the
monitor the list of available presentation displays algorithm.
The onchange
attribute is
an event handler whose corresponding event handler event
type is change
.
6.4.1 The set of availability objects
The user agent MUST keep track of the set of
availability objects requested through the
method. The
set of availability objects is represented as a set of
tuples (A, availabilityUrl),
initially empty, where:
getAvailability
()
-
A is a live
PresentationAvailability
object; -
availabilityUrl is the parameter passed to
to create A.getAvailability
()
6.4.2 The list of available presentation displays
The user agent MUST keep a list of available presentation displays. This current list of presentation displays may be used for starting new presentations, and is populated based on an implementation specific discovery mechanism. It is set to the most recent result of the algorithm to monitor the list of available presentation displays.
While there are live PresentationAvailability
objects, the
user agent MAY monitor the list of available presentation
displays continuously, so that pages can use the value
property of a
PresentationAvailability
object to offer presentation only
when there are available displays. However, the user agent
may not support continuous availability monitoring; for example,
because of platform or power consumption restrictions. In this case
the Promise returned by
MUST be
rejected and the algorithm to monitor
the list of available presentation displays will only run as
part of the start a presentation algorithm.
getAvailability
()
When there are no live PresentationAvailability
objects
(that is, the set of availability objects is empty), user
agents SHOULD NOT monitor the list of available presentation
displays to satisfy the
power saving non-functional requirement. To further save power,
the user agent MAY also keep track of whether the page
holding a PresentationAvailability
object is in the
foreground. Using this information, implementation specific
discovery of presentation displays can be resumed or
suspended.
Some presentation displays may only be able to display a subset of Web content because of functional, security or hardware limitations. Examples are set-top boxes, smart TVs or networked speakers capable of rendering only audio. We say that such a display is a compatible presentation display for a presentation request URL if the user agent can reasonably guarantee that the presentation of the URL on that display will succeed.
6.4.3 Getting the presentation displays availability information
When the getAvailability()
method is
called, the user agent MUST run the following steps:
- Input
- presentationUrl, the presentation request URL
- Output
- P, a Promise
- Let P be a new Promise.
- Return P, but continue running these steps in parallel.
- If the user agent is unable to monitor the list of available
presentation displays for the entire duration of the
controlling browsing context (e.g., because the user has
disabled this feature), then:
-
Resolve P with a new
PresentationAvailability
object with itsvalue
property set tofalse
. - Abort all the remaining steps.
-
Resolve P with a new
- If the user agent is unable to continuously monitor the list
of available presentation displays but can find presentation
displays in order to start a connection, then:
-
Reject P with a
NotSupportedError
exception. - Abort all the remaining steps.
-
Reject P with a
- Let A be a new
PresentationAvailability
object with itsvalue
property set tofalse
if the list of available presentation displays is empty or none of them is a compatible presentation display,true
otherwise. - Create a tuple (A, presentationUrl) and add it to the set of availability objects.
- Run the algorithm to monitor the list of available presentation displays.
- Resolve P with A.
6.4.4 Monitoring the list of available presentation displays
If the set of availability objects is non-empty, or there is a pending request to start a presentation, the user agent MUST monitor the list of available presentation displays by running the following steps.
- Retrieve available presentation displays (using an implementation specific mechanism) and let newDisplays be this list.
- For each member (A,
availabilityUrl) of the set of availability
objects:
- Set previousAvailability to the value of
A's
value
property. - Let newAvailability be
true
if newDisplays is not empty and at least one display in newDisplays is a compatible presentation display for availabilityUrl. Otherwise, set newAvailability tofalse
. - If previousAvailability is not equal to
newAvailability, then queue a task to run the
following steps:
- Set A's
value
property to newAvailability. -
Fire a simple event named
change
at A.
- Set A's
- Set previousAvailability to the value of
A's
- Set the list of available presentation displays to the value of newDisplays.
When a PresentationAvailability
object is no longer alive
(i.e., is eligible for garbage collection), the user agent
SHOULD run the following steps:
- Find and remove any entry (A, availabilityUrl) in the set of availability objects for the newly deceased A.
- If the set of availability objects is now empty and there is no pending request to start a presentation, cancel any pending task to monitor the list of available presentation displays for power saving purposes.
6.4.5
Interface PresentationConnectionAvailableEvent
[Constructor(DOMString type,PresentationConnectionAvailableEventInit
eventInitDict)] interface PresentationConnectionAvailableEvent : Event { [SameObject] readonly attributePresentationConnection
connection; }; dictionary PresentationConnectionAvailableEventInit : EventInit { requiredPresentationConnection
connection; };
A controlling user agent fires a trusted event
named connectionavailable
on a
PresentationRequest
when a connection associated with the
object is created. It is fired at the PresentationRequest
instance, using the PresentationConnectionAvailableEvent
interface, with the connection
attribute set
to the
object that was
created. The event is fired for each connection that is created for
the controller, either by the controller calling
PresentationConnection
start()
or reconnect()
, or by the
controlling user agent creating a connection on the
controller's behalf via
.
defaultRequest
A receiving user agent fires a trusted event
named connectionavailable
on a PresentationReceiver
when an incoming connection is
created. It is fired at the PresentationConnectionList
instance associated with the PresentationReceiver
instance,
using the PresentationConnectionAvailableEvent
interface,
with the connection
attribute set
to the
object that was
created. The event is fired for all connections that are created
when monitoring incoming presentation connections.
PresentationConnection
6.5
Interface PresentationConnection
Each presentation connection is represented by a
PresentationConnection
object. Both the controlling user
agent and receiving user agent MUST implement
PresentationConnection
.
enum PresentationConnectionState { "connecting", "connected", "closed", "terminated" }; enum BinaryType { "blob", "arraybuffer" }; interface PresentationConnection : EventTarget { readonly attribute DOMString?id
; readonly attributePresentationConnectionState
state
; voidclose
(); voidterminate
(); attribute EventHandleronconnect
; attribute EventHandleronclose
; attribute EventHandleronterminate
; // Communication attributeBinaryType
binaryType; attribute EventHandleronmessage
; voidsend
(DOMString message); void send(Blob data); void send(ArrayBuffer data); void send(ArrayBufferView data); };
The id
attribute specifies the
presentation connection's presentation identifier.
The state
attribute represents the
presentation connection's current state. It can take one of
the values of PresentationConnectionState
depending on the
connection state:
-
connecting
means that the user agent is attempting to establish a presentation connection with the destination browsing context. This is the initial state when aPresentationConnection
object is created. -
connected
means that the presentation connection is established and communication is possible. -
closed
means that the presentation connection has been closed, or could not be opened. It may be re-opened through a call to
. No communication is possible.reconnect
() -
terminated
means that the receiving browsing context has been terminated. Any presentation connection to that presentation is also terminated and cannot be re-opened. No communication is possible.
When the close()
method is called on a
PresentationConnection
S, the user agent
MUST start closing the presentation connection S
with closed
as
closeReason and an empty message as
closeMessage.
When the terminate()
method is called on a
PresentationConnection
S in a controlling
browsing context, the user agent MUST run the algorithm
to terminate a presentation in a controlling browsing
context using S.
When the terminate()
method is called on a
PresentationConnection
S in a receiving
browsing context, the user agent MUST run the algorithm
to terminate a presentation in a controlling browsing
context using S.
When a PresentationConnection
object is created, its
binaryType
IDL attribute MUST be set to the string
"arraybuffer
". On getting, it MUST
return the last value it was set to. On setting, the user agent
MUST set the IDL attribute to the new value.
binaryType
attribute allows authors to control how
binary data is exposed to scripts. By setting the attribute to
"blob
", binary data is returned in
Blob
form; by setting it to "arraybuffer
", it is returned in
ArrayBuffer
form. The attribute defaults to
"arraybuffer
". This attribute has no effect on data
sent in a string form.
When the send()
method is called on a
PresentationConnection
S, the user agent
MUST run the algorithm to send a message through
S.
When a PresentationConnection
object S is
discarded (because the document owning it is navigating or is
closed) while the presentation connection state of
S is connecting
or connected
, the user
agent SHOULD start closing the presentation connection
S with wentaway
as
closeReason and an empty closeMessage.
If the user agent receives a signal from the destination
browsing context that a PresentationConnection
S is to be closed, it SHOULD close the presentation
connection S with closed
or wentaway
as
closeReason and an empty closeMessage.
6.5.1 Establishing a presentation connection
When the user agent is to establish a presentation connection using a presentation connection, it MUST run the following steps:
- Input
-
presentationConnection, the
PresentationConnection
object that is to be connected. The presentation connection state of presentationConnection must beconnecting
.
- Connect presentationConnection to the receiving browsing context.
- If connection completes successfully, queue a task to
run the following steps:
- Set the presentation connection state of
presentationConnection to
connected
. -
Fire a simple event named
connect
at presentationConnection.
- Set the presentation connection state of
presentationConnection to
DOMString
payloads in a reliable and in-order
fashion as described in the Send a Message and Receive a
Message steps below.
6.5.2
Sending a message through PresentationConnection
send
()
it has to be ensured
that messages are delivered to the other end reliably and in
sequence. The transport should function equivalently to an
RTCDataChannel
in reliable mode.
Let presentation message data be the payload data to be
transmitted between two browsing contexts. Let presentation
message type be the type of that data, one of
text
or binary
.
When the user agent is to send a message through a presentation connection, it MUST run the following steps:
- Input
- presentationConnection, the presentation connection connected to the other browsing context
- messageOrData, the presentation message data to send to the other browsing context
- If the
state
property of presentationConnection is notconnected
, throw anInvalidStateError
exception. - If the closing procedure of presentationConnection has started, then abort these steps.
- Let presentation message type messageType be
binary
if messageOrData is of typeArrayBuffer
,ArrayBufferView
, orBlob
. Let messageType betext
if messageOrData is of typeDOMString
. - Using an implementation specific mechanism, transmit the contents of messageOrData as the presentation message data and messageType as the presentation message type to the destination browsing context.
- If the previous step encounters an unrecoverable error, then
abruptly close the presentation connection
presentationConnection with
error
as closeReason, and a closeMessage describing the error encountered.
To assist applications in recovery from an error sending a message through a presentation connection, the user agent should include details of which attempt failed in closeMessage. Example renditions of closeMessage:
-
Unable to send message: "hello"
forDOMString
messages, where"hello"
is the first 256 characters of the failed message. -
Unable to send binary message
forArrayBuffer
,ArrayBufferView
andBlob
messages.
6.5.3
Receiving a message through PresentationConnection
When the user agent has received a transmission from the
remote side consisting of presentation message data and
presentation message type, it MUST run the following steps
to receive a message through
a PresentationConnection
:
- Input
- presentationConnection, the presentation connection receiving the message
- messageType, the presentation message type of the message
- messageData, the presentation message data of the message
- If the
state
property of presentationConnection is notconnected
, abort these steps. - Let event be a newly created trusted event
that uses the
MessageEvent
interface, with the event typemessage
, which does not bubble, is not cancelable, and has no default action. - Initialize the event's data attribute as follows:
- If messageType is
text
, then initialize event'sdata
attribute to messageData with typeDOMString
. - If messageType is
binary
, andbinaryType
attribute is set to "blob
", then initialize event'sdata
attribute to a newBlob
object with messageData as its raw data. - If messageType is
binary
, andbinaryType
attribute is set to "arraybuffer
", then initialize event'sdata
attribute to a newArrayBuffer
object whose contents are messageData.
- If messageType is
- Queue a task to fire event at presentationConnection.
If the user agent encounters an unrecoverable error while
receiving a message through
presentationConnection, it SHOULD abruptly close the
presentation connection presentationConnection with
error
as
closeReason, and a human readable description of the
error encountered as closeMessage.
6.5.4
Interface PresentationConnectionClosedEvent
enum PresentationConnectionClosedReason { "error", "closed", "wentaway" }; [Constructor(DOMString type,PresentationConnectionClosedEventInit
eventInitDict)] interface PresentationConnectionClosedEvent : Event { readonly attributePresentationConnectionClosedReason
reason; readonly attribute DOMString message; }; dictionary PresentationConnectionClosedEventInit : EventInit { requiredPresentationConnectionClosedReason
reason; DOMString message; };
A PresentationConnectionClosedEvent
is fired when a
presentation connection enters a closed
state. The
reason
attribute provides the reason why the
connection was closed:
-
error
means that the mechanism for connecting or communicating with a presentation entered an unrecoverable error. -
closed
means that either the controlling browsing context or the receiving browsing context that were connected by thePresentationConnection
calledclose()
. -
wentaway
means that the browser closed the connection, for example, because the browsing context that owned the connection navigated or was discarded.
When the reason
attribute is error
, the user agent
SHOULD set the error message to a human readable description of how
the communication channel encountered an error.
6.5.5
Closing a PresentationConnection
When the user agent is to start closing a presentation connection, it MUST do the following:
- Input
- presentationConnection, the presentation connection to be closed
-
closeReason, the
PresentationConnectionClosedReason
describing why the connection is to be closed - closeMessage, a human-readable message with details of why the connection was closed.
- If the presentation connection state of
presentationConnection is not
connecting
orconnected
then abort the remaining steps. - Set the presentation connection state of
presentationConnection to
closed
. - Start to signal to the destination browsing context the
intention to close the corresponding
PresentationConnection
, passing the closeReason to that context. The user agent does not need to wait for acknowledgement that the correspondingPresentationConnection
was actually closed before proceeding to the next step. - If closeReason is not
wentaway
, then locally run the steps to close the presentation connection with presentationConnection, closeReason, and closeMessage.
When the user agent is to close a presentation connection, it MUST do the following:
- Input
- presentationConnection, the presentation connection to be closed
-
closeReason, the
PresentationConnectionClosedReason
describing why the connection is to be closed - closeMessage, a human-readable message with details of why the connection was closed.
- If there is a pending close the presentation connection task for presentationConnection, or a close the presentation connection task has already run for presentationConnection, then abort the remaining steps.
-
Queue a task to run the following steps:
- If the presentation connection state of
presentationConnection is not
connecting
,connected
, orclosed
, then abort the remaining steps. - If the presentation connection state of
presentationConnection is not
closed
, set it toclosed
. -
Fire a trusted event with the name
close
, that uses thePresentationConnectionClosedEvent
interface, with thereason
attribute initialized to closeReason and themessage
attribute initialized to closeMessage, at presentationConnection. The event must not bubble, must not be cancelable, and has no default action.
- If the presentation connection state of
presentationConnection is not
6.5.6 Terminating a presentation in a controlling browsing context
When a controlling user agent is to terminate a presentation in a controlling browsing context using connection, it MUST run the following steps:
- If the presentation connection state of
connection is not
connected
, then abort these steps. - Otherwise, for each known connection in the set
of controlled presentations in the controlling user
agent:
- If the presentation identifier of known
connection and connection are equal, and the
presentation connection state of known
connection is
connected
, then queue a task to run the following steps:- Set the presentation connection state of
known connection to
terminated
. -
Fire a simple event named
terminate
at known connection.
- Set the presentation connection state of
known connection to
- If the presentation identifier of known
connection and connection are equal, and the
presentation connection state of known
connection is
- Send a termination request for the presentation to its receiving user agent using an implementation specific mechanism.
6.5.7 Terminating a presentation in a receiving browsing context
When any of the following occur, the receiving user agent MUST terminate a presentation in a receiving browsing context:
- The receiving user agent is to unload a document
corresponding to the receiving browsing context, e.g. in
response to a call to
window.close()
in the top-level browsing context or to a request to navigate that context to a new resource. - The user requests to terminate the presentation via the
receiving user agent.
Note
This could happen by an explicit user action, or as a policy of the user agent. For example, the receiving user agent could be configured to terminate presentations that have no
PresentationConnection
objects whose presentation connection state is in theconnected
state after 30 minutes. - A controlling user agent sends a termination request to the receiving user agent for that presentation.
When a receiving user agent is to terminate a presentation in a receiving browsing context, it MUST run the following steps:
- Let P be the presentation to be terminated.
- If there is a receiving browsing context for P, and it has a document for P that is not unloaded, unload a document corresponding to that browsing context.
- For each connection in the set of presentation
controllers that were created for P, queue a
task to run the following steps:
- If the presentation connection state of
connection is not
connected
, then abort the following steps. -
Send a termination confirmation for P using
an implementation specific mechanism to the controlling
user agent that owns the destination browsing
context for connection.
Note
Only one termination confirmation needs to be sent per controlling user agent.
- If the presentation connection state of
connection is not
6.5.8 Handling a termination confirmation in a controlling user agent
When a receiving user agent is to send a termination confirmation for a presentation P, and that confirmation was received by a controlling user agent, the controlling user agent SHOULD run the following steps:
- For each connection in the set of controlled
presentations that was connected to P, queue a
task to run the following steps:
- If the presentation connection state of
connection is not
connected
, then abort the following steps. - Set the presentation connection state of
connection to
terminated
. -
Fire a simple event named
terminate
at connection.
- If the presentation connection state of
connection is not
6.5.9 Event Handlers
The following are the event handlers (and their corresponding event
handler event types) that must be supported, as event handler IDL
attributes, by objects implementing the
PresentationConnection
interface:
Event handler | Event handler event type |
---|---|
onmessage
|
message
|
onconnect
|
connect
|
onclose
|
close
|
onterminate
|
terminate
|
6.6
Interface PresentationReceiver
PresentationReceiver
interface PresentationReceiver {
[SameObject]
readonly attribute Promise<PresentationConnectionList
> connectionList
;
};
The PresentationReceiver
interface allows a receiving
browsing context to access the controlling browsing contexts and
communicate with them. The PresentationReceiver
interface MUST
be implemented in a receiving browsing context provided by a
receiving user agent.
On getting, the connectionList
attribute MUST return the result of running the following steps:
- If there is already an unsettled Promise P from
a previous call to get the
connectionList
attribute for the samePresentationReceiver
object, return P and abort all remaining steps. - Let P be a new Promise.
- Return P, but continue running these steps in parallel.
- Let list be a new
PresentationConnectionList
. - Resolve P with list.
- If the user agent is not monitoring incoming presentation connections, start monitoring incoming presentation connections from controlling browsing contexts.
6.6.1 Creating a receiving browsing context
- Input
- D, a presentation display chosen by the user
- Output
- R, a receiving browsing context
When the user agent is to create a receiving browsing context, it MUST run the following steps:
- Create a new top-level browsing context C on the user agent connected to D.
- Set the session history of C to be the empty list.
- Set the sandboxed auxiliary navigation browsing context flag on C.
- Set the
sessionStorage
attribute for theWindow
object associated with C to a new, empty storage area. - Set the
localStorage
attribute for theWindow
object associated with C to a new, empty storage area. - Set the cookie store for C to an empty cookie store.
- Set the permission state of all Permissions for
C to
"denied"
. - Set the IndexedDB databases for C to an empty set of databases.
- Return C.
When the receiving browsing context is closed, any
associated browsing state, including session history,
sessionStorage
,
localStorage
, the cookie store, and
databases MUST be discarded and not used for any other
receiving browsing context.
6.7
Interface PresentationConnectionList
PresentationConnectionList
interface PresentationConnectionList : EventTarget {
readonly attribute FrozenArray<PresentationConnection
> connections
;
attribute EventHandler onconnectionavailable
;
};
The connections
attribute
MUST return the non-terminated set of presentation connections
in the set of presentation controllers.
6.7.1 Monitoring incoming presentation connections
When the receiving user agent is to start monitoring incoming presentation connections in a receiving browsing context from controlling browsing contexts, it MUST listen to and accept incoming connection requests from a controlling browsing context using an implementation specific mechanism. When a new connection request is received from a controlling browsing context, the receiving user agent MUST run the following steps:
- Let I be the presentation identifier sent by the controlling browsing context in the incoming request.
- Create a new
PresentationConnection
S. - Set the presentation identifier of S to I.
- Establish the connection between the controlling and receiving browsing contexts using an implementation specific mechanism.
- Set the presentation connection state of S to
connected
. - Add S to the set of presentation controllers.
-
Queue a task to fire a trusted event with
the name
connectionavailable
, that uses thePresentationConnectionAvailableEvent
interface, with theconnection
attribute initialized to S, at thePresentationConnectionList
instance associated with thePresentationReceiver
object. The event must not bubble, must not be cancelable, and has no default action.
The receiving user agent MUST fire the event as soon as it
can create the
associated with the event.
PresentationConnection
6.7.2 Event Handlers
The following are the event handlers (and their corresponding event
handler event types) that must be supported, as event handler IDL
attributes, by objects implementing the
PresentationConnectionList
interface:
Event handler | Event handler event type |
---|---|
onconnectionavailable
|
connectionavailable
|
6.8
Sandboxing and the allow-presentation
keyword
This specification adds a new token, allow-presentation
,
to the set of tokens allowed in the sandbox
attribute of
an iframe
. It adds a corresponding new flag to the
sandboxing flag set:
- The sandboxed presentation browsing context flag
- This flag disables the Presentation API.
It amends the parse a sandboxing directive algorithm by adding an item to step 3:
- The sandboxed presentation browsing context flag, unless
tokens contains the
allow-presentation
keyword.
Presentation is disabled in a browsing context when the document object's active sandboxing flag set does not have the sandboxed presentation browsing context flag set.
iframe
with its sandbox
attribute set will act as if
presentation is disabled, unless that attribute includes the
allow-presentation
keyword. This allows pages to embed
potentially untrustworthy content and deny it the ability to request
presentation from the user or query for screen availability.
7. Security and privacy considerations
Personally identifiable information
The change
event fired on the
PresentationAvailability
object reveals one bit of information
about the presence (or non-presence) of a presentation display
typically discovered through the local area network. This could be used
in conjunction with other information for fingerprinting the user.
However, this information is also dependent on the user's local network
context, so the risk is minimized.
The API enables monitoring the list of available presentation displays. How the user agent determines the compatibility and availability of a presentation display with a given URL is an implementation detail. If a controlling user agent matches a presentation request URL to a DIAL application to determine its availability, this feature can be used to probe information about which DIAL applications the user has installed on the presentation display without user consent.
Cross-origin access
A presentation is allowed to be accessed across origins; the presentation URL and presentation ID used to create the presentation are the only information needed to reconnect to a connection from any origin in that user agent. In other words, a presentation is not tied to a particular opening origin.
This design allows controlling contexts from different domains to connect to a shared presentation resource. The security of the presentation ID prevents arbitrary pages from connecting to an existing presentation.
This specification allows a user agent to publish information about its
set of controlled presentations, and allows a browsing context
on another user agent to connect to a running presentation via
. To connect,
the additional browsing context must discover the presentation URL and
presentation ID of the presentation, either provided by the user, or
via a shared service.
reconnect
()
However, this specification makes no guarantee as to the identity of
the connecting party. Once connected, the receiving application may
wish to further verify the identity of the connecting party through
application-specific means. For example, the connecting application
could provide a token via
that the receiving
application could verify corresponds an authorized entity.
send
()
User interface guidelines
- Origin display
-
When the user is asked permission to use a presentation display during the steps to start a presentation, the controlling user agent should make it clear what origin is requesting presentation and what origin will be presented.
Display of the origin requesting presentation will help the user understand what content is making the request, especially when the request is initiated from a nested browsing context. For example, embedded content may try to convince the user to click to trigger a request to start an unwanted presentation.
Showing the origin that will be presented will help the user know if that content is from an potentially secure (e.g.,
https:
) origin, and corresponds to a known or expected site. For example, a malicious site may attempt to convince the user to enter login credentials into a presentation page that imitates a legimitate site. Examination of the requested origin will help the user detect these cases. - Cross-device access
-
When a user starts a presentation, the user will begin with exclusive control of the presentation. However, the Presentation API allows additional devices (likely belonging to distinct users) to connect and thereby control the presentation as well. When a second device connects to a presentation, it is recommended that all connected controlling user agents notify their users via the browser chrome that the original user has lost exclusive access, and there are now multiple controllers for the presentation.
In addition, it may be the case that the receiving user agent is capable of receiving user input, as well as acting as a presentation display. In this case, the receiving user agent should notify its user via browser chrome when a receiving browsing context is under the control of a remote party (i.e., it has one or more connected controllers).
Device Access
The presentation API abstracts away what "local" means for displays, meaning that it exposes network-accessible displays as though they were local displays. The Presentation API requires user permission for a page to access any display to mitigate issues that could arise, such as showing unwanted content on a display viewable by others.
Temporary identifiers and browser state
The presentation URL and presentation ID can be used to connect to a presentation from another browsing context. They can be intercepted if an attacker can inject content into the controlling page.
Incognito mode and clearing of browsing data
The content displayed on the presentation is different from the controller. In particular, if the user is logged in in both contexts, then logs out of the controlling browsing context, she will not be automatically logged out from the receiving browsing context. Applications that use authentication should pay extra care when communicating between devices.
The set of presentations known to the user agent should be cleared when the user requests to "clear browsing data."
When in private browsing mode ("incognito"), the initial set of controlled presentations in that browsing session must be empty. Any presentation connections added to it must be discarded when the session terminates.
Messaging between presentation connections
This spec will not mandate communication protocols between the controlling browsing context and the receiving browsing context, but it should set some guarantees of message confidentiality and authenticity between corresponding presentation connections.
8. Acknowledgments
Thanks to Wayne Carr, Louay Bassbouss, Anssi Kostiainen, 闵洪波 (Hongbo Min), Anton Vayvod, and Mark Foltz for help with editing, reviews and feedback to this draft.
A. References
A.1 Normative references
- [FILEAPI]
- Arun Ranganathan; Jonas Sicking. File API. 21 April 2015. W3C Working Draft. URL: https://www.w3.org/TR/FileAPI/
- [HTML5]
- Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Silvia Pfeiffer. HTML5. 28 October 2014. W3C Recommendation. URL: https://www.w3.org/TR/html5/
- [HTML51]
- Simon Pieters; Anne van Kesteren; Philip Jägenstedt; Domenic Denicola; Ian Hickson; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Edward O'Connor; Robin Berjon. HTML 5.1. 8 October 2015. W3C Working Draft. URL: https://www.w3.org/TR/html51/
- [MIXED-CONTENT]
- Mike West. Mixed Content. 8 October 2015. W3C Candidate Recommendation. URL: https://www.w3.org/TR/mixed-content/
- [PROMGUIDE]
- Domenic Denicola. Writing Promise-Using Specifications. finding. URL: https://www.w3.org/2001/tag/doc/promises-guide
- [RFC2119]
- S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
- [URL]
- Anne van Kesteren; Sam Ruby. URL. 9 December 2014. W3C Working Draft. URL: https://www.w3.org/TR/url-1/
- [WEBIDL]
- Cameron McCormack; Boris Zbarsky. WebIDL Level 1. 4 August 2015. W3C Working Draft. URL: https://www.w3.org/TR/WebIDL-1/
A.2 Informative references
- [COOKIES]
- A. Barth. HTTP State Management Mechanism. April 2011. Proposed Standard. URL: https://tools.ietf.org/html/rfc6265
- [DIAL]
- Netflix; YouTube. DIscovery And Launch Protocol Specification. URL: https://www.dial-multiscreen.org/dial-protocol-specification
- [INDEXEDDB]
- Nikunj Mehta; Jonas Sicking; Eliot Graff; Andrei Popescu; Jeremy Orlow; Joshua Bell. Indexed Database API. 8 January 2015. W3C Recommendation. URL: https://www.w3.org/TR/IndexedDB/
- [PERMISSIONS]
- Mounir Lamouri; Marcos Caceres. The Permissions API. 7 April 2015. W3C Working Draft. URL: https://www.w3.org/TR/permissions/
- [WEBRTC]
- Adam Bergkvist; Daniel Burnett; Cullen Jennings; Anant Narayanan; Bernard Aboba. WebRTC 1.0: Real-time Communication Between Browsers. 28 January 2016. W3C Working Draft. URL: https://www.w3.org/TR/webrtc/
- [WEBSTORAGE]
- Ian Hickson. Web Storage (Second Edition). 26 November 2015. W3C Proposed Recommendation. URL: https://www.w3.org/TR/webstorage/