Re: [presentation-api] Allow page to designate a default presentation URL

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