blob: 0b7627a5efa29f573c52487fa430015fc9e91f62 [file] [log] [blame]
<!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>