| <!DOCTYPE html> |
| <html> |
| <base ref="/gen/third_party/dawn/webgpu-cts/src/webgpu" /> |
| <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> |