File: image-base-url.html

package info (click to toggle)
thunderbird 1%3A140.3.1esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,608,628 kB
  • sloc: cpp: 7,671,698; javascript: 5,901,131; ansic: 3,898,955; python: 1,413,270; xml: 653,997; asm: 462,284; java: 180,948; sh: 113,489; makefile: 20,460; perl: 14,288; objc: 13,059; yacc: 4,583; pascal: 3,352; lex: 1,720; ruby: 1,222; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (70 lines) | stat: -rw-r--r-- 2,724 bytes parent folder | download | duplicates (15)
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
<!DOCTYPE html>
<html>
<head>
  <title>Image load parses URL after microtask runs</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>

<body>
<script>
// See https://github.com/whatwg/html/issues/7383 and
// https://chromium-review.googlesource.com/c/chromium/src/+/3311225.
// This test asserts two things:
//   1.) That Document base URL modifications that take place in between an
//       image loading microtask being scheduled and executed are reflected in
//       the final image request
//   2.) That subsequent changes to a Document's base URL before an image is
//       inserted into the DOM do not lead to the image being refetched when it
//       is inserted asynchronously later. This is because image insertion is
//       not a relevant mutation
//       (https://html.spec.whatwg.org/#relevant-mutations).
promise_test(async t => {
  const image = new Image();
  image.src = 'green.png';

  // Dynamically insert a <base> tag that should influence the above image
  // request because the above code triggers a microtask to continue fetching
  // the image, which will run while we await `loadPromise` below.
  const base = document.createElement('base');
  base.setAttribute('href', 'resources/');
  document.head.append(base);

  const loadPromise = new Promise((resolve, reject) => {
    image.addEventListener('load', e => {
      resolve();
    }, {once: true});

    image.addEventListener('error', e => {
      reject('The image must load');
    }, {once: true});
  });

  // The image should load successfully, since its request was influenced by the
  // <base> element which points the request to the right directory.
  await loadPromise;

  // Now manipulate the <base> element to point to a bogus directory.
  base.setAttribute('href', 'bogus/');
  document.body.append(image);

  const timeoutPromise = new Promise(resolve => t.step_timeout(resolve, 1500));
  const imageErrorPromise = new Promise((resolve, reject) => {
    image.addEventListener('load', e => {
      reject('The image should not be refetched upon insertion and load, ' +
             'because (1) insertion is not a relevant mutation, and (2) the ' +
             'new relative URL should not resolve to a real resource');
    }, {once: true});

    image.addEventListener('error', e => {
      reject('The image should not be refetched upon insertion, because ' +
             'insertion is not a relevant mutation');
    }, {once: true});
  });

  await Promise.race([timeoutPromise, imageErrorPromise]);
}, "An image should not be refetched upon insertion asynchronously after its " +
   "Document's base URL changes");
</script>
</body>
</html>