tor-browser

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

reporting-api-orders-reports-buffered.https.html (2060B)


      1 <!DOCTYPE HTML>
      2 <html>
      3 <head>
      4  <meta charset="utf-8">
      5  <title>
      6    Reporting API: buffered observer preserves ordering across report types
      7  </title>
      8  <script src="/resources/testharness.js"></script>
      9  <script src="/resources/testharnessreport.js"></script>
     10  <script src="/resources/testdriver.js"></script>
     11  <script src="/resources/testdriver-vendor.js"></script>
     12 </head>
     13 
     14 <body>
     15 <script>
     16 promise_test(async t => {
     17  assert_true("ReportingObserver" in self);
     18 
     19  function generateTest(i) {
     20    test_driver.generate_test_report(`Test report ${i}`);
     21  }
     22 
     23  function generateDeprecation(i) {
     24    let img = document.createElement("img");
     25 
     26    img.src = `/some/bunk/file${i}.png`;
     27    document.body.appendChild(img);
     28  }
     29 
     30  let nonBufferedReports = [];
     31  const observeTwoReports = async () => {
     32    let { promise, resolve } = Promise.withResolvers();
     33    let count = 0;
     34    let reportingObserver = new ReportingObserver(reports => {
     35      count += reports.length;
     36      nonBufferedReports.push(...reports);
     37      if (count >= 2) {
     38        resolve();
     39      }
     40    });
     41 
     42    reportingObserver.observe();
     43    return promise.finally(() => reportingObserver.disconnect());
     44  }
     45 
     46  // Generate interleaved reports
     47  for (let i = 0; i < 25; i++) {
     48    generateTest(i);
     49    generateDeprecation(i);
     50    await observeTwoReports();
     51  }
     52 
     53  const collected = [];
     54  const { promise: collectedAll, resolve } = Promise.withResolvers();
     55 
     56  const observer = new ReportingObserver(
     57    reports => {
     58      collected.push(...reports);
     59      if (collected.length == nonBufferedReports.length) {
     60        resolve();
     61      }
     62    },
     63    { buffered: true }
     64  );
     65 
     66  observer.observe();
     67 
     68  await collectedAll;
     69  observer.disconnect();
     70 
     71  assert_greater_than(
     72    collected.length,
     73    0,
     74    "Some reports must be delivered"
     75  );
     76 
     77  // Verify relative ordering by type
     78  const observedTypes = collected.map(r => r.type);
     79 
     80  assert_array_equals(observedTypes, nonBufferedReports.map(r => r.type));
     81 }, "Buffered ReportingObserver preserves report generation order");
     82 </script>
     83 </body>
     84 </html>