chromium/content/test/data/gpu/webgpu-domain-blocking-page1.html

<script type="text/javascript">
function reportProgress(msg) {
  if (window.domAutomationController) {
    window.domAutomationController.send(msg);
  }
  console.log(msg);
}

// These must be "var" rather than "let" for the Telemetry harness to
// see them.
var gotDevice;
var deviceLost;
var proceed;

const later = (delay) =>
  new Promise(resolve => setTimeout(resolve, delay));

async function init()
{
  reportProgress('LOADED');

  // This bakes in knowledge that GpuDataManagerImplPrivate blocks
  // WebGPU from fetching an adapter after two device losses on the
  // same domain.
  for (idx = 0; idx < 2; ++idx) {
    let adapter = await navigator.gpu.requestAdapter();
    if (!adapter) {
      console.log('TEST FAILED - Could not get a GPUAdapter');
      reportProgress('FAILED');
      return;
    }

    let device;
    try {
      device = await adapter.requestDevice();
      gotDevice = true;
      deviceLost = false;
    } catch {
      console.log('TEST FAILED - Could not get a GPUDevice');
      reportProgress('FAILED');
      return;
    }

    console.log('Waiting for a GPU crash to cause device loss');
    const {reason} = await device.lost;
    gotDevice = false;
    deviceLost = true;
    if (reason !== undefined) {
      console.log('TEST FAILED - Expected undefined device lost reason');
      reportProgress('FAILED');
    }

    // The harness will tell us when to proceed to the second iteration.
    while (!proceed) {
      await later(100);
    }
  }

  window.location.href = 'webgpu-domain-blocking-page2.html';
}

init();
</script>