summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/semantics/embedded-content/the-img-element/image-loading-lazy-relevant-mutations.html
blob: 3a2662451e03b510bde18cfeb806d811c2df3a35 (plain)
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
<!DOCTYPE html>
<head>
  <title>Relevant mutations on deferred loading=lazy images should not trigger
         a request</title>
  <link rel="author" title="Dom Farolino" href="mailto:dom@chromium.org">
  <link rel="help" href="https://html.spec.whatwg.org/multipage/images.html#updating-the-image-data">
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
</head>

<script>
  let below_viewport_1_loaded = false,
      below_viewport_2_loaded = false,
      below_viewport_3_loaded = false

  // For general lazy loading behavior.
  promise_test(() => {
    // When the page loads, start the rest of the tests.
    return new Promise(resolve => {
      window.addEventListener("load", e => {
        const kAssertion = 'image should never load';
        assert_false(below_viewport_1_loaded, `below-viewport-1 ${kAssertion}`);
        assert_false(below_viewport_2_loaded, `below-viewport-2 ${kAssertion}`);
        assert_false(below_viewport_3_loaded, `below-viewport-3 ${kAssertion}`);
        resolve();
      });
    });
  }, "Images are lazyloaded");

  // For `referrerPolicy` attribute mutations.
  promise_test(t => {
    return new Promise((resolve, reject) => {
      const below_viewport_1 = document.querySelector('img#below-viewport-1');
      below_viewport_1.onload = reject;
      below_viewport_1.onerror = reject;
      t.step_timeout(resolve, 1000);

      below_viewport_1.referrerPolicy = 'no-referrer';
    });
  }, "Image referrerPolicy mutation does not cause deferred loading=lazy " +
     "images to be fetched");

  // For `crossOrigin` attribute mutations.
  promise_test(t => {
    return new Promise((resolve, reject) => {
      const below_viewport_2 = document.querySelector('img#below-viewport-2');
      below_viewport_2.onload = reject;
      below_viewport_2.onerror = reject;
      t.step_timeout(resolve, 1000);

      below_viewport_2.crossOrigin = 'anonymous';
    });
  }, "Image crossOrigin mutation does not cause deferred loading=lazy " +
     "images to be fetched");

  // For `src` attribute mutations.
  promise_test(t => {
    return new Promise((resolve, reject) => {
      const below_viewport_3 = document.querySelector('img#below-viewport-3');
      below_viewport_3.onload = reject;
      below_viewport_3.onerror = reject;
      t.step_timeout(resolve, 1000);

      below_viewport_3.src = "resources/image.png?relevant-mutations-change";
    });
  }, "Image src mutation does not cause deferred loading=lazy " +
     "images to be fetched");
</script>

<body>
  <div style="height:1000vh;"></div>
  <img id="below-viewport-1" src="resources/image.png?relevant-mutations-1" loading="lazy"
       onload="below_viewport_1_loaded = true"
       onerror="below_viewport_1_loaded = true">

  <img id="below-viewport-2" src="resources/image.png?relevant-mutations-2" loading="lazy"
       onload="below_viewport_2_loaded = true"
       onerror="below_viewport_2_loaded = true">

  <img id="below-viewport-3" src="resources/image.png?relevant-mutations-3" loading="lazy"
       onload="below_viewport_3_loaded = true"
       onerror="below_viewport_3_loaded = true">
</body>