media-session-artwork-fetch.https.html (3789B)
1 <!doctype html> 2 <html> 3 <head> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src=/resources/testdriver.js></script> 7 <script src=/resources/testdriver-vendor.js></script> 8 <script src="/common/get-host-info.sub.js"></script> 9 </head> 10 <body> 11 <audio controls loop id=audio></audio> 12 <script> 13 let port; 14 15 function waitForState(test, worker, state) 16 { 17 if (!worker || worker.state == undefined) 18 return Promise.reject(new Error('waitForState must be passed a ServiceWorker')); 19 20 if (worker.state === state) 21 return Promise.resolve(state); 22 23 return new Promise(function(resolve, reject) { 24 worker.addEventListener('statechange', function() { 25 if (worker.state === state) 26 resolve(state); 27 }); 28 test.step_timeout(() => reject("waitForState timed out, worker state is " + worker.state), 5000); 29 }); 30 } 31 32 promise_test(async test => { 33 let registration = await navigator.serviceWorker.getRegistration(""); 34 let worker; 35 if (!registration) { 36 registration = await navigator.serviceWorker.register("media-session-artwork-fetch-service-worker.js", { scope: "" }); 37 worker = registration.installing; 38 await waitForState(test, worker, "activated"); 39 } else 40 worker = registration.active; 41 42 const channel = new MessageChannel(); 43 worker.postMessage({ port: channel.port1 }, [channel.port1]); 44 port = channel.port2; 45 46 const result = await new Promise(resolve => port.onmessage = e => resolve(e.data)); 47 assert_equals(result, "Ready"); 48 }, "Setup service worker"); 49 50 promise_test(async test => { 51 audio.src = "/media/sound_5.mp3"; 52 if (window.testRunner && window.test_driver) { 53 let promise; 54 test_driver.bless("audio playback", () => { 55 promise = audio.play(); 56 }); 57 await promise; 58 } else 59 await audio.play(); 60 }, "Play some audio"); 61 62 const artworkResource = "/media/2048x1360-random.jpg"; 63 64 promise_test(async test => { 65 navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album", artwork: [{src: artworkResource}]}); 66 const message = await new Promise(resolve => port.onmessage = e => resolve(e.data)); 67 68 assert_equals(message.type, "fetch"); 69 70 const request = message.info; 71 assert_equals(request.destination, "image"); 72 assert_equals(request.mode, "no-cors"); 73 assert_equals(request.redirect, "follow"); 74 assert_equals(request.referrerPolicy, "strict-origin-when-cross-origin"); 75 assert_equals(request.credentials, "include"); 76 77 const url = new URL(artworkResource, window.location.href); 78 assert_equals(request.url, url + ""); 79 }, "Set same origin media metadata"); 80 81 promise_test(async test => { 82 // We make sure the previous test artwork is not loaded again. 83 navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album"}); 84 await new Promise(resolve => test.step_timeout(resolve, 100)); 85 86 const artworkSrc = get_host_info().HTTPS_REMOTE_ORIGIN + artworkResource; 87 navigator.mediaSession.metadata = new MediaMetadata({title: "title", artist: "artist", album: "album", artwork: [{src: artworkSrc}]}); 88 const message = await new Promise(resolve => port.onmessage = e => resolve(e.data)); 89 90 assert_equals(message.type, "fetch"); 91 92 const request = message.info; 93 assert_equals(request.destination, "image"); 94 assert_equals(request.mode, "no-cors"); 95 assert_equals(request.redirect, "follow"); 96 assert_equals(request.referrerPolicy, "strict-origin-when-cross-origin"); 97 assert_equals(request.credentials, "include"); 98 assert_equals(request.url, artworkSrc); 99 }, "Set cross origin media metadata"); 100 </script> 101 </body> 102 </html>