- From: Anton Vayvod via GitHub <sysbot+gh@w3.org>
- Date: Thu, 02 Jul 2015 13:11:01 +0000
- To: public-secondscreen@w3.org
Hey there, we've come up with the following after discussing with
Mozilla and getting @schien's approval:
```webidl
partial interface NavigatorPresentation {
attribute PresentationRequest defaultRequest = null;
};
[Constructor(DOMString presentationUrl)]
interface PresentationRequest {
readonly attribute DOMString url;
attribute EventHandler onpresentationstart;
Promise<PresentationSession> joinPresentation(DOMString
presentationId);
Promise<PresentationSession> startPresentation();
Promise<Availability> getAvailability();
};
```
So the sender methods have moved to a separate interface,
```PresentationRequest```. The page can create one or more instances
of the interface for different presentation URLs and also use each
request more than once. If the request is assigned to the
defaultRequest, the user agent is able to initiate a presentation
session on behalf of the page and fire ```onpresentationstart``` event
on the appropriate request instance. The event is also fired when
```start/joinPresentation()``` succeed along with the promise being
resolved to ease receiving the new ```PresentationSession``` object by
the page.
The shortest way to start a presentation would be:
```javascript
presBtn.onclick = function(e) {
new PresentationRequest(“example.com/presentation.html”)
.startPresentation().then(handleSession);
}
```
The full example would look like:
```javascript
var presUrl = “www.example.com/presentation.html”;
var mySession;
// One PresentationRequest(presentationUrl) is constructed per each
// PresentationSession the page wants to receive.
var request = PresentationRequest(presUrl);
// event will be fired if the presentation defined by this request is
// started somehow, by the browser or as a result of
startPresentation().
// that way if the web author doesn’t care which way the session was
// started, it can be handled in one place.
request.onpresentationstart = function(evt) {
handleSession(evt.session);
};
// the browser will use this request to start browser initiated
presentation
// (unless user disables it)
navigator.presentation.defaultrequest = request;
// try to join an existing presentation known to the user agent
// and the page via local storage
request.joinPresentation(localStorage["presId"])
.catch(closeSession);
request.getAvailability().then(function(availability) {
...
}).catch (function() {
...
});
document.getElementById("presBtn").onclick = function(e) {
request.startPresentation()
.catch(closeSession);
};
var handleSession = function(session) {
// in case we handle start/joinPresentation promise resolution:
// if (session === mySession) return;
// close existing session, if any
closeSession();
if (!session)
return;
// save presId in localStorage
localStorage && (localStorage["presId"] = session.presentationId);
// monitor channel's state
session.onstatechange = function () {
if (channel.state == "disconnected")
closeChannel();
};
// register message handler
session.onmessage = function(evt) {
console.log("receive message", evt.data);
};
// send message to presentation page
session.send("say hello");
mySession = session;
};
var closeSession = function() {
// close old session if exists
mySession && mySession.close() && mySession = null;
// remove old presId from localStorage if exists
localStorage && delete localStorage["presId"];
};
```
--
GitHub Notif of comment by avayvod
See
https://github.com/w3c/presentation-api/issues/26#issuecomment-118027625
Received on Thursday, 2 July 2015 13:11:08 UTC