/* Requests a pointer lock on `element` and waits for the resulting * 'pointerlockchange' event. * @param {Element} element - The element to lock the pointer to. * @param {boolean} provideTransientActivation - If true, a synthetic click is * performed on `element` first to satisfy the user activation requirement. * @returns {Event} The pointerlockchange Event object. */ async function lockPointerAndWaitForEvent(element, provideTransientActivation) { assert_not_equals(element, null, "element can't be null"); if (provideTransientActivation) { // Make a gesture to provide transient activation so that the UA // will allow us to acquire the pointer lock. await new test_driver.Actions() .pointerMove(0, 0, { origin: element }) .pointerDown() .pointerUp() .send(); } var lockEvent = null; var lockPromise = new Promise(resolve => { document.addEventListener('pointerlockchange', function(e) { lockEvent = e; resolve(); }, { once: true }); }); await element.requestPointerLock(); await lockPromise; assert_equals(document.pointerLockElement, element, `document.pointerLockElement should be ${element}.`); return lockEvent; } /* Calls document.exitPointerLock() and waits for the resulting * 'pointerlockchange' event. Asserts that document.pointerLockElement is * null afterwards. * @returns {Event} The pointerlockchange Event object. */ async function unlockPointerAndWaitForEvent() { var unlockEvent = null; var unlockPromise = new Promise(resolve => { document.addEventListener('pointerlockchange', function(e) { unlockEvent = e; resolve(); }, { once: true }); }); document.exitPointerLock(); await unlockPromise; assert_equals(document.pointerLockElement, null, "document.pointerLockElement should be null."); return unlockEvent; }