File: fetch-destination-no-load-event.https.html

package info (click to toggle)
firefox 147.0.2-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 4,683,484 kB
  • sloc: cpp: 7,607,246; javascript: 6,533,185; ansic: 3,775,227; python: 1,415,393; xml: 634,561; asm: 438,951; java: 186,241; sh: 62,752; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (138 lines) | stat: -rw-r--r-- 4,683 bytes parent folder | download | duplicates (14)
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE html>
<title>Fetch destination tests for resources with no load event</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/service-workers/service-worker/resources/test-helpers.sub.js"></script>
<script>
let frame;

// Set up the service worker and the frame.
promise_test(t => {
    const kScope = 'resources/';
    const kFrame = 'resources/empty.https.html';
    const kScript = 'resources/fetch-destination-worker-no-load-event.js';
    return service_worker_unregister_and_register(t, kScript, kScope)
      .then(registration => {
          add_completion_callback(() => {
              registration.unregister();
            });

          return wait_for_state(t, registration.installing, 'activated');
        })
      .then(() => {
          return with_iframe(kFrame);
        })
      .then(f => {
          frame = f;
          add_completion_callback(() => { f.remove(); });
        });
  }, 'Initialize global state');

var waitOnMessageFromSW = async t => {
    await new Promise((resolve, reject) => {
        frame.contentWindow.navigator.serviceWorker.onmessage = t.step_func(event => {
            if (event.data == "PASS") {
                resolve();
            } else {
                reject();
            }
        });
    }).catch(() => {;
        assert_unreached("Wrong destination.");
    });
    t.add_cleanup(() => { frame.contentWindow.navigator.serviceWorker.onmessage = null; });
}
// Actual tests

// Image destination
////////////////////

// CSS background image - image destination
promise_test(async t => {
    let node = frame.contentWindow.document.createElement("div");
    node.style = "background-image: url(dummy.png?t=bg2&dest=image)";
    frame.contentWindow.document.body.appendChild(node);

    await waitOnMessageFromSW(t);
}, 'Background image fetches with an "image" Request.destination');

// SVG use element - image destination
// See for discussion https://github.com/whatwg/fetch/issues/1012.
promise_test(async t => {
    const doc = frame.contentWindow.document;

    let svg = doc.createElementNS("http://www.w3.org/2000/svg", "svg");
    let use = doc.createElementNS("http://www.w3.org/2000/svg", "use");
    use.setAttribute("href", "dummy.svg?t=use&dest=image#ref");
    svg.appendChild(use);
    doc.body.appendChild(svg);

    await waitOnMessageFromSW(t);
}, 'SVG use element fetches with an "image" Request.destination');

// Font destination
///////////////////

// Font loading API - font destination
promise_test(async t => {
    let font = new frame.contentWindow.FontFace("foo", "url(dummy.ttf?t=api&dest=font)");
    font.load();

    await waitOnMessageFromSW(t);
}, 'Font loading API fetches with an "font" Request.destination');

// CSS font - font destination
promise_test(async t => {
    let style = frame.contentWindow.document.createElement("style");
    style.innerHTML = "@font-face { font-family: foo; src: url(dummy.ttf?t=css&dest=font); }";
    style.innerHTML += "div {font-family: foo; }";
    let div = frame.contentWindow.document.createElement("div");
    div.innerHTML = "bar";
    frame.contentWindow.document.body.appendChild(style);
    frame.contentWindow.document.body.appendChild(div);

    await waitOnMessageFromSW(t);
}, 'CSS font fetches with an "font" Request.destination');

// Empty string destination
///////////////////////////

// sendBeacon() - empty string destination
promise_test(async t => {
    frame.contentWindow.navigator.sendBeacon("dummy?t=beacon&dest=", "foobar");

    await waitOnMessageFromSW(t);
}, 'sendBeacon() fetches with an empty string Request.destination');

// Cache.add() - empty string destination
promise_test(async t => {
    frame.contentWindow.caches.open("foo").then(cache => {
        cache.add("dummy?t=cache&dest=");
    });

    await waitOnMessageFromSW(t);
}, 'Cache.add() fetches with an empty string Request.destination');

// script destination
/////////////////////

// importScripts() - script destination
promise_test(async t => {
    let worker = new frame.contentWindow.Worker("importer.js");

    await waitOnMessageFromSW(t);
}, 'importScripts() fetches with a "script" Request.destination');

// style destination
/////////////////////
// @import - style destination
promise_test(async t => {
    let node = frame.contentWindow.document.createElement("style");
    node.innerHTML = '@import url("dummy?t=import&dest=style")';
    frame.contentWindow.document.body.appendChild(node);

    await waitOnMessageFromSW(t);
}, '@import fetches with a "style" Request.destination');

</script>