Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src=/resources/testdriver.js></script>
<script src=/resources/testdriver-vendor.js></script>
<script src="/common/get-host-info.sub.js"></script>
</head>
<body>
<audio controls loop id=audio></audio>
<script>
let port;
function waitForState(test, worker, state)
{
if (!worker || worker.state == undefined)
return Promise.reject(new Error('waitForState must be passed a ServiceWorker'));
if (worker.state === state)
return Promise.resolve(state);
return new Promise(function(resolve, reject) {
worker.addEventListener('statechange', function() {
if (worker.state === state)
resolve(state);
});
test.step_timeout(() => reject("waitForState timed out, worker state is " + worker.state), 5000);
});
}
promise_test(async test => {
let registration = await navigator.serviceWorker.getRegistration("");
let worker;
if (!registration) {
registration = await navigator.serviceWorker.register("media-session-artwork-fetch-service-worker.js", { scope: "" });
worker = registration.installing;
await waitForState(test, worker, "activated");
} else
worker = registration.active;
const channel = new MessageChannel();
worker.postMessage({ port: channel.port1 }, [channel.port1]);
port = channel.port2;
const result = await new Promise(resolve => port.onmessage = e => resolve(e.data));
assert_equals(result, "Ready");
}, "Setup service worker");
promise_test(async test => {
audio.src = "/media/sound_5.mp3";
if (window.testRunner && window.test_driver) {
let promise;
test_driver.bless("audio playback", () => {
promise = audio.play();
});
await promise;
} else
await audio.play();
}, "Play some audio");
const artworkResource = "/media/2048x1360-random.jpg";
promise_test(async test => {
navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album", artwork: [{src: artworkResource}]});
const message = await new Promise(resolve => port.onmessage = e => resolve(e.data));
assert_equals(message.type, "fetch");
const request = message.info;
assert_equals(request.destination, "image");
assert_equals(request.mode, "no-cors");
assert_equals(request.redirect, "follow");
assert_equals(request.referrerPolicy, "strict-origin-when-cross-origin");
assert_equals(request.credentials, "include");
const url = new URL(artworkResource, window.location.href);
assert_equals(request.url, url + "");
}, "Set same origin media metadata");
promise_test(async test => {
// We make sure the previous test artwork is not loaded again.
navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album"});
await new Promise(resolve => test.step_timeout(resolve, 100));
const artworkSrc = get_host_info().HTTPS_REMOTE_ORIGIN + artworkResource;
navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album", artwork: [{src: artworkSrc}]});
const message = await new Promise(resolve => port.onmessage = e => resolve(e.data));
assert_equals(message.type, "fetch");
const request = message.info;
assert_equals(request.destination, "image");
assert_equals(request.mode, "no-cors");
assert_equals(request.redirect, "follow");
assert_equals(request.referrerPolicy, "strict-origin-when-cross-origin");
assert_equals(request.credentials, "include");
assert_equals(request.url, artworkSrc);
}, "Set cross origin media metadata");
</script>
</body>
</html>