summaryrefslogtreecommitdiffstats
path: root/dom/webgpu/tests/cts/checkout/src/webgpu/web_platform/reftests/ref/resize_observer-ref.html
blob: 5259a25c2741729c13c52f24ce4adf5593cc2fc0 (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
84
85
86
87
88
89
90
<!DOCTYPE html>
<html>
  <title>WebGPU ResizeObserver test (ref)</title>
  <meta charset="utf-8" />
  <link rel="help" href="https://gpuweb.github.io/gpuweb/" />
  <style>
    .outer {
      display: flex;
      align-items: center;
      flex-direction: column;
    }
    .outer>* {
      display: block;
      height: 100px;
    }
  </style>
  <body>
    <div id="dpr"></div>
    <div class="outer"></div>
    <script type="module">
  import { takeScreenshotDelayed } from '../../../../common/util/wpt_reftest_wait.js';
  import createPatternDataURL from '../create-pattern-data-url.js';

  (async () => {
    const {patternSize, dataURL} = createPatternDataURL();

    document.querySelector('#dpr').textContent = `dpr: ${devicePixelRatio}`;

    /**
     * Set the pattern's size on this element so that it draws where
     * 1 pixel in the pattern maps to 1 devicePixel.
     */
    function setPattern(elem) {
      const oneDevicePixel = 1 / devicePixelRatio;
      const patternPixels = oneDevicePixel * patternSize;
      elem.style.backgroundImage = `url("${dataURL}")`;
      elem.style.backgroundSize = `${patternPixels}px ${patternPixels}px`;
    }

    /*
    This ref creates elements like this
      <body>
        <div class="outer">
          <div></div>
          <div></div>
          <div></div>
          ...
        </div>
      </body>
    Where the outer div is a flexbox centering the child elements.
    Each of the child elements is set to a different width in percent.
    The devicePixelContentBox size of each child element is observed
    with a ResizeObserver and when changed, a pattern is applied to
    the element and the pattern's size set so each pixel in the pattern
    will be one device pixel.
    A similar process happens in the test HTML using canvases
    and patterns generated using putImageData.
    The test and this reference page should then match.
    */

    const outerElem = document.querySelector('.outer');

    let resolve;
    const promise = new Promise(_resolve => (resolve = _resolve));

    /**
     * Set the pattern's size on this element so that it draws where
     * 1 pixel in the pattern maps to 1 devicePixel.
     */
    function setPatterns(entries) {
      for (const entry of entries) {
        setPattern(entry.target)
      }
      resolve();
    }

    const observer = new ResizeObserver(setPatterns);
    for (let percentSize = 7; percentSize < 100; percentSize += 13) {
      const innerElem = document.createElement('div');
      innerElem.style.width = `${percentSize}%`;
      observer.observe(innerElem, {box:"device-pixel-content-box"});
      outerElem.appendChild(innerElem);
    }

    await promise;
    takeScreenshotDelayed(50);
  })();
    </script>
  </body>
</html>