<!DOCTYPE html><!-- webkit-test-runner [ IPCTestingAPIEnabled=true PointerLockEnabled=true ] -->
<html>
<body>
<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

async function main() {
    if (!window.IPC) {
        testRunner?.notifyDone();
        return;
    }

    const { CoreIPC } = await import('./coreipc.js');

    if (window.testRunner && testRunner.setHasMouseDeviceForTesting)
        testRunner.setHasMouseDeviceForTesting(true);

    function sendPointerLock() {
        return new Promise(resolve => {
            CoreIPC.UI.WebPageProxy.RequestPointerLock(IPC.webPageProxyID, {}, () => resolve());
        });
    }

    function sendPointerUnlock() {
        return new Promise(resolve => {
            CoreIPC.UI.WebPageProxy.RequestPointerUnlock(IPC.webPageProxyID, {}, () => resolve());
        });
    }

    window.focus();

    await sendPointerLock();
    await sendPointerLock();
    await sendPointerUnlock();

    testRunner.notifyDone();
}

main().catch(() => {
    if (window.testRunner)
        testRunner.notifyDone();
});
</script>
This test passes if WebKit does not crash.
</body>
</html>
