File: modulepreload-referrerpolicy.html

package info (click to toggle)
firefox 146.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,653,092 kB
  • sloc: cpp: 7,587,817; javascript: 6,509,407; ansic: 3,755,295; python: 1,410,813; xml: 629,202; asm: 438,677; java: 186,096; sh: 62,697; makefile: 18,086; objc: 13,087; perl: 12,811; 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 (200 lines) | stat: -rw-r--r-- 6,853 bytes parent folder | download | duplicates (5)
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
<!DOCTYPE html>
<html>
<head>
<title>Modulepreload Referrer Policy Tests</title>
<meta name="author" title="Google" href="https://www.google.com/">
<link rel="help" href="https://html.spec.whatwg.org/multipage/links.html#link-type-modulepreload">
<link rel="help" href="https://w3c.github.io/webappsec-referrer-policy/">
<meta name="assert" content="link rel=modulepreload respects the referrerpolicy attribute">
<!--
  This test verifies that modulepreload correctly handles various referrer policies
  for same-origin requests. It tests all standard referrer policy values:
  - no-referrer
  - origin
  - same-origin
  - strict-origin
  - strict-origin-when-cross-origin
  - unsafe-url
  Each policy is tested by creating a modulepreload link dynamically with the
  specific policy and verifying the referrer header that was sent.
-->
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
// Initialize the window.referrers object that will be used by echo-referrer.py
window.referrers = {};
</script>
</head>
<body>
<script>
// Helper function to create a unique ID for each test
function generateUniqueId() {
  return Date.now() + Math.floor(Math.random() * 1000);
}

// Helper function to create a modulepreload element with a given referrer policy
function createModulePreload(url, referrerPolicy = null) {
  const link = document.createElement('link');
  link.rel = 'modulepreload';
  link.href = url;

  if (referrerPolicy !== null) {
    link.referrerPolicy = referrerPolicy;
  }

  return link;
}

// Helper function to wait for preload completion
function waitForPreload(link) {
  return new Promise((resolve, reject) => {
    link.onload = resolve;
    link.onerror = () => reject(new Error("Modulepreload failed to load"));
  });
}

// Test default referrer policy behavior
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // First import to establish baseline
  await import(url);

  // Create modulepreload
  const link = createModulePreload(url);
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if referrer was sent
  assert_equals(window.referrers[uid], location.href, "Modulepreload should use default referrer policy");

}, "Modulepreload should use default referrer policy");

// Test explicit no-referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with no-referrer policy
  const link = createModulePreload(url, 'no-referrer');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if referrer was NOT sent
  assert_equals(window.referrers[uid], "", "Modulepreload with no-referrer policy should not send referrer");

}, "Modulepreload with no-referrer policy should not send referrer");

// Test origin referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with origin policy
  const link = createModulePreload(url, 'origin');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if origin-only referrer was sent
  assert_equals(window.referrers[uid], location.origin + "/", "Modulepreload with origin policy should send origin-only referrer");

}, "Modulepreload with origin policy should send origin-only referrer");

// Test same-origin referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with same-origin policy
  const link = createModulePreload(url, 'same-origin');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if full referrer was sent (for same-origin requests)
  assert_equals(window.referrers[uid], location.href, "Modulepreload with same-origin policy should send full referrer for same-origin requests");

}, "Modulepreload with same-origin policy should send full referrer for same-origin requests");

// Test strict-origin referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with strict-origin policy
  const link = createModulePreload(url, 'strict-origin');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if origin-only referrer was sent
  assert_equals(window.referrers[uid], location.origin + "/", "Modulepreload with strict-origin policy should send origin-only referrer");

}, "Modulepreload with strict-origin policy should send origin-only referrer");

// Test strict-origin-when-cross-origin referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with strict-origin-when-cross-origin policy
  const link = createModulePreload(url, 'strict-origin-when-cross-origin');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // For same-origin requests, full URL should be sent
  assert_equals(window.referrers[uid], location.href, "Modulepreload with strict-origin-when-cross-origin policy should send full referrer for same-origin requests");

}, "Modulepreload with strict-origin-when-cross-origin policy should send full referrer for same-origin requests");

// Test unsafe-url referrer policy
promise_test(async t => {
  const uid = generateUniqueId();
  const url = `/preload/resources/echo-referrer.py?uid=${uid}`;

  // Create modulepreload with unsafe-url policy
  const link = createModulePreload(url, 'unsafe-url');
  const preloadComplete = waitForPreload(link);

  document.head.appendChild(link);
  await preloadComplete;

  // Import again to ensure the module is loaded
  await import(url);

  // Check if full referrer was sent
  assert_equals(window.referrers[uid], location.href, "Modulepreload with unsafe-url policy should send full referrer");

}, "Modulepreload with unsafe-url policy should send full referrer");
</script>
</body>
</html>