tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>