Copyright © 2025World Wide Web Consortium.W3C®liability,trademark andpermissive document license rules apply.
This specification defines an API to enable Web content to access presentation displays and use them for presenting Web content.
This section describes the status of this document at the time of its publication. A list of currentW3C publications and the latest revision of this technical report can be found in theW3C technical reports index at https://www.w3.org/TR/.
This document was published by theSecond Screen Working Group as an Editor's Draft.
Since publication as Candidate Recommendation on01 June 2017, the Working Group updated the steps to construct aPresentationRequest to ignore a URL with an unsupported scheme, placed further restrictions on how receiving browsing contexts are allowed to navigate themselves, and dropped the definition of theBinaryType enum in favor of the one defined in the HTML specification. Other interfaces defined in this document did not change other than to adjust to WebIDL updates. Various clarifications and editorial updates were also made. See thelist of changes for details.
No feature has been identified as beingat risk.
The Second Screen Working Group will refine thetest suite for the Presentation API during the Candidate Recommendation period and update thepreliminary implementation report. For this specification to advance to Proposed Recommendation, two independent, interoperable implementations of each feature must be demonstrated, as detailed in theCandidate Recommendation exit criteria section.
Publication as an Editor's Draft does not imply endorsement byW3C and its Members.
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 theW3C Patent Policy.W3C maintains apublic 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 containsEssential Claim(s) must disclose the information in accordance withsection 6 of theW3C Patent Policy.
This document is governed by the03 November 2023W3C Process Document.
This section is non-normative.
The Presentation API aims to makepresentation displays such as projectors, attached monitors, and network-connected TVs available to the Web. It 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 Web content to a larger audience: a group of colleagues in a conference room, or friends and family at home, for example. Web content shown on a largerpresentation display has greater perceived quality, legibility, and impact.
At its core, the Presentation API enables acontroller page to show apresentation page on apresentation display and exchange messages with it. How the presentation page is transmitted to the display and how messages are exchanged between it and the controller page are left to the implementation; this allows the use of a wide variety of display technologies.
For example, if thepresentation display is connected by HDMI or Miracast, which only allow audio and video to be transmitted, the user agent (UA) hosting thecontroller will also render thepresentation. It then uses the operating system to send the resulting graphical and audio output to the presentation display. We refer to this situation as the1-UA mode implementation of the Presentation API. The only requirements are that the user agent is able to send graphics and audio from rendering the presentation to the presentation display, and exchange messages internally between the controller and presentation pages.
If thepresentation display is able to render HTML natively and communicate with thecontroller via a network, the user agent hosting the controller does not need to render thepresentation. Instead, the user agent acts as a proxy that requests the presentation display to load and render the presentation page itself. Message exchange is done over a network connection between the user agent and the presentation display. We refer to this situation as the2-UA mode implementation of the Presentation API.
The Presentation API is intended to be used with user agents that attach topresentation displays in1-UA mode,2-UA mode, and possibly other means not listed above. To improve interoperability between user agents and presentation displays, standardization of network communication between browsers and displays is being considered in theSecond Screen Community Group.
This section is non-normative.
Use cases and requirements are captured in a separatePresentation API Use Cases and Requirements document.
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 wordsMAY,MUST,MUST NOT,OPTIONAL,SHOULD, andSHOULD NOT in this document are to be interpreted as described inBCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
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.)
This specification describes the conformance criteria for two classes ofuser agents.
Web browsers that conform to the specifications of acontrolling user agent must be able to start and control presentations by providing acontrolling browsing context as described in this specification. This context implements thePresentation,PresentationAvailability,PresentationConnection,PresentationConnectionAvailableEvent,PresentationConnectionCloseEvent, andPresentationRequest interfaces.
Web browsers that conform to the specifications of areceiving user agent must be able to render presentations by providing areceiving browsing context as described in this specification. This context implements thePresentation,PresentationConnection,PresentationConnectionAvailableEvent,PresentationConnectionCloseEvent,PresentationConnectionList, andPresentationReceiver interfaces.
One user agent may act both as acontrolling user agent and as areceiving 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 thecontrolling browsing context and thereceiving browsing context for a presentation, as in the1-UA mode implementation of the API.
Conformance requirements phrased against auser agent apply either to acontrolling user agent, areceiving user agent or to both classes, depending on the context.
The termsJavaScript realm andcurrent realm are used as defined in [ECMASCRIPT]. The termsresolved andrejected in the context ofPromise objects are used as defined in [ECMASCRIPT].
The termsAccept-Language andHTTP authentication are used as defined in [RFC9110].
The termcookie store is used as defined in [RFC6265].
The termUUID is used as defined in [RFC4122].
The termDIAL is used as defined in [DIAL].
The termreload a document refers to steps run when thereload() method gets called in [HTML].
The termlocal storage area refers to the storage areas exposed by thelocalStorage attribute, and the termsession storage area refers to the storage areas exposed by thesessionStorage attribute in [HTML].
This specification references terms exported by other specifications, seeB.2Terms defined by reference. It also references the following internal concepts from other specifications:
This section is non-normative.
This section shows example codes that highlight the usage of main features of the Presentation API. In these examples,controller.html implements the controller andpresentation.html implements the presentation. Both pages are served from the domainhttps://example.org (https://example.org/controller.html andhttps://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.
This code renders a button that is visible when there is at least one compatiblepresentation display that can presenthttps://example.com/presentation.htmlorhttps://example.net/alternate.html.
Monitoring of display availability is done by first creating aPresentationRequest with the URLs you want to present, then callinggetAvailability to obtain aPresentationAvailability object whosechange event will fire when presentation availability changes state.
<!-- controller.html --><buttonid="presentBtn"style="display: none;">Present</button><script>// The Present button is visible if at least one presentation display is availablevar presentBtn =document.getElementById("presentBtn");// It is also possible to use relative presentation URL e.g. "presentation.html"var presUrls = ["https://example.com/presentation.html","https://example.net/alternate.html"];// show or hide present button depending on display availabilityvar handleAvailabilityChange =function(available) { presentBtn.style.display = available ?"inline" :"none"; };// Promise is resolved as soon as the presentation display availability is// known.var request =newPresentationRequest(presUrls); 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> When the user clickspresentBtn, this code requests presentation of one of the URLs in thePresentationRequest. Whenstart is called, the browser typically shows a dialog that allows the user to select one of the compatible displays that are available. The first URL in thePresentationRequest that is compatible with the chosen display will be presented on that display.
Thestart method resolves with aPresentationConnection object that is used to track the state of the presentation, and exchange messages with the presentation page once it's loaded on the display.
<!-- 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> The presentation continues to run even after the original page that started the presentation closes itsPresentationConnection, navigates, or is closed. Another page can use theid on thePresentationConnection to reconnect to an existing presentation and resume control of it. This is only guaranteed to work from the same browser that started the presentation.
<!-- controller.html --><buttonid="reconnectBtn"style="display: none;">Reconnect</button><script>var reconnect =function () {// read presId from localStorage if existsvar 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.const reconnectBtn =document.querySelector("#reconnectBtn"); reconnectBtn.onclick = reconnect;</script> Some browsers have a way for users to start a presentation without interacting directly with the controlling page. Controlling pages can opt into this behavior by setting thedefaultRequest property onnavigator.presentation, and listening for aconnectionavailable event that is fired when a presentation is started this way. ThePresentationConnection passed with the event behaves the same as if the page had calledstart.
<!-- 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 =newPresentationRequest(presUrls); navigator.presentation.defaultRequest.onconnectionavailable =function(evt) {setConnection(evt.connection); };</script> Once a presentation has started, the returnedPresentationConnection is used to monitor its state and exchange messages with it. Typically the user will be given the choice to disconnect from or terminate the presentation from the controlling page.
Since the the controlling page may connect to and disconnect from multiple presentations during its lifetime, it's helpful to keep track of the currentPresentationConnection and its state. Messages can only be sent and received on connections in aconnected state.
<!-- controller.html --><buttonid="disconnectBtn"style="display: none;">Disconnect</button><buttonid="stopBtn"style="display: none;">Stop</button><script>let connection;// The Disconnect and Stop buttons are visible if there is a connected presentationconst stopBtn =document.querySelector("#stopBtn");const disconnectBtn =document.querySelector("#disconnectBtn"); stopBtn.onclick =_ => { connection && connection.terminate(); }; disconnectBtn.onclick =_ => { connection && connection.close(); };functionsetConnection(newConnection) {// Disconnect from existing presentation, if not attempting to reconnectif (connection && connection != newConnection && connection.state !='closed') { connection.onclose =undefined; connection.close(); }// Set the new connection and save the presentation ID connection = newConnection;localStorage["presId"] = connection.id;functionshowConnectedUI() {// Allow the user to disconnect from or terminate the presentation stopBtn.style.display ="inline"; disconnectBtn.style.display ="inline"; reconnectBtn.style.display ="none"; }functionshowDisconnectedUI() { disconnectBtn.style.display ="none"; stopBtn.style.display ="none"; reconnectBtn.style.display =localStorage["presId"] ?"inline" :"none"; }// Monitor the connection state connection.onconnect =_ => {showConnectedUI();// Register message handler connection.onmessage =message => {console.log(`Received message:${message.data}`); };// Send initial message to presentation page connection.send("Say hello"); }; connection.onclose =_ => { connection =null;showDisconnectedUI(); }; connection.onterminate =_ => {// Remove presId from localStorage if existsdeletelocalStorage["presId"]; connection =null;showDisconnectedUI(); }; };</script> This code runs on the presented page (https://example.org/presentation.html). Presentations may be connected to from multiple controlling pages, so it's important that the presented page listen for incoming connections on theconnectionList object.
<!-- presentation.html --><script>var addConnection =function(connection) { connection.onmessage =function (message) {if (message.data =="Say hello") connection.send("hello"); }; }; navigator.presentation.receiver.connectionList.then(function (list) { list.connections.map(function (connection) {addConnection(connection); }); list.onconnectionavailable =function (evt) {addConnection(evt.connection); }; });</script><!-- controller.html --><script> connection.send('{"string": "你好,世界!", "lang": "zh-CN"}'); connection.send('{"string": "こんにちは、世界!", "lang": "ja"}'); connection.send('{"string": "안녕하세요, 세계!", "lang": "ko"}'); connection.send('{"string": "Hello, world!", "lang": "en-US"}');</script><!-- presentation.html --><script> connection.onmessage =function (message) {var messageObj =JSON.parse(message.data);var spanElt =document.createElement("SPAN"); spanElt.lang = messageObj.lang; spanElt.textContent = messageObj.string;document.body.appendChild(spanElt); };</script>It's possible for a controlling page to start and control two independent presentations on two different presentation displays. This code shows how a second presentation can be added to the first one in the examples above.
<!-- controller.html --><!-- The same controlling page can create and manage multiple presentations, by calling start() multiple times. --><buttonid="secondPresentBtn"style="display: none;">Present Again</button><script>var secondPresentBtn =document.getElementById("secondPresentBtn");var secondPresUrl ="https://example.com/second-presentation.html";var secondRequest =newPresentationRequest(secondPresUrl);// For simplicity, the logic to handle screen availability for secondRequest// and update the status of secondPresentBtn is omitted. secondPresentBtn.onclick =function () {// Start new presentation, likely on a different screen than the original// request. secondRequest.start().then(setSecondConnection); };functionsetSecondConnection(newConnection) {// Logic to handle messages to/from second-presentation.html. };</script>Apresentation display refers to a graphical and/or audio output device available to the user agent via an implementation specific connection technology.
Apresentation connection is an object relating acontrolling browsing context to itsreceiving browsing context and enables two-way-messaging between them. Eachpresentation connection has apresentation connection state, a uniquepresentation identifier to distinguish it from otherpresentations, and apresentation URL that is aURL used to create or reconnect to thepresentation. Avalid presentation identifier consists of alphanumeric ASCII characters only and is at least 16 characters long.
Somepresentation 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 anavailable presentation display for apresentation URL if thecontrolling user agent can reasonably guarantee that presentation of the URL on that display will succeed.
A controlling browsing context (orcontroller for short) is abrowsing context that has connected to apresentation by callingstart orreconnect, or received apresentation connection via aconnectionavailable event. In algorithms forPresentationRequest, thecontrolling browsing context is thebrowsing context whoseJavaScript realm was used to construct thePresentationRequest.
The receiving browsing context (orpresentation for short) is the browsing context responsible for rendering to apresentation display. Areceiving browsing context can reside in the same user agent as thecontrolling browsing context or a different one. Areceiving browsing context is created by following the steps tocreate a receiving browsing context.
In a procedure, thedestination browsing context is thereceiving browsing context when the procedure is initiated at thecontrolling browsing context, or thecontrolling browsing context if it is initiated at thereceiving browsing context.
Theset of controlled presentations, initially empty, contains thepresentation connections created by thecontrolling browsing contexts for thecontrolling user agent (or a specific user profile within that user agent). Theset of controlled presentations is represented by a list ofPresentationConnection objects that represent the underlyingpresentation connections. SeveralPresentationConnection objects may share the samepresentation URL andpresentation identifier in that set, but there can be only onePresentationConnection with a specificpresentation URL andpresentation identifier for a givencontrolling browsing context.
Theset of presentation controllers, initially empty, contains thepresentation connections created by areceiving browsing context for thereceiving user agent. Theset of presentation controllers is represented by a list ofPresentationConnection objects that represent the underlyingpresentation connections. Allpresentation connections in this set share the samepresentation URL andpresentation identifier.
In areceiving browsing context, thepresentation controllers monitor, initially set tonull, exposes the currentset of presentation controllers to the receiving application. Thepresentation controllers monitor is represented by aPresentationConnectionList.
In areceiving browsing context, thepresentation controllers promise, which is initially set tonull, provides thepresentation controllers monitor once the initialpresentation connection is established. Thepresentation controllers promise is represented by aPromise that resolves with thepresentation controllers monitor.
In acontrolling browsing context, thedefault presentation request, which is initially set tonull, represents the request to use when the user wishes to initiate apresentation connection from the browser chrome.
Thetask source for the tasks mentioned in this specification is thepresentation task source.
When an algorithmqueues a Presentation API taskT, theuser agentMUSTqueue a global taskT on thepresentation task source using theglobal object of thecurrent realm.
Unless otherwise specified, theJavaScript realm for script objects constructed by algorithm steps is thecurrent realm.
WebIDLpartial interfaceNavigator { [SecureContext,SameObject] readonly attributePresentationpresentation;};[SecureContext,Exposed=Window]interfacePresentation {}; Thepresentation attribute is used to retrieve an instance of thePresentation interface. ItMUST return thePresentation instance.
Controlling user agentsMUST implement the following partial interface:
WebIDLpartial interfacePresentation { attributePresentationRequest?defaultRequest;}; ThedefaultRequest attributeMUST return thedefault presentation request if any,null otherwise. On setting, thedefault presentation requestMUST be set to the new value.
Thecontrolling user agentSHOULD initiate presentation using thedefault presentation request only when the user has expressed an intention to do so via a user gesture, for example by clicking a button in the browser chrome.
To initiate presentation using thedefault presentation request, thecontrolling user agentMUST follow the steps tostart a presentation from a default presentation request.
Support for initiating a presentation using thedefault presentation request isOPTIONAL.
defaultRequest.Receiving user agentsMUST implement the following partial interface:
WebIDLpartial interfacePresentation { readonly attributePresentationReceiver?receiver;}; Thereceiver attributeMUST return thePresentationReceiver instance associated with thereceiving browsing context and created by thereceiving user agent when thereceiving browsing context iscreated. In any otherbrowsing context (includingchild navigables of thereceiving browsing context) itMUST returnnull.
Web developers can usenavigator.presentation.receiver to detect when a document is loaded as a presentation.
WebIDL[SecureContext,Exposed=Window]interfacePresentationRequest :EventTarget {constructor(USVStringurl);constructor(sequence<USVString>urls);Promise<PresentationConnection>start();Promise<PresentationConnection>reconnect(USVStringpresentationId);Promise<PresentationAvailability>getAvailability(); attributeEventHandleronconnectionavailable;}; APresentationRequest object is associated with a request to initiate or reconnect to a presentation made by acontrolling browsing context. ThePresentationRequest objectMUST be implemented in acontrolling browsing context provided by acontrolling user agent.
When aPresentationRequest is constructed, the givenurlsMUST be used as the list ofpresentation request URLs which are each a possiblepresentation URL for thePresentationRequest instance.
PresentationRequest When thePresentationRequest constructor is called, thecontrolling user agentMUST run these steps:
PresentationRequest objectSecurityError and abort these steps.NotSupportedError and abort all remaining steps.SyntaxError exception and abort all remaining steps.NotSupportedError and abort all remaining steps.SecurityError and abort these steps.PresentationRequest object withpresentationUrls as itspresentation request URLs and return it. When thestart method is called, theuser agentMUST run the following steps toselect a presentation display.
PresentationRequest object that received the call tostartPromisePromise rejected with anInvalidAccessError exception and abort these steps.Promise from a previous call tostart intopContext or anybrowsing context in thedescendant navigables oftopContext, return a newPromise rejected with anOperationError exception and abort all remaining steps.Promise.NotFoundError exception.NotAllowedError exception, and abort all remaining steps.When the user expresses an intent to start presentation of a document on a presentation display using the browser chrome (via a dedicated button, user gesture, or other signal), that user agentMUST run the following steps tostart a presentation from a default presentation request. If nodefault presentation request is set on the document, these stepsMUST not be run.
null value ofnavigator.presentation.defaultRequest set onWWhen theuser agent is tostart a presentation connection, itMUST run the following steps:
PresentationRequest that is used to start the presentation connectionPromise that will be resolved with a newpresentation connectionPresentationConnectionS.connecting.connectionavailable, that uses thePresentationConnectionAvailableEvent interface, with theconnection attribute initialized toS, atpresentationRequest. The event must not bubble and must not be cancelable.error ascloseReason, and a human readable message describing the failure ascloseMessage.http orhttps schemes; behavior for other schemes is not defined by this specification. When thereconnect method is called, theuser agentMUST run the following steps to reconnect to a presentation:
PresentationRequest object thatreconnect was called onPromisePromise.PresentationConnection that meets the following criteria:terminatedPresentationConnection exists, run the following steps:PresentationConnection.connecting orconnected, then abort all remaining steps.connecting.PresentationConnection that meets the following criteria:terminatedPresentationConnection exists, run the following steps:PresentationConnection.PresentationConnectionnewConnection.connecting.connectionavailable, that uses thePresentationConnectionAvailableEvent interface, with theconnection attribute initialized tonewConnection, atpresentationRequest. The event must not bubble and must not be cancelable.NotFoundError exception. 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 thePresentationRequest interface:
| Event handler | Event handler event type |
|---|---|
onconnectionavailable | connectionavailable |
WebIDL[SecureContext,Exposed=Window]interfacePresentationAvailability :EventTarget { readonly attributebooleanvalue; attributeEventHandleronchange;}; APresentationAvailability object exposes thepresentation display availability for a presentation request. Thepresentation display availability for aPresentationRequest stores whether there is currently anyavailable presentation display for at least one of thepresentation request URLs of the request.
Thepresentation display availability for a presentation request is eligible for garbage collection when no ECMASCript code can observe thePresentationAvailability object.
If thecontrolling user agent canmonitor the list of available presentation displays in the background (without a pending request tostart), thePresentationAvailability objectMUST be implemented in acontrolling browsing context.
Thevalue attributeMUST return the last value it was set to. The value is initialized and updated by themonitor the list of available presentation displays algorithm.
Theonchange attribute is anevent handler whose correspondingevent handler event type ischange.
Theuser agentMUST keep track of theset of presentation availability objects created by thegetAvailability method. Theset of presentation availability objects is represented as a set of tuples(A,availabilityUrls), initially empty, where:
PresentationAvailability object.PresentationRequest whengetAvailability was called on it to createA.Theuser agentMUST keep alist of available presentation displays. Thelist of available presentation displays is represented by a list of tuples(availabilityUrl, display). An entry in this list means thatdisplay is currently anavailable presentation display foravailabilityUrl. This list ofpresentation 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 tomonitor the list of available presentation displays.
While theset of presentation availability objects is not empty, theuser agentMAYmonitor the list of available presentation displays continuously, so that pages can use thevalue property of aPresentationAvailability object to offer presentation only when there are available displays. However, theuser agent may not support continuous availability monitoring in the background; for example, because of platform or power consumption restrictions. In this case thePromise returned bygetAvailability isrejected, and the algorithm tomonitor the list of available presentation displays will only run as part of theselect a presentation display algorithm.
When theset of presentation availability objects is empty (that is, there are noavailabilityUrls being monitored), user agentsSHOULD NOTmonitor the list of available presentation displays to satisfy the power saving non-functional requirement. To further save power, theuser agentMAY also keep track of whether a page holding aPresentationAvailability object is in the foreground. Using this information, implementation specific discovery ofpresentation displays can be resumed or suspended.
When thegetAvailability method is called, the user agentMUST run the following steps:
PresentationRequest object that received the call togetAvailabilityPromisePromise constructed in theJavaScript realm ofpresentationRequest.NotSupportedError exception.null, then:PresentationAvailability object constructed in theJavaScript realm ofpresentationRequest, and letA be that object.If theset of presentation availability objects is non-empty, or there is a pending request toselect a presentation display, theuser agentMUSTmonitor the list of available presentation displays by running the following steps:
PresentationRequest and if thePresentationRequest'spresentation display availability isnull, then run the following substeps:PresentationAvailability object.PresentationRequest'spresentation request URLs and add it toavailabilitySet.value property.false.true.value property has not yet been initialized, then setA'svalue property tonewAvailability and skip the following step.value property tonewAvailability.change atA.start andgetAvailability, and aggregating them acrossbrowsing contexts.When apresentation display availability object is eligible for garbage collection, theuser agentSHOULD run the following steps:
PresentationAvailability objectWebIDL[SecureContext,Exposed=Window]interfacePresentationConnectionAvailableEvent :Event {constructor(DOMStringtype,PresentationConnectionAvailableEventIniteventInitDict); [SameObject] readonly attributePresentationConnectionconnection;};dictionaryPresentationConnectionAvailableEventInit :EventInit { requiredPresentationConnectionconnection;}; Acontrolling user agentfires an event namedconnectionavailable on aPresentationRequest when a connection associated with the object is created. It is fired at thePresentationRequest instance, using thePresentationConnectionAvailableEvent interface, with theconnection attribute set to thePresentationConnection object that was created. The event is fired for each connection that is created for thecontroller, either by thecontroller callingstart orreconnect, or by thecontrolling user agent creating a connection on the controller's behalf viadefaultRequest.
Areceiving user agentfires an event namedconnectionavailable on aPresentationReceiver when an incoming connection is created. It is fired at thepresentation controllers monitor, using thePresentationConnectionAvailableEvent interface, with theconnection attribute set to thePresentationConnection object that was created. The event is fired for all connections that are created whenmonitoring incoming presentation connections.
Theconnection attributeMUST return the value it was set to when thePresentationConnection object was created.
When thePresentationConnectionAvailableEvent constructor is called, theuser agentMUST construct a newPresentationConnectionAvailableEvent object with itsconnection attribute set to theconnection member of thePresentationConnectionAvailableEventInit object passed to the constructor.
Eachpresentation connection is represented by aPresentationConnection object. Both thecontrolling user agent andreceiving user agentMUST implementPresentationConnection.
WebIDLenumPresentationConnectionState {"connecting","connected","closed","terminated" };[SecureContext,Exposed=Window]interfacePresentationConnection :EventTarget { readonly attributeUSVStringid; readonly attributeUSVStringurl; readonly attributePresentationConnectionStatestate;undefinedclose();undefinedterminate(); attributeEventHandleronconnect; attributeEventHandleronclose; attributeEventHandleronterminate; // CommunicationattributeBinaryTypebinaryType; attributeEventHandleronmessage;undefinedsend (DOMStringmessage);undefinedsend (Blobdata);undefinedsend (ArrayBufferdata);undefinedsend (ArrayBufferViewdata);}; Theid attribute specifies thepresentation connection'spresentation identifier.
Theurl attribute specifies thepresentation connection'spresentation URL.
Thestate attribute represents thepresentation connection's current state. It can take one of the values ofPresentationConnectionState depending on the connection state:
connecting means that the user agent is attempting toestablish a presentation connection with thedestination browsing context. This is the initial state when aPresentationConnection object is created.connected means that thepresentation connection is established and communication is possible.closed means that thepresentation connection has been closed, or could not be opened. It may be re-opened through a call toreconnect. No communication is possible.terminated means that thereceiving browsing context has been terminated. Anypresentation connection to thatpresentation is also terminated and cannot be re-opened. No communication is possible.connected state does not mean that sending or receiving messages will succeed, as the communication channel may be abruptly closed at any time. Applications that wish to detect such situations as soon as possible should implement their own keep-alive mechanism. When theclose method is called on aPresentationConnectionS, theuser agentMUSTstart closing the presentation connectionS withclosed ascloseReason and an empty message ascloseMessage.
When theterminate method is called on aPresentationConnectionS in acontrolling browsing context, theuser agentMUST run the algorithm toterminate a presentation in a controlling browsing context usingS.
When theterminate method is called on aPresentationConnectionS in areceiving browsing context, theuser agentMUST run the algorithm toterminate a presentation in a receiving browsing context usingS.
ThebinaryType attribute can take one of the values ofBinaryType. When aPresentationConnection object is created, itsbinaryType attributeMUST be set to the string "arraybuffer". On getting, itMUST return the last value it was set to. On setting, the user agentMUST set the 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 inBlob form; by setting it to "arraybuffer", it is returned inArrayBuffer form. The attribute defaults to "arraybuffer". This attribute has no effect on data sent in a string form. When thesend method is called on aPresentationConnectionS, theuser agentMUST run the algorithm tosend a message throughS.
When aPresentationConnection objectS is discarded (because the document owning it is navigating or is closed) while thepresentation connection state ofS isconnecting orconnected, theuser agentMUSTstart closing the presentation connectionS withwentaway ascloseReason and an emptycloseMessage.
If theuser agent receives a signal from thedestination browsing context that aPresentationConnectionS is to be closed, itMUSTclose the presentation connectionS withclosed orwentaway ascloseReason and an emptycloseMessage.
When theuser agent is toestablish a presentation connection using apresentation connection, itMUST run the following steps:
PresentationConnection object that is to be connectedconnecting, then abort all remaining steps.connected.connect atpresentationConnection.error ascloseReason, and a human readable message describing the failure ascloseMessage.DOMString and binary payloads in a reliable and in-order fashion as described in theSend a Message andReceive a Message steps below.PresentationConnectionsend it has to be ensured that messages are delivered to the other end reliably and in sequence. The transport should function equivalently to anRTCDataChannel in reliable mode. Letpresentation message data be the payload data to be transmitted between two browsing contexts. Letpresentation message type be the type of that data, one oftext orbinary.
When theuser agent is tosend a message through apresentation connection, itMUST run the following steps:
state property ofpresentationConnection is notconnected,throw anInvalidStateError exception.binary ifmessageOrData is of typeArrayBuffer,ArrayBufferView, orBlob. LetmessageType betext ifmessageOrData is of typeDOMString.error ascloseReason, and acloseMessage describing the error encountered.To assist applications in recovery from an error sending a message through apresentation connection, the user agent should include details of which attempt failed incloseMessage, along with a human readable string explaining the failure reason. Example renditions ofcloseMessage:
Unable to send text message (network_error): "hello" forDOMString messages, where"hello" is the first 256 characters of the failed message.Unable to send binary message (invalid_message) forArrayBuffer,ArrayBufferView andBlob messages.PresentationConnection When theuser agent has received a transmission from the remote side consisting ofpresentation message data andpresentation message type, itMUST run the following steps toreceive a message through aPresentationConnection:
state property ofpresentationConnection is notconnected, abort these steps.MessageEvent interface, with the event typemessage, which does not bubble and is not cancelable.text, then initializeevent'sdata attribute tomessageData with typeDOMString.binary, andbinaryType attribute is set to "blob", then initializeevent'sdata attribute to a newBlob object withmessageData as its raw data.binary, andbinaryType attribute is set to "arraybuffer", then initializeevent'sdata attribute to a newArrayBuffer object whose contents aremessageData. If theuser agent encounters an unrecoverable error whilereceiving a message throughpresentationConnection, itMUST abruptlyclose the presentation connectionpresentationConnection witherror ascloseReason. ItSHOULD use a human readable description of the error encountered ascloseMessage.
WebIDLenumPresentationConnectionCloseReason {"error","closed","wentaway" };[SecureContext,Exposed=Window]interfacePresentationConnectionCloseEvent :Event {constructor(DOMStringtype,PresentationConnectionCloseEventIniteventInitDict); readonly attributePresentationConnectionCloseReasonreason; readonly attributeDOMStringmessage;};dictionaryPresentationConnectionCloseEventInit :EventInit { requiredPresentationConnectionCloseReasonreason;DOMStringmessage = "";}; APresentationConnectionCloseEvent is fired when apresentation connection enters aclosed state. Thereason attribute provides the reason why the connection was closed. It can take one of the values ofPresentationConnectionCloseReason:
error means that the mechanism for connecting or communicating with a presentation entered an unrecoverable error.closed means that either thecontrolling browsing context or thereceiving 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 thereason attribute iserror, the user agentSHOULD set themessage attribute to a human readable description of how the communication channel encountered an error.
When thePresentationConnectionCloseEvent constructor is called, theuser agentMUST construct a newPresentationConnectionCloseEvent object, with itsreason attribute set to thereason member of thePresentationConnectionCloseEventInit object passed to the constructor, and itsmessage attribute set to themessage member of thisPresentationConnectionCloseEventInit object if set, to an empty string otherwise.
PresentationConnectionWhen theuser agent is tostart closing a presentation connection, itMUST do the following:
PresentationConnectionCloseReason describing why the connection is to be closedconnecting orconnected then abort the remaining steps.closed.PresentationConnection, passing thecloseReason 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.wentaway, then locally run the steps toclose the presentation connection withpresentationConnection,closeReason, andcloseMessage.When theuser agent is toclose a presentation connection, itMUST do the following:
PresentationConnectionCloseReason describing why the connection is to be closedconnecting,connected, orclosed, then abort the remaining steps.closed, set it toclosed.close, that uses thePresentationConnectionCloseEvent interface, with thereason attribute initialized tocloseReason and themessage attribute initialized tocloseMessage, atpresentationConnection. The event must not bubble and must not be cancelable.When acontrolling user agent is toterminate a presentation in a controlling browsing context usingconnection, itMUST run the following steps:
connected orconnecting, then abort these steps.connected orconnecting, thenqueue a global task on thepresentation task source givenknown connection'srelevant global object to run the following steps:terminated.terminate at known connection.When any of the following occur, thereceiving user agentMUSTterminate a presentation in a receiving browsing context:
This could happen by an explicit user action, or as a policy of the user agent. For example, thereceiving user agent could be configured to terminate presentations whosePresentationConnection objects are all closed for 30 minutes.
When areceiving user agent is toterminate a presentation in a receiving browsing context, itMUST run the following steps:
connected, then addconnection toconnectedControllers.terminated.Only one termination confirmation needs to be sent percontrolling user agent.
When areceiving user agent is to send a termination confirmation for a presentationP, and that confirmation was received by acontrolling user agent, thecontrolling user agentMUST run the following steps:
connected orconnecting, then abort the following steps.terminated.terminate atconnection. 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 thePresentationConnection interface:
| Event handler | Event handler event type |
|---|---|
onmessage | message |
onconnect | connect |
onclose | close |
onterminate | terminate |
WebIDL[SecureContext,Exposed=Window]interfacePresentationReceiver { readonly attributePromise<PresentationConnectionList>connectionList;}; ThePresentationReceiver interface allows areceiving browsing context to access thecontrolling browsing contexts and communicate with them. ThePresentationReceiver interfaceMUST be implemented in areceiving browsing context provided by areceiving user agent.
On getting, theconnectionList attributeMUST return the result of running the following steps:
null, return thepresentation controllers promise and abort all remaining steps.Promise constructed in theJavaScript realm of thisPresentationReceiver object.null,resolve thepresentation controllers promise with thepresentation controllers monitor.When theuser agent is tocreate a receiving browsing context, itMUST run the following steps:
"denied".Cache objects forC.Allchild navigablescreated by the presented document, i.e. that have thereceiving browsing context as theirtop-level browsing context,MUST also have restrictions 2-4 above. In addition, theyMUST have thesandboxed top-level navigation without user activation browsing context flag set. All of thesebrowsing contextsMUST also share the same browsing state (storage) for features 5-10 listed above.
When thetop-level browsing context attempts to navigate to a new resource and runs thesteps to navigate, itMUST follow step 1 to determine if it isallowed to navigate. In addition, itMUST NOT be allowed to navigate itself to a new resource, except bynavigating to a fragment identifier or byreloading its document.
This allows the user to grant permission based on the origin of the presentation URL shown whenselecting a presentation display.
If the top-level-browsing context was notallowed to navigate, itSHOULD NOT offer to open the resource in a newtop-level browsing context, but otherwiseSHOULD be consistent with thesteps to navigate.
Window clients andworker clients associated with thereceiving browsing context and itsdescendant navigables must not be exposed toservice workers associated with each other.
When thereceiving browsing context is terminated, anyservice workers associated with it and thebrowsing contexts in itsdescendant navigablesMUST be unregistered and terminated. Any browsing state associated with thereceiving browsing context and thebrowsing contexts in itsdescendant navigables, includingsession history, thecookie store, anyHTTP authentication state, anydatabases, thesession storage areas, thelocal storage areas, the list of registeredservice worker registrations and theCache objectsMUST be discarded and not used for any otherbrowsing context.
This algorithm is intended to create a well defined environment to allow interoperable behavior for1-UA and2-UA presentations, and to minimize the amount of state remaining on apresentation display used for a2-UA presentation.
Thereceiving user agentSHOULD fetch resources in areceiving browsing context with an HTTPAccept-Language header that reflects the language preferences of thecontrolling user agent (i.e., with the sameAccept-Language that the controlling user agent would have sent). This will help thereceiving user agent render the presentation with fonts and locale-specific attributes that reflect the user's preferences.
Given the operating context of thepresentation display, some Web APIs will not work by design (for example, by requiring user input) or will be obsolete (for example, by attempting window management); thereceiving user agent should be aware of this. Furthermore, any modal user interface will need to be handled carefully. Thesandboxed modals flag is set on thereceiving browsing context to prevent most of these operations.
As noted inConformance, a user agent that is both acontrolling user agent andreceiving user agent may allow areceiving browsing context to create additional presentations (thus becoming acontrolling browsing context as well). Web developers can usenavigator.presentation.receiver to detect when a document is loaded as a receiving browsing context.
WebIDL[SecureContext,Exposed=Window]interfacePresentationConnectionList :EventTarget { readonly attributeFrozenArray<PresentationConnection>connections; attributeEventHandleronconnectionavailable;}; Theconnections attributeMUST return the non-terminated set ofpresentation connections in theset of presentation controllers.
When thereceiving user agent is to startmonitoring incoming presentation connections in areceiving browsing context fromcontrolling browsing contexts, itMUST listen to and accept incoming connection requests from acontrolling browsing context using an implementation specific mechanism. When a new connection request is received from acontrolling browsing context, thereceiving user agentMUST run the following steps:
PresentationConnectionS.connected. Otherwise, set thepresentation connection state ofS toclosed and abort all remaining steps.null, run the following stepsin parallel.PresentationConnectionList constructed in theJavaScript realm of thePresentationReceiver object of thereceiving browsing context.null,queue a Presentation API task to resolve thepresentation controllers promise with thepresentation controllers monitor.connectionavailable, that uses thePresentationConnectionAvailableEvent interface, with theconnection attribute initialized toS, at thepresentation controllers monitor. The event must not bubble and must not be cancelable. 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 thePresentationConnectionList interface:
| Event handler | Event handler event type |
|---|---|
onconnectionavailable | connectionavailable |
This section is non-normative.
Thechange event fired on thePresentationAvailability object reveals one bit of information about the presence or absence of apresentation display, often discovered through the browser's 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 enablesmonitoring the list of available presentation displays. How the user agent determines the compatibility and availability of apresentation display with a given URL is an implementation detail. If acontrolling user agent matches apresentation request URL to aDIAL application to determine its availability, this feature can be used to probe information about whichDIAL applications the user has installed on thepresentation display without user consent.
Apresentation is allowed to be accessed across origins; thepresentation URL andpresentation identifier used to create the presentation are the only information needed to reconnect to a presentation from any origin in the controlling user agent. In other words, a presentation is not tied to a particular opening origin.
This design allows controlling contexts from different origins to connect to a shared presentation resource. The security of the presentation identifier prevents arbitrary origins from connecting to an existing presentation.
This specification also allows areceiving user agent to publish information about itsset of controlled presentations, and acontrolling user agent to reconnect to presentations started from other devices. This is possible when thecontrolling browsing context obtains thepresentation URL andpresentation identifier of a running presentation from the user, local storage, or a server, and then connects to the presentation viareconnect.
This specification makes no guarantee as to the identity of any party connecting to a presentation. Once connected, the presentation may wish to further verify the identity of the connecting party through application-specific means. For example, the presentation could challenge the controller to provide a token viasend that the presentation uses to verify identity and authorization.
When the user is asked permission to use apresentation display during the steps toselect a presentation display, thecontrolling user agent should make it clear what origin is requesting presentationand 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 achild navigable. For example, embedded content may try to convince the user to click to trigger a request to start an unwanted presentation.
Thesandboxed top-level navigation without user activation browsing context flag is set on thereceiving browsing context to enforce that the top-level origin of the presentation remains the same during the lifetime of the presentation.
When a userstarts 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 connectedcontrolling 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 thereceiving user agent is capable of receiving user input, as well as acting as apresentation display. In this case, thereceiving user agent should notify its user via browser chrome when areceiving browsing context is under the control of a remote party (i.e., it has one or more connected controllers).
The presentation API abstracts away what "local" means for displays, meaning that it exposes network-accessible displays as though they were directly attached to the user's device. 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.
Thepresentation URL andpresentation identifier 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.
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 thecontrolling browsing context, they will not be automatically logged out from thereceiving 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 initialset of controlled presentations in that browsing session must be empty. Anypresentation connections added to it must be discarded when the session terminates.
This spec will not mandate communication protocols between thecontrolling browsing context and thereceiving browsing context, but it should set some guarantees of message confidentiality and authenticity between correspondingpresentation connections.
WebIDLpartial interfaceNavigator { [SecureContext,SameObject] readonly attributePresentationpresentation;};[SecureContext,Exposed=Window]interfacePresentation {};partial interfacePresentation { attributePresentationRequest?defaultRequest;};partial interfacePresentation { readonly attributePresentationReceiver?receiver;};[SecureContext,Exposed=Window]interfacePresentationRequest :EventTarget {constructor(USVStringurl);constructor(sequence<USVString>urls);Promise<PresentationConnection>start();Promise<PresentationConnection>reconnect(USVStringpresentationId);Promise<PresentationAvailability>getAvailability(); attributeEventHandleronconnectionavailable;};[SecureContext,Exposed=Window]interfacePresentationAvailability :EventTarget { readonly attributebooleanvalue; attributeEventHandleronchange;};[SecureContext,Exposed=Window]interfacePresentationConnectionAvailableEvent :Event {constructor(DOMStringtype,PresentationConnectionAvailableEventIniteventInitDict); [SameObject] readonly attributePresentationConnectionconnection;};dictionaryPresentationConnectionAvailableEventInit :EventInit { requiredPresentationConnectionconnection;};enumPresentationConnectionState {"connecting","connected","closed","terminated" };[SecureContext,Exposed=Window]interfacePresentationConnection :EventTarget { readonly attributeUSVStringid; readonly attributeUSVStringurl; readonly attributePresentationConnectionStatestate;undefinedclose();undefinedterminate(); attributeEventHandleronconnect; attributeEventHandleronclose; attributeEventHandleronterminate; // CommunicationattributeBinaryTypebinaryType; attributeEventHandleronmessage;undefinedsend (DOMStringmessage);undefinedsend (Blobdata);undefinedsend (ArrayBufferdata);undefinedsend (ArrayBufferViewdata);};enumPresentationConnectionCloseReason {"error","closed","wentaway" };[SecureContext,Exposed=Window]interfacePresentationConnectionCloseEvent :Event {constructor(DOMStringtype,PresentationConnectionCloseEventIniteventInitDict); readonly attributePresentationConnectionCloseReasonreason; readonly attributeDOMStringmessage;};dictionaryPresentationConnectionCloseEventInit :EventInit { requiredPresentationConnectionCloseReasonreason;DOMStringmessage = "";};[SecureContext,Exposed=Window]interfacePresentationReceiver { readonly attributePromise<PresentationConnectionList>connectionList;};[SecureContext,Exposed=Window]interfacePresentationConnectionList :EventTarget { readonly attributeFrozenArray<PresentationConnection>connections; attributeEventHandleronconnectionavailable;};binaryType attribute forPresentationConnection§6.5close method forPresentationConnection§6.5"connected" enum value forPresentationConnectionState§6.5"connecting" enum value forPresentationConnectionState§6.5connectionList attribute forPresentationReceiver§6.6connections attribute forPresentationConnectionList§6.7defaultRequest attribute forPresentation§6.2.1"error" enum value forPresentationConnectionCloseReason§6.5.4getAvailability method forPresentationRequest§6.4.3id attribute forPresentationConnection§6.5onchange attribute forPresentationAvailability§6.4onclose attribute forPresentationConnection§6.5.9onconnect attribute forPresentationConnection§6.5.9onmessage attribute forPresentationConnection§6.5.9onterminate attribute forPresentationConnection§6.5.9presentation attribute forNavigator§6.2Presentation interface§6.2PresentationAvailability interface§6.4PresentationConnection interface§6.5PresentationConnectionAvailableEvent interface§6.4.5PresentationConnectionAvailableEventInit dictionary§6.4.5PresentationConnectionCloseEvent interface§6.5.4PresentationConnectionCloseEventInit dictionary§6.5.4PresentationConnectionCloseReason enum§6.5.4PresentationConnectionList interface§6.7PresentationConnectionState enum§6.5PresentationReceiver interface§6.6PresentationRequest interface§6.3receiver attribute forPresentation§6.2.2reconnect method forPresentationRequest§6.3.5send method forPresentationConnection§6.5start method forPresentationRequest§6.3.2state attribute forPresentationConnection§6.5terminate method forPresentationConnection§6.5"terminated" enum value forPresentationConnectionState§6.5url attribute forPresentationConnection§6.5value attribute forPresentationAvailability§6.4"wentaway" enum value forPresentationConnectionCloseReason§6.5.4Event interfaceEventInitEventTarget interfaceBlob interfaceDocument)navigable)Document)EventHandlerlocalStorage attribute (forWindowLocalStorage)MessageEvent interfaceNavigator interfacereload() (forLocation)sessionStorage attribute (forWindowSessionStorage)Cache interfaceArrayBuffer interfaceArrayBufferViewboolean typeDOMString interface[Exposed] extended attributeFrozenArray interfaceInvalidAccessError exceptionInvalidStateError exceptionNotAllowedError exceptionNotFoundError exceptionNotSupportedError exceptionOperationError exceptionPromise interface[SameObject] extended attribute[SecureContext] extended attributeSecurityError exceptionSyntaxError exceptionexception)undefined typeUSVString interfaceRTCDataChannel interfaceBinaryType enumThanks to Addison Phillips, Anne Van Kesteren, Anssi Kostiainen, Anton Vayvod, Chris Needham, Christine Runnegar, Daniel Davis, Domenic Denicola, Erik Wilde, François Daoust, 闵洪波 (Hongbo Min), Hongki CHA, Hubert Sablonnière, Hyojin Song, Hyun June Kim, Jean-Claude Dufourd, Joanmarie Diggs, Jonas Sicking, Louay Bassbouss, Mark Watson, Martin Dürst, Matt Hammond, Mike West, Mounir Lamouri, Nick Doty, Oleg Beletski, Philip Jägenstedt, Richard Ishida, Shih-Chiang Chien, Takeshi Kanai, Tobie Langel, Tomoyuki Shimizu, Travis Leithead, and Wayne Carr for help with editing, reviews and feedback to this draft.
AirPlay,HDMI,Chromecast,DLNA andMiracast are registered trademarks of Apple Inc., HDMI Licensing LLC., Google Inc., the Digital Living Network Alliance, and the Wi-Fi Alliance, respectively. They are only cited as background information and their use is not required to implement the specification.
For this specification to be advanced to Proposed Recommendation, there must be, for each of the conformance classes it defines (controlling user agent andreceiving user agent), at least two independent, interoperable implementations of each feature. Each feature may be implemented by a different set of products, there is no requirement that all features be implemented by a single product. Additionally, implementations of thecontrolling user agent conformance class must include at least one implementation of the1-UA mode, and one implementation of the2-UA mode.2-UA mode implementations may only support non http/https presentation URLs. Implementations of thereceiving user agent conformance class may not include implementations of the2-UA mode.
The API was recently restricted to secure contexts. Deprecation of the API in non secure contexts in early implementations takes time. The group may request transition to Proposed Recommendation with implementations that still expose the API in non secure contexts, provided there exists a timeline to restrict these implementations in the future.
For the purposes of these criteria, we define the following terms:
This section is non-normative.
This section lists changes made to the spec since it was first published as Candidate Recommendation in July 2016, with links to related issues on the group's issue tracker.
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: