<!DOCTYPE html>
<meta charset="utf-8">
<title>Presentation API IDL tests for Receiving User Agent</title>
<link rel="author" title="Tomoyuki Shimizu" href="https://github.com/tomoyukilabs">
<link rel="help" href="http://w3c.github.io/presentation-api/#dfn-receiving-user-agent">
<script src="common.js"></script>
<script src="support/stash.js"></script>

<p>Click the button below and select the available presentation display, to start the manual test.</p>
<button id="presentBtn">Start Presentation Test</button>

<script>
    let connection;
    const presentBtn = document.getElementById('presentBtn');
    presentBtn.onclick = () => {
        presentBtn.disabled = true;
        const stash = new Stash(stashIds.toController, stashIds.toReceiver);
        const request = new PresentationRequest('support/idlharness_receiving-ua.html');

        return request.start().then(c => {
            connection = c;
            return stash.init();
        }).then(() => {
            return stash.receive();
        }).then(result => {
            const json = JSON.parse(result);
            // notify receiver's results of a parent window (e.g. test runner)
            if (window.opener && 'completion_callback' in window.opener) {
                window.opener.completion_callback(json.tests, json.status);
            }
            // display receiver's results as HTML
            const log = document.createElement('div');
            log.id = 'log';
            log.innerHTML = json.log;
            document.body.appendChild(log);

            connection.onconnect = () => { connection.terminate(); };
            if (connection.state === 'closed')
                request.reconnect(connection.id);
            else
                connection.terminate();
        });
    };
</script>
