loaf-pointer-without-render-iframe.html (1913B)
1 <!DOCTYPE HTML> 2 <meta charset=utf-8> 3 <title>Long Animation Frame Timing: Pointer events without render in an iframe</title> 4 <meta name="timeout" content="long"> 5 <script src=/resources/testdriver.js></script> 6 <script src=/resources/testdriver-actions.js></script> 7 <script src=/resources/testdriver-vendor.js></script> 8 <script src="/resources/testharness.js"></script> 9 <script src="/resources/testharnessreport.js"></script> 10 <script src="resources/utils.js"></script> 11 <body> 12 <script> 13 const BUSY_DURATION = 60; 14 function event_handler() { 15 busy_wait(BUSY_DURATION); 16 } 17 18 function click_iframe(iframe) { 19 return new test_driver.Actions() 20 .pointerMove(10, 10, {origin: iframe}) 21 .pointerDown() 22 .pointerUp() 23 .send(); 24 } 25 26 promise_test(async t => { 27 const iframe = document.createElement("iframe"); 28 iframe.src = "resources/long-pointerdown.html" 29 t.add_cleanup(() => iframe.remove()); 30 document.body.append(iframe); 31 await new Promise(resolve => iframe.addEventListener("load", resolve)); 32 iframe.focus(); 33 await click_iframe(iframe); 34 await new Promise(resolve => requestAnimationFrame(() => resolve())); 35 await new Promise(resolve => t.step_timeout(resolve, 0)); 36 const loaf_promise = new Promise(resolve => { 37 function on_message(event) { 38 resolve(event.data); 39 } 40 41 addEventListener("message", on_message); 42 t.add_cleanup(() => removeEventListener("message", on_message)); 43 44 new PerformanceObserver(entries => { 45 for (const e of entries.getEntries()) 46 if (entries.getEntries().some( 47 e => !e.renderStart && e.scripts.some(script => script.invoker === "BODY.onpointerdown"))) 48 resolve("MAIN"); 49 }).observe({type: "long-animation-frame"}); 50 }); 51 52 await click_iframe(iframe); 53 54 assert_equals(await loaf_promise, "FRAME"); 55 }, "Input events in iframes that don't cause a render should only create LoAF for the iframe") 56 </script> 57 </body>