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();