<!DOCTYPE HTML>
<html>
<head>
  <meta charset="utf-8">
  <title>Test for B2G PresentationReceiver at receiver side</title>
</head>
<body>
<div id="content"></div>
<script type="application/javascript;version=1.7">

"use strict";

function is(a, b, msg) {
  alert((a === b ? 'OK ' : 'KO ') + msg);
}

function ok(a, msg) {
  alert((a ? 'OK ' : 'KO ') + msg);
}

function info(msg) {
  alert('INFO ' + msg);
}

function command(msg) {
  alert('COMMAND ' + JSON.stringify(msg));
}

function finish() {
  alert('DONE');
}

var connection;

function testConnectionAvailable() {
  return new Promise(function(aResolve, aReject) {
    ok(navigator.presentation, "navigator.presentation should be available in receiving pages.");
    ok(navigator.presentation.receiver, "navigator.presentation.receiver should be available in receiving pages.");

    navigator.presentation.receiver.connectionList.then(
      function(aList) {
        is(aList.connections.length, 1, "Should get one conncetion.");
        connection = aList.connections[0];
        ok(connection.id, "Connection ID should be set: " + connection.id);
        is(connection.state, "connected", "Connection state at receiver side should be connected.");
        aResolve();
      },
      function(aError) {
        ok(false, "Error occurred when getting the connection list: " + aError);
        finish();
        aReject();
      }
    );
    command({ name: 'trigger-incoming-offer' });
  });
}

function testDefaultRequestIsUndefined() {
  return new Promise(function(aResolve, aReject) {
    is(navigator.presentation.defaultRequest, undefined, "navigator.presentation.defaultRequest should not be available in receiving UA");
    aResolve();
  });
}

function testConnectionAvailableSameOriginInnerIframe() {
  return new Promise(function(aResolve, aReject) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute('src', './file_presentation_receiver_inner_iframe.html');
    document.body.appendChild(iframe);

    aResolve();
  });
}

function testConnectionUnavailableDiffOriginInnerIframe() {
  return new Promise(function(aResolve, aReject) {
    var iframe = document.createElement('iframe');
    iframe.setAttribute('src', 'http://example.com/tests/dom/presentation/tests/mochitest/file_presentation_non_receiver_inner_iframe.html');
    document.body.appendChild(iframe);

    aResolve();
  });
}

function testConnectionListSameObject() {
  return new Promise(function(aResolve, aReject) {
    is(navigator.presentation.receiver.connectionList, navigator.presentation.receiver.connectionList, "The promise should be the same object.");
    var promise = navigator.presentation.receiver.connectionList.then(
      function(aList) {
        is(connection, aList.connections[0], "The connection from list and the one from |connectionavailable| event should be the same.");
        aResolve();
      },
      function(aError) {
        ok(false, "Error occurred when getting the connection list: " + aError);
        finish();
        aReject();
      }
    );
  });
}

function testIncomingMessage() {
  return new Promise(function(aResolve, aReject) {
    const incomingMessage = "test incoming message";

    connection.addEventListener('message', function messageHandler(aEvent) {
      connection.removeEventListener('message', messageHandler);
      is(aEvent.data, incomingMessage, "An incoming message should be received.");
      aResolve();
    });

    command({ name: 'trigger-incoming-message',
              data: incomingMessage });
  });
}

function testCloseConnection() {
  return new Promise(function(aResolve, aReject) {
    connection.onclose = function() {
      connection.onclose = null;
      is(connection.state, "closed", "Connection should be closed.");
      aResolve();
    };

    connection.close();
  });
}

testConnectionAvailable().
then(testDefaultRequestIsUndefined).
then(testConnectionAvailableSameOriginInnerIframe).
then(testConnectionUnavailableDiffOriginInnerIframe).
then(testConnectionListSameObject).
then(testIncomingMessage).
then(testCloseConnection).
then(finish);

</script>
</body>
</html>