File: media-session-artwork-fetch.https.html

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (102 lines) | stat: -rw-r--r-- 3,789 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<!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>