tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

1809567.html (2805B)


      1 <!DOCTYPE html>
      2 <html class="reftest-wait">
      3  <body>
      4    <script>
      5      // The bulk of the test is wrapped in an async function because
      6      // the WebGPU API returns promises of adapters and devices,
      7      // which we would like to conveniently await.
      8      async function orphan_webgpu_device() {
      9          // Create an iframe in the same origin as this code.
     10          let iframe = document.createElement('iframe');
     11          document.body.appendChild(iframe);
     12 
     13          // Define a function in that iframe that creates a WebGPU
     14          // `GPUDevice`.
     15          let script = iframe.contentDocument.createElement('script');
     16          script.type = 'text/javascript';
     17          script.text = `
     18              async function create_device() {
     19                  // WebGPU is not yet available in beta or release.
     20                  if (!navigator.gpu) {
     21                      return null;
     22                  }
     23 
     24                  let adapter = await navigator.gpu.requestAdapter({ });
     25                  // Not all GPUs are capable of supporting WebGPU.
     26                  if (!adapter) {
     27                      return null;
     28                  }
     29 
     30                  return await adapter.requestDevice({ });
     31              }
     32          `;
     33          iframe.contentDocument.body.appendChild(script);
     34 
     35          // Call that function to create a `GPUDevice` in the iframe.
     36          let device = await iframe.contentWindow.create_device();
     37 
     38          // If we can't run WebGPU in this browser, then we can't reach the crash.
     39          if (device) {
     40              // Remove the iframe from our document. This closes its window.
     41              iframe.remove();
     42 
     43              try {
     44                  // When a Web API JavaScript object has had its parent window
     45                  // closed, C++ implementations of its WebIDL methods become unable
     46                  // to create JavaScript objects as usual: calling
     47                  // `EventTarget::GetParentObject` returns `nullptr`.
     48                  //
     49                  // Since we removed `iframe` from this document, the following
     50                  // call will fail trying to create a `Promise` of the module's
     51                  // `GPUCompilationInfo`.
     52                  device.createShaderModule({ code: '' });
     53              } catch (error) {
     54                  // Eating errors indiscriminately wastes later developers' time.
     55                  if (error.name != "NS_ERROR_UNEXPECTED") {
     56                      throw error;
     57                  }
     58              }
     59          }
     60      }
     61 
     62      orphan_webgpu_device()
     63          .catch((error) => {
     64              console.log(error);
     65          })
     66          .finally(() => {
     67              // End the crashtest.
     68              document.documentElement.removeAttribute("class");
     69          });
     70    </script>
     71  </body>
     72 </html>