102 lines
3.7 KiB
HTML
102 lines
3.7 KiB
HTML
<!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>
|