tor-browser

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

1907222_truncate_error.html (2244B)


      1 <!DOCTYPE html>
      2 <html class="reftest-wait">
      3  <head>
      4    <meta charset="utf-8" />
      5    <script src="/tests/SimpleTest/SimpleTest.js"></script>
      6    <link rel="stylesheet" href="/tests/SimpleTest/test.css" />
      7  </head>
      8  <body>
      9    <script>
     10      // Ensure that, when WebGPU generates an error message that is later
     11      // truncated by `wgpu_bindings::error::ErrorBuffer::init`, that
     12      // truncation always produces valid UTF-8, even when the error contains
     13      // multi-byte encodings.
     14      async function truncate_error_messages() {
     15        // The specific error we'll try to provoke is submitting a command
     16        // buffer to the wrong device's queue.
     17        const adapter = await navigator.gpu.requestAdapter();
     18        const device1 = await adapter.requestDevice();
     19        const device2 = await adapter.requestDevice();
     20 
     21        // Try a range of label lengths (578±200, where 578 is the length that
     22        // tickles the original bug), searching for one that, when combined with
     23        // the error message and then truncated at whatever error message byte
     24        // length limit Firefox is imposing, will produce invalid UTF-8.
     25        //
     26        // Use a label containing n space characters followed by a crab emoji,
     27        // U+1F980, which requires four bytes to encode in UTF-8. Since this has
     28        // a four-byte encoding at the end, we only need to try every third
     29        // length to ensure we will always try a truncation point in the midst
     30        // of that encoding.
     31        for (let len = 378; len < 778; len += 3) {
     32          const label = ' '.repeat(len) + '\uD83E\uDD80';
     33          const encoder = device1.createCommandEncoder({ label });
     34          const command_buffer = encoder.finish();
     35 
     36          // We don't want an error scope around this, because what makes
     37          // Firefox notice the bad UTF-8 is attempting to log the uncaught
     38          // WebGPU error as a warning.
     39          device2.queue.submit([command_buffer]);
     40        }
     41      }
     42 
     43      truncate_error_messages()
     44        .catch(e => {
     45          console.log(e);
     46        })
     47        .finally(() => {
     48          // End the crashtest.
     49          document.documentElement.removeAttribute("class");
     50        });
     51    </script>
     52  </body>
     53 </html>