tor-browser

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

compute_pressure_detached_iframe.https.window.js (3627B)


      1 // META: timeout=long
      2 // META: variant=?globalScope=window
      3 // META: script=/resources/testdriver.js
      4 // META: script=/resources/testdriver-vendor.js
      5 // META: script=/common/utils.js
      6 // META: script=/common/dispatcher/dispatcher.js
      7 // META: script=./resources/common.js
      8 
      9 'use strict';
     10 
     11 promise_test(async () => {
     12  const iframe = document.createElement('iframe');
     13  document.body.appendChild(iframe);
     14  const frame_window = iframe.contentWindow;
     15 
     16  iframe.remove();
     17  assert_equals(undefined, frame_window.PressureObserver);
     18 }, 'PressureObserver constructor does not exist in detached iframes');
     19 
     20 promise_test(async t => {
     21  const iframe = document.createElement('iframe');
     22  document.body.appendChild(iframe);
     23  const frame_window = iframe.contentWindow;
     24 
     25  const observer = new frame_window.PressureObserver(() => {});
     26  const iframe_DOMException = frame_window.DOMException;
     27 
     28  iframe.remove();
     29 
     30  // Calling observe() from a detached iframe should fail but not crash.
     31  await promise_rejects_dom(t, 'NotSupportedError', iframe_DOMException,
     32                            observer.observe('cpu'));
     33 }, 'PressureObserver.observe() on detached frame rejects');
     34 
     35 pressure_test(async t => {
     36  await create_virtual_pressure_source('cpu');
     37  t.add_cleanup(async () => {
     38    await remove_virtual_pressure_source('cpu');
     39  });
     40 
     41  const iframe = document.createElement('iframe');
     42  document.body.appendChild(iframe);
     43  const frame_window = iframe.contentWindow;
     44 
     45  const observer = new frame_window.PressureObserver(() => {});
     46 
     47  await observer.observe('cpu');
     48 
     49  iframe.remove();
     50 
     51  // Calling disconnect() from a detached iframe should not crash.
     52  observer.disconnect();
     53 }, 'PressureObserver.disconnect() on detached frame returns');
     54 
     55 pressure_test(async t => {
     56  await create_virtual_pressure_source('cpu');
     57  t.add_cleanup(async () => {
     58    await remove_virtual_pressure_source('cpu');
     59  });
     60  const iframe = document.createElement('iframe');
     61  document.body.appendChild(iframe);
     62  const frame_window = iframe.contentWindow;
     63 
     64  const observer = new frame_window.PressureObserver(() => {});
     65  const iframe_DOMException = frame_window.DOMException;
     66 
     67  // await is intentionally not used here. We want to remove the iframe while
     68  // the returned Promise settles.
     69  observer.observe('cpu');
     70  iframe.remove();
     71 
     72  // Establish an observer and wait for changes in the main frame. This should
     73  // keep the test running long enough to catch any crash from the observe()
     74  // call in the removed iframe's PressureObserver.
     75  const changes = await new Promise((resolve, reject) => {
     76    const observer = new PressureObserver(resolve);
     77    t.add_cleanup(() => observer.disconnect());
     78    observer.observe('cpu').catch(reject);
     79    update_virtual_pressure_source('cpu', 'critical').catch(reject);
     80  });
     81  assert_equals(changes[0].state, 'critical');
     82 }, 'Detaching frame while PressureObserver.observe() settles');
     83 
     84 pressure_test(async t => {
     85  await create_virtual_pressure_source('cpu');
     86  t.add_cleanup(async () => {
     87    await remove_virtual_pressure_source('cpu');
     88  });
     89 
     90  const iframe = document.createElement('iframe');
     91  document.body.appendChild(iframe);
     92  const frame_window = iframe.contentWindow;
     93  const observer = new frame_window.PressureObserver(() => {
     94    assert_unreached('The observer callback should not be called');
     95  });
     96 
     97  await observer.observe('cpu');
     98  const updatePromise = update_virtual_pressure_source('cpu', 'critical');
     99  iframe.remove();
    100  await updatePromise;
    101 
    102  return new Promise(resolve => t.step_timeout(resolve, 3000));
    103 }, 'PressureObserver on detached frame returns with no callback');
    104 
    105 mark_as_done();