<!DOCTYPE html>
<html>
<head>
<style>
    #eventslog {
        font-size: 10px; 
        height: calc(100% - (320px));
        overflow-y: scroll;
        border: 1px solid rgba(147, 128, 108, 0.25);
    }
</style>
    <script>

        let playlist = {
            current: 0,
            metadata: [
                {
                    url: 'video-with-audio.mp4',
                    title: 'Bip Bop With Audio',
                    artist: 'The Bip Bop Authors',
                    album: 'WebKit Greatest Hits',
                    artwork: [

                    ],
                },
                {
                    url: 'video-without-audio.mp4',
                    title: 'Bip Bop Without Audio',
                    artist: 'The Bip Bop Authors',
                    album: 'WebKit Original Test Content',
                    artwork: [

                    ],
                },
            ],
        };

        function setMetadata(data)
        {
            navigator.mediaSession.metadata = new MediaMetadata(data);
            postMessage('set metadata')
        }
        
        function joinSession()
        {
            let promise = navigator.mediaSession.coordinator.join();
            postPromise("join", promise);
        }

        function callMethod(method, args)
        {
            let code = `navigator.mediaSession.coordinator.${method}(${args})`;
            let promise = eval(code);
            postPromise(method, promise);
        }

        function setPlaylistMetadata(index)
        {
            setMetadata(playlist.metadata[index]);
        }

        function clearActionHandlers()
        {
            setEmptyActionHandlers([]);
        }

        function setEmptyActionHandlers(handlers)
        {
            const actions = {
                'play' : () => { postMessage('play handler'); },
                'pause' : () => { postMessage('pause handler') },
                'seekto' : (details) => { postMessage('seekto handler') },
                'seekforward' : (details) => { postMessage('seekforward handler') },
                'seekbackward' : (details) => { postMessage('seekbackward handler') },
                'previoustrack' : () => { postMessage('previoustrack handler') },
                'nexttrack' : () => { postMessage('nexttrack handler') }, 
            };

            Object.keys(actions).forEach(action => {  navigator.mediaSession.setActionHandler(action, null); });

            handlers.forEach(handler => {
                if (!actions[handler]) {
                    log(`asked to register handler for unknown action '${handler}'`);
                    return;
                }

                log(`registering '${handler}' handler`);
                navigator.mediaSession.setActionHandler(handler, actions[handler]); 
            });
        }

        function postMessage(message)
        {
            log(`${message}`)
            if (window.webkit)
                window.webkit.messageHandlers.testHandler.postMessage(message);
        }

        function postEvent(evt)
        {
            postMessage(`${evt.type} event`);
        }
        
        async function postPromise(type, promise)
        {
            log(`waiting for ${type} promise`);
            await promise
                .then(  () => { postMessage(`${type} resolved`); } )
                .catch( () => { postMessage(`${type} rejected`); } );
            log(`${type} promise settled`);
        }
        
        function load()
        {
            let src = playlist.metadata[0].url;
            if (!window.webkit)
                src = `../WebKitLegacy/ios/${src}`;
            audio.src = src;
            audio.load();
        }
        
        function log(msg)
        {
            let eventLog = document.getElementById('eventslog')
            let note = document.createElement('div');
            note.innerHTML = msg;
            eventLog.insertBefore(note, eventLog.firstChild);
        }

        const session = navigator.mediaSession;

        window.addEventListener("load", evt => {
            audio = document.getElementsByTagName('audio')[0];
            audio.addEventListener('canplaythrough', postEvent);
            audio.addEventListener('play', postEvent);
            audio.addEventListener('pause', postEvent);
            audio.addEventListener('seeked', postEvent);
            navigator.mediaSession.coordinator.addEventListener('coordinatorstatechange', postEvent);
        }, false);

    </script>
</head>
<body>
    <audio controls> </audio>
    <br>
    <button onclick="setEmptyActionHandlers(['play','pause','seekto'])">Empty Play, Pause, SeekTo</button>
    <br>
    <button onclick="setEmptyActionHandlers(['play','pause','seekforward','seekbackward'])">Empty Play, Pause, Seek Forward, Seek Backward</button>
    <br>
    <button onclick="load()">Load</button>
    <br>
    <button onclick="setPlaylistMetadata(0)">Set Metadata 1</button><button onclick="setPlaylistMetadata(1)">Set Metadata 2</button>
    <br>
    <div id='eventslog'></div>
</body>
</html>
