test_pointercapture_remove_iframe.html (2371B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1686037 5 --> 6 <head> 7 <title>Bug 1686037</title> 8 <script src="/tests/SimpleTest/EventUtils.js"></script> 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 <style> 12 #target { 13 width: 100px; 14 height: 100px; 15 background-color: green; 16 } 17 iframe { 18 width: 400px; 19 height: 300px; 20 border: 1px solid blue; 21 } 22 </style> 23 </head> 24 <body> 25 <a target="_blank"href="https://bugzilla.mozilla.org/show_bug.cgi?id=1686037">Mozilla Bug 1686037</a> 26 <div id="target"></div> 27 <iframe srcdoc="<div style='width: 100px; height: 100px; background-color: blue;'></div>"></iframe> 28 29 <pre id="test"> 30 <script type="text/javascript"> 31 /** 32 * Test for Bug 1686037 33 */ 34 function waitForEvent(aTarget, aEventName, aCallback = null) { 35 return new Promise((aResolve) => { 36 aTarget.addEventListener(aEventName, async (e) => { 37 ok(true, `got ${e.type} event on ${e.target}, pointerid: ${e.pointerId}`); 38 if (aCallback) { 39 await aCallback(e); 40 } 41 aResolve(); 42 }, { once: true }); 43 }); 44 } 45 46 function waitForPointerDownAndSetPointerCapture(aTarget) { 47 return waitForEvent(aTarget, "pointerdown", async (event) => { 48 return new Promise((aResolve) => { 49 aTarget.addEventListener("gotpointercapture", (e) => { 50 ok(true, `got ${e.type} event on ${e.target}, pointerid: ${e.pointerId}`); 51 aResolve(); 52 }, { once: true }); 53 54 aTarget.setPointerCapture(event.pointerId); 55 }); 56 }); 57 } 58 59 add_task(async function test_remove_iframe_after_pointer_capture() { 60 await SimpleTest.promiseFocus(); 61 62 let iframe = document.querySelector("iframe"); 63 let iframeWin = iframe.contentWindow; 64 let targetInIframe = iframe.contentDocument.querySelector("div"); 65 let promise = Promise.all([ 66 waitForPointerDownAndSetPointerCapture(targetInIframe), 67 waitForEvent(targetInIframe, "pointermove") 68 ]); 69 synthesizeTouch(targetInIframe, 10, 10, { type: "touchstart", id: 10 }, iframeWin); 70 synthesizeTouch(targetInIframe, 11, 11, { type: "touchmove", id: 10 }, iframeWin); 71 await promise; 72 73 // Intentionally not synthesize touchend event to not trigger implicit releasing 74 // pointer capture. And iframe removal should trigger pointer capture clean up. 75 iframe.remove(); 76 }); 77 </script> 78 </pre> 79 </body> 80 </html>