element-link-prefetch.https.optional.sub.html (15456B)
1 <!DOCTYPE html> 2 <!-- 3 This test was procedurally generated. Please do not modify it directly. 4 Sources: 5 - fetch/metadata/tools/fetch-metadata.conf.yml 6 - fetch/metadata/tools/templates/element-link-prefetch.optional.sub.html 7 --> 8 <html lang="en"> 9 <meta charset="utf-8"> 10 <meta name="timeout" content="long"> 11 <title>HTTP headers on request for HTML "link" element with rel="prefetch"</title> 12 <script src="/resources/testharness.js"></script> 13 <script src="/resources/testharnessreport.js"></script> 14 <script src="/fetch/metadata/resources/helper.sub.js"></script> 15 <body> 16 <script> 17 'use strict'; 18 19 /** 20 * The `link` element supports a `load` event. That event would reliably 21 * indicate that the browser had received the request. Multiple major 22 * browsers do not implement the event, however, so in order to promote the 23 * visibility of this test, a less efficient polling-based detection 24 * mechanism is used. 25 * 26 * https://bugzilla.mozilla.org/show_bug.cgi?id=1638188 27 * https://bugs.chromium.org/p/chromium/issues/detail?id=1083034 28 */ 29 function induceRequest(t, url, attributes) { 30 const link = document.createElement('link'); 31 link.setAttribute('rel', 'prefetch'); 32 link.setAttribute('href', url); 33 34 for (const [ name, value ] of Object.entries(attributes)) { 35 link.setAttribute(name, value); 36 } 37 38 document.head.appendChild(link); 39 t.add_cleanup(() => link.remove()); 40 } 41 42 setup(() => { 43 assert_implements_optional(document.createElement('link').relList.supports('prefetch')); 44 }); 45 46 promise_test((t) => { 47 const key = '{{uuid()}}'; 48 49 induceRequest( 50 t, 51 makeRequestURL(key, ['httpsOrigin']), 52 {} 53 ); 54 55 return retrieve(key, {poll:true}) 56 .then((headers) => { 57 assert_own_property(headers, 'sec-fetch-site'); 58 assert_array_equals(headers['sec-fetch-site'], ['same-origin']); 59 }); 60 }, 'sec-fetch-site - Same origin no attributes'); 61 62 promise_test((t) => { 63 const key = '{{uuid()}}'; 64 65 induceRequest( 66 t, 67 makeRequestURL(key, ['httpsCrossSite']), 68 {} 69 ); 70 71 return retrieve(key, {poll:true}) 72 .then((headers) => { 73 assert_own_property(headers, 'sec-fetch-site'); 74 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 75 }); 76 }, 'sec-fetch-site - Cross-site no attributes'); 77 78 promise_test((t) => { 79 const key = '{{uuid()}}'; 80 81 induceRequest( 82 t, 83 makeRequestURL(key, ['httpsSameSite']), 84 {} 85 ); 86 87 return retrieve(key, {poll:true}) 88 .then((headers) => { 89 assert_own_property(headers, 'sec-fetch-site'); 90 assert_array_equals(headers['sec-fetch-site'], ['same-site']); 91 }); 92 }, 'sec-fetch-site - Same site no attributes'); 93 94 promise_test((t) => { 95 const key = '{{uuid()}}'; 96 97 induceRequest( 98 t, 99 makeRequestURL(key, ['httpsOrigin', 'httpsCrossSite', 'httpsOrigin']), 100 {} 101 ); 102 103 return retrieve(key, {poll:true}) 104 .then((headers) => { 105 assert_own_property(headers, 'sec-fetch-site'); 106 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 107 }); 108 }, 'sec-fetch-site - Same-Origin -> Cross-Site -> Same-Origin redirect no attributes'); 109 110 promise_test((t) => { 111 const key = '{{uuid()}}'; 112 113 induceRequest( 114 t, 115 makeRequestURL(key, ['httpsOrigin', 'httpsSameSite', 'httpsOrigin']), 116 {} 117 ); 118 119 return retrieve(key, {poll:true}) 120 .then((headers) => { 121 assert_own_property(headers, 'sec-fetch-site'); 122 assert_array_equals(headers['sec-fetch-site'], ['same-site']); 123 }); 124 }, 'sec-fetch-site - Same-Origin -> Same-Site -> Same-Origin redirect no attributes'); 125 126 promise_test((t) => { 127 const key = '{{uuid()}}'; 128 129 induceRequest( 130 t, 131 makeRequestURL(key, ['httpsCrossSite', 'httpsOrigin']), 132 {} 133 ); 134 135 return retrieve(key, {poll:true}) 136 .then((headers) => { 137 assert_own_property(headers, 'sec-fetch-site'); 138 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 139 }); 140 }, 'sec-fetch-site - Cross-Site -> Same Origin no attributes'); 141 142 promise_test((t) => { 143 const key = '{{uuid()}}'; 144 145 induceRequest( 146 t, 147 makeRequestURL(key, ['httpsCrossSite', 'httpsSameSite']), 148 {} 149 ); 150 151 return retrieve(key, {poll:true}) 152 .then((headers) => { 153 assert_own_property(headers, 'sec-fetch-site'); 154 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 155 }); 156 }, 'sec-fetch-site - Cross-Site -> Same-Site no attributes'); 157 158 promise_test((t) => { 159 const key = '{{uuid()}}'; 160 161 induceRequest( 162 t, 163 makeRequestURL(key, ['httpsCrossSite', 'httpsCrossSite']), 164 {} 165 ); 166 167 return retrieve(key, {poll:true}) 168 .then((headers) => { 169 assert_own_property(headers, 'sec-fetch-site'); 170 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 171 }); 172 }, 'sec-fetch-site - Cross-Site -> Cross-Site no attributes'); 173 174 promise_test((t) => { 175 const key = '{{uuid()}}'; 176 177 induceRequest( 178 t, 179 makeRequestURL(key, ['httpsOrigin', 'httpsOrigin']), 180 {} 181 ); 182 183 return retrieve(key, {poll:true}) 184 .then((headers) => { 185 assert_own_property(headers, 'sec-fetch-site'); 186 assert_array_equals(headers['sec-fetch-site'], ['same-origin']); 187 }); 188 }, 'sec-fetch-site - Same-Origin -> Same Origin no attributes'); 189 190 promise_test((t) => { 191 const key = '{{uuid()}}'; 192 193 induceRequest( 194 t, 195 makeRequestURL(key, ['httpsOrigin', 'httpsSameSite']), 196 {} 197 ); 198 199 return retrieve(key, {poll:true}) 200 .then((headers) => { 201 assert_own_property(headers, 'sec-fetch-site'); 202 assert_array_equals(headers['sec-fetch-site'], ['same-site']); 203 }); 204 }, 'sec-fetch-site - Same-Origin -> Same-Site no attributes'); 205 206 promise_test((t) => { 207 const key = '{{uuid()}}'; 208 209 induceRequest( 210 t, 211 makeRequestURL(key, ['httpsOrigin', 'httpsCrossSite']), 212 {} 213 ); 214 215 return retrieve(key, {poll:true}) 216 .then((headers) => { 217 assert_own_property(headers, 'sec-fetch-site'); 218 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 219 }); 220 }, 'sec-fetch-site - Same-Origin -> Cross-Site no attributes'); 221 222 promise_test((t) => { 223 const key = '{{uuid()}}'; 224 225 induceRequest( 226 t, 227 makeRequestURL(key, ['httpsSameSite', 'httpsOrigin']), 228 {} 229 ); 230 231 return retrieve(key, {poll:true}) 232 .then((headers) => { 233 assert_own_property(headers, 'sec-fetch-site'); 234 assert_array_equals(headers['sec-fetch-site'], ['same-site']); 235 }); 236 }, 'sec-fetch-site - Same-Site -> Same Origin no attributes'); 237 238 promise_test((t) => { 239 const key = '{{uuid()}}'; 240 241 induceRequest( 242 t, 243 makeRequestURL(key, ['httpsSameSite', 'httpsSameSite']), 244 {} 245 ); 246 247 return retrieve(key, {poll:true}) 248 .then((headers) => { 249 assert_own_property(headers, 'sec-fetch-site'); 250 assert_array_equals(headers['sec-fetch-site'], ['same-site']); 251 }); 252 }, 'sec-fetch-site - Same-Site -> Same-Site no attributes'); 253 254 promise_test((t) => { 255 const key = '{{uuid()}}'; 256 257 induceRequest( 258 t, 259 makeRequestURL(key, ['httpsSameSite', 'httpsCrossSite']), 260 {} 261 ); 262 263 return retrieve(key, {poll:true}) 264 .then((headers) => { 265 assert_own_property(headers, 'sec-fetch-site'); 266 assert_array_equals(headers['sec-fetch-site'], ['cross-site']); 267 }); 268 }, 'sec-fetch-site - Same-Site -> Cross-Site no attributes'); 269 270 promise_test((t) => { 271 const key = '{{uuid()}}'; 272 273 induceRequest( 274 t, 275 makeRequestURL(key, []), 276 {} 277 ); 278 279 return retrieve(key, {poll:true}) 280 .then((headers) => { 281 assert_own_property(headers, 'sec-fetch-mode'); 282 assert_array_equals(headers['sec-fetch-mode'], ['no-cors']); 283 }); 284 }, 'sec-fetch-mode no attributes'); 285 286 promise_test((t) => { 287 const key = '{{uuid()}}'; 288 289 induceRequest( 290 t, 291 makeRequestURL(key, []), 292 {"crossorigin": ""} 293 ); 294 295 return retrieve(key, {poll:true}) 296 .then((headers) => { 297 assert_own_property(headers, 'sec-fetch-mode'); 298 assert_array_equals(headers['sec-fetch-mode'], ['cors']); 299 }); 300 }, 'sec-fetch-mode attributes: crossorigin'); 301 302 promise_test((t) => { 303 const key = '{{uuid()}}'; 304 305 induceRequest( 306 t, 307 makeRequestURL(key, []), 308 {"crossorigin": "anonymous"} 309 ); 310 311 return retrieve(key, {poll:true}) 312 .then((headers) => { 313 assert_own_property(headers, 'sec-fetch-mode'); 314 assert_array_equals(headers['sec-fetch-mode'], ['cors']); 315 }); 316 }, 'sec-fetch-mode attributes: crossorigin=anonymous'); 317 318 promise_test((t) => { 319 const key = '{{uuid()}}'; 320 321 induceRequest( 322 t, 323 makeRequestURL(key, []), 324 {"crossorigin": "use-credentials"} 325 ); 326 327 return retrieve(key, {poll:true}) 328 .then((headers) => { 329 assert_own_property(headers, 'sec-fetch-mode'); 330 assert_array_equals(headers['sec-fetch-mode'], ['cors']); 331 }); 332 }, 'sec-fetch-mode attributes: crossorigin=use-credentials'); 333 334 promise_test((t) => { 335 const key = '{{uuid()}}'; 336 337 induceRequest( 338 t, 339 makeRequestURL(key, []), 340 {} 341 ); 342 343 return retrieve(key, {poll:true}) 344 .then((headers) => { 345 assert_own_property(headers, 'sec-fetch-dest'); 346 assert_array_equals(headers['sec-fetch-dest'], ['empty']); 347 }); 348 }, 'sec-fetch-dest no attributes'); 349 350 promise_test((t) => { 351 const key = '{{uuid()}}'; 352 353 induceRequest( 354 t, 355 makeRequestURL(key, []), 356 {"as": "audio"} 357 ); 358 359 return retrieve(key, {poll:true}) 360 .then((headers) => { 361 assert_own_property(headers, 'sec-fetch-dest'); 362 assert_array_equals(headers['sec-fetch-dest'], ['audio']); 363 }); 364 }, 'sec-fetch-dest attributes: as=audio'); 365 366 promise_test((t) => { 367 const key = '{{uuid()}}'; 368 369 induceRequest( 370 t, 371 makeRequestURL(key, []), 372 {"as": "document"} 373 ); 374 375 return retrieve(key, {poll:true}) 376 .then((headers) => { 377 assert_own_property(headers, 'sec-fetch-dest'); 378 assert_array_equals(headers['sec-fetch-dest'], ['document']); 379 }); 380 }, 'sec-fetch-dest attributes: as=document'); 381 382 promise_test((t) => { 383 const key = '{{uuid()}}'; 384 385 induceRequest( 386 t, 387 makeRequestURL(key, []), 388 {"as": "embed"} 389 ); 390 391 return retrieve(key, {poll:true}) 392 .then((headers) => { 393 assert_own_property(headers, 'sec-fetch-dest'); 394 assert_array_equals(headers['sec-fetch-dest'], ['embed']); 395 }); 396 }, 'sec-fetch-dest attributes: as=embed'); 397 398 promise_test((t) => { 399 const key = '{{uuid()}}'; 400 401 induceRequest( 402 t, 403 makeRequestURL(key, []), 404 {"as": "fetch"} 405 ); 406 407 return retrieve(key, {poll:true}) 408 .then((headers) => { 409 assert_own_property(headers, 'sec-fetch-dest'); 410 assert_array_equals(headers['sec-fetch-dest'], ['fetch']); 411 }); 412 }, 'sec-fetch-dest attributes: as=fetch'); 413 414 promise_test((t) => { 415 const key = '{{uuid()}}'; 416 417 induceRequest( 418 t, 419 makeRequestURL(key, []), 420 {"as": "font"} 421 ); 422 423 return retrieve(key, {poll:true}) 424 .then((headers) => { 425 assert_own_property(headers, 'sec-fetch-dest'); 426 assert_array_equals(headers['sec-fetch-dest'], ['font']); 427 }); 428 }, 'sec-fetch-dest attributes: as=font'); 429 430 promise_test((t) => { 431 const key = '{{uuid()}}'; 432 433 induceRequest( 434 t, 435 makeRequestURL(key, []), 436 {"as": "image"} 437 ); 438 439 return retrieve(key, {poll:true}) 440 .then((headers) => { 441 assert_own_property(headers, 'sec-fetch-dest'); 442 assert_array_equals(headers['sec-fetch-dest'], ['image']); 443 }); 444 }, 'sec-fetch-dest attributes: as=image'); 445 446 promise_test((t) => { 447 const key = '{{uuid()}}'; 448 449 induceRequest( 450 t, 451 makeRequestURL(key, []), 452 {"as": "object"} 453 ); 454 455 return retrieve(key, {poll:true}) 456 .then((headers) => { 457 assert_own_property(headers, 'sec-fetch-dest'); 458 assert_array_equals(headers['sec-fetch-dest'], ['object']); 459 }); 460 }, 'sec-fetch-dest attributes: as=object'); 461 462 promise_test((t) => { 463 const key = '{{uuid()}}'; 464 465 induceRequest( 466 t, 467 makeRequestURL(key, []), 468 {"as": "script"} 469 ); 470 471 return retrieve(key, {poll:true}) 472 .then((headers) => { 473 assert_own_property(headers, 'sec-fetch-dest'); 474 assert_array_equals(headers['sec-fetch-dest'], ['script']); 475 }); 476 }, 'sec-fetch-dest attributes: as=script'); 477 478 promise_test((t) => { 479 const key = '{{uuid()}}'; 480 481 induceRequest( 482 t, 483 makeRequestURL(key, []), 484 {"as": "style"} 485 ); 486 487 return retrieve(key, {poll:true}) 488 .then((headers) => { 489 assert_own_property(headers, 'sec-fetch-dest'); 490 assert_array_equals(headers['sec-fetch-dest'], ['style']); 491 }); 492 }, 'sec-fetch-dest attributes: as=style'); 493 494 promise_test((t) => { 495 const key = '{{uuid()}}'; 496 497 induceRequest( 498 t, 499 makeRequestURL(key, []), 500 {"as": "track"} 501 ); 502 503 return retrieve(key, {poll:true}) 504 .then((headers) => { 505 assert_own_property(headers, 'sec-fetch-dest'); 506 assert_array_equals(headers['sec-fetch-dest'], ['track']); 507 }); 508 }, 'sec-fetch-dest attributes: as=track'); 509 510 promise_test((t) => { 511 const key = '{{uuid()}}'; 512 513 induceRequest( 514 t, 515 makeRequestURL(key, []), 516 {"as": "video"} 517 ); 518 519 return retrieve(key, {poll:true}) 520 .then((headers) => { 521 assert_own_property(headers, 'sec-fetch-dest'); 522 assert_array_equals(headers['sec-fetch-dest'], ['video']); 523 }); 524 }, 'sec-fetch-dest attributes: as=video'); 525 526 promise_test((t) => { 527 const key = '{{uuid()}}'; 528 529 induceRequest( 530 t, 531 makeRequestURL(key, []), 532 {"as": "worker"} 533 ); 534 535 return retrieve(key, {poll:true}) 536 .then((headers) => { 537 assert_own_property(headers, 'sec-fetch-dest'); 538 assert_array_equals(headers['sec-fetch-dest'], ['worker']); 539 }); 540 }, 'sec-fetch-dest attributes: as=worker'); 541 542 promise_test((t) => { 543 const key = '{{uuid()}}'; 544 545 induceRequest( 546 t, 547 makeRequestURL(key, []), 548 {} 549 ); 550 551 return retrieve(key, {poll:true}) 552 .then((headers) => { 553 assert_not_own_property(headers, 'sec-fetch-user'); 554 }); 555 }, 'sec-fetch-user no attributes'); 556 557 promise_test((t) => { 558 const key = '{{uuid()}}'; 559 560 induceRequest( 561 t, 562 makeRequestURL(key, ['httpsCrossSite']), 563 {} 564 ); 565 566 return retrieve(key, {poll:true}) 567 .then((headers) => { 568 assert_own_property(headers, 'sec-fetch-storage-access'); 569 assert_array_equals(headers['sec-fetch-storage-access'], ['none']); 570 }); 571 }, 'sec-fetch-storage-access - Cross-site no attributes'); 572 573 promise_test((t) => { 574 const key = '{{uuid()}}'; 575 576 induceRequest( 577 t, 578 makeRequestURL(key, ['httpsSameSite']), 579 {} 580 ); 581 582 return retrieve(key, {poll:true}) 583 .then((headers) => { 584 assert_not_own_property(headers, 'sec-fetch-storage-access'); 585 }); 586 }, 'sec-fetch-storage-access - Same site no attributes'); 587 </script> 588 </body> 589 </html>