file_pointerlock_xorigin_iframe.html (3959B)
1 <!DOCTYPE HTML> 2 <html> 3 <!--https://bugzilla.mozilla.org/show_bug.cgi?id=1662587--> 4 <head> 5 <title>Bug 1662587</title> 6 <script src="/tests/SimpleTest/EventUtils.js"></script> 7 <script src="/tests/SimpleTest/SimpleTest.js"></script> 8 <script src="pointerlock_utils.js"></script> 9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 10 <style> 11 #target { 12 width: 100px; 13 height: 100px; 14 background-color: green; 15 } 16 iframe { 17 width: 400px; 18 height: 300px; 19 border: 1px solid blue; 20 } 21 </style> 22 </head> 23 <body> 24 <a target="_blank"href="https://bugzilla.mozilla.org/show_bug.cgi?id=1662587">Mozilla Bug 1662587</a> 25 <div id="target"></div> 26 <iframe src="https://example.com/tests/dom/tests/mochitest/pointerlock/iframe_differentDOM.html"></iframe> 27 28 <pre id="test"> 29 <script type="text/javascript"> 30 /** 31 * Test for Bug 1662587 32 */ 33 SimpleTest.waitForExplicitFinish(); 34 35 async function requestPointerLock(aElement, aExpectError = false) { 36 let doc = aElement.ownerDocument; 37 let waitForPointerLockEvent = function() { 38 return new Promise((aResolve) => { 39 let eventHandler = function(aEvent) { 40 is(aEvent.type, aExpectError ? 'pointerlockerror' : 'pointerlockchange', 41 `got ${aEvent.type}`); 42 doc.removeEventListener('pointerlockchange', eventHandler); 43 doc.removeEventListener('pointerlockerror', eventHandler); 44 aResolve(); 45 }; 46 47 doc.addEventListener('pointerlockchange', eventHandler); 48 doc.addEventListener('pointerlockerror', eventHandler); 49 }); 50 }; 51 52 SpecialPowers.wrap(doc).notifyUserGestureActivation(); 53 aElement.requestPointerLock(); 54 await waitForPointerLockEvent(); 55 is(doc.pointerLockElement, aExpectError ? null : aElement, "target pointer locked"); 56 } 57 58 async function exitPointerLock() { 59 if (document.pointerLockElement) { 60 document.exitPointerLock(); 61 await new Promise((aResolve) => { 62 document.addEventListener("pointerlockchange", (aEvent) => { 63 ok(true, `got ${aEvent.type}`); 64 aResolve(); 65 }, { once: true }); 66 }); 67 } 68 is(document.pointerLockElement, null, "pointer unlocked"); 69 } 70 71 async function start() { 72 let iframe = document.querySelector("iframe"); 73 let target = document.getElementById("target"); 74 await requestPointerLock(target); 75 76 // Mouse event should be dispatched to locked element. 77 synthesizeMouse(iframe, 10, 10, { type: "mousemove" }); 78 await new Promise((aResolve) => { 79 document.addEventListener("mousemove", function(e) { 80 info("Got mousemove"); 81 ok("movementX" in e, "has movementX"); 82 ok("movementY" in e, "has movementY"); 83 is(e.target, target, "event.target"); 84 aResolve(); 85 }, { once: true }); 86 }); 87 88 // Mouse wheel event should be dispatched to locked element. 89 synthesizeWheel(iframe, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); 90 await new Promise((aResolve) => { 91 document.addEventListener("wheel", function(e) { 92 info("Got wheel"); 93 is(e.target, target, "event.target"); 94 aResolve(); 95 }, { once: true }); 96 }); 97 98 // Pointer lock requested in iframe should be rejected. 99 let win = iframe.contentWindow; 100 win.focus() 101 await SpecialPowers.spawn(win, [], async () => { 102 info("request pointer lock in xorigin iframe"); 103 content.document.querySelector("input").focus(); 104 SpecialPowers.wrap(content.document).notifyUserGestureActivation(); 105 content.document.body.requestPointerLock(); 106 await new Promise((aResolve) => { 107 let handler = function(aEvent) { 108 is(aEvent.type, 'pointerlockerror', `got ${aEvent.type}`); 109 content.document.onpointerlockchange = null; 110 content.document.onpointerlockerror = null; 111 aResolve(); 112 }; 113 content.document.onpointerlockchange = handler; 114 content.document.onpointerlockerror = handler; 115 }); 116 content.document.exitPointerLock(); 117 }); 118 119 await exitPointerLock(); 120 SimpleTest.finish(); 121 } 122 </script> 123 </pre> 124 </body> 125 </html>