Revert of Remove prefixed Pointer Lock API. (https://codereview.chromium.org/424093006/)

Reason for revert:
The change broke several Chromium OS interactive_ui_tests:

ExtensionPointerLockAccessFail
ExtensionPointerLockAccessPass
EscapingMouseLock
MouseLockSilentAfterTargetUnlock
TestTabDoesntExitMouseLockOnSubFrameNavigation
TestTabExitsMouseLockOnGoBack
TestTabExitsMouseLockOnNavigation
PointerLock_PointerLockLostWithFocus

that were using the prefixed API (""Uncaught TypeError: undefined is not a function").

See
http://build.chromium.org/p/chromium.webkit/builders/Linux%20ChromiumOS%20Tests%20%282%29/builds/735/steps/interactive_ui_tests/logs/stdio

Original issue's description:
> Remove prefixed Pointer Lock API.
> 
> The Pointer Lock API http://www.w3.org/TR/pointerlock has already been
> implemented without prefix, this change removes the 'webkit' prefixed
> API endpoints.
> 
> Intent to Deprecate and Remove:
> https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/tN8fWRtG0MI
> 
> BUG=398457
> 
> Committed: https://src.chromium.org/viewvc/blink?view=rev&revision=179172

TBR=abarth@chromium.org,scheib@chromium.org
NOTREECHECKS=true
NOTRY=true
BUG=398457

Review URL: https://codereview.chromium.org/424213007

git-svn-id: svn://svn.chromium.org/blink/trunk@179186 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1735b90d
......@@ -582,6 +582,7 @@ crbug.com/255714 [ Linux ] editing/execCommand/switch-list-type-with-orphaned-li
crbug.com/231910 fast/dom/vertical-scrollbar-in-rtl.html [ Failure Pass ]
crbug.com/310323 http/tests/pointer-lock/iframe-sandboxed-allow-pointer-lock.html [ Crash Pass ]
crbug.com/310323 http/tests/pointer-lock/iframe-sandboxed-allow-pointer-lock-prefixed.html [ Crash Pass ]
# TODO(enne): rebaseline these and leave them as flaky timeouts
crbug.com/306595 svg/W3C-SVG-1.1-SE/struct-dom-11-f.svg [ Pass Timeout NeedsManualRebaseline ]
......
Test sandboxed iframe with allow-pointer-lock allows pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe-prefixed.html onwebkitpointerlockchange, document.webkitPointerLockElement = [object HTMLBodyElement]"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/inner-iframe-prefixed.html" sandbox="allow-pointer-lock allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test sandboxed iframe with allow-pointer-lock allows pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["eval", 'document.body.webkitRequestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html onwebkitpointerlockchange, document.webkitPointerLockElement = [object HTMLBodyElement]");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
Test nested sandboxed iframes with allow-pointer-lock allow pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe-prefixed.html onwebkitpointerlockchange, document.webkitPointerLockElement = [object HTMLBodyElement]"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/iframe-allows-inner-iframe-prefixed.html" sandbox="allow-pointer-lock allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test nested sandboxed iframes with allow-pointer-lock allow pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.webkitRequestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html onwebkitpointerlockchange, document.webkitPointerLockElement = [object HTMLBodyElement]");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
CONSOLE ERROR: Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.
Test nested sandboxed iframes without and then with allow-pointer-lock disallow pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe-prefixed.html onwebkitpointerlockerror"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/iframe-allows-inner-iframe-prefixed.html" sandbox="allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test nested sandboxed iframes without and then with allow-pointer-lock disallow pointer lock.");
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["pass message down", "eval", 'document.body.webkitRequestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html onwebkitpointerlockerror");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
CONSOLE ERROR: Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.
Test sandboxed iframe blocks pointer lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS message is "inner-iframe-prefixed.html onwebkitpointerlockerror"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/inner-iframe-prefixed.html" sandbox="allow-scripts" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test sandboxed iframe blocks pointer lock.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
iframe.contentWindow.postMessage(["eval", 'document.body.webkitRequestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html onwebkitpointerlockerror");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
Test iframe from different origin can not access webkitPointerLockElement.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Lock targetDiv1.
PASS onwebkitpointerlockchange received after: Lock targetDiv1.
PASS document.webkitPointerLockElement is targetDiv1
PASS message is "inner-iframe-prefixed.html document.webkitPointerLockElement = null"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="http://localhost:8080/resources/pointer-lock/inner-iframe-prefixed.html" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test iframe from different origin can not access webkitPointerLockElement.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
expectOnlyChangeEvent("Lock targetDiv1.");
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("document.webkitPointerLockElement", "targetDiv1");
doNextStep();
},
function () {
iframe.contentWindow.postMessage(["eval", 'parent.postMessage(thisFileName() + " document.webkitPointerLockElement = " + document.webkitPointerLockElement, "*")'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html document.webkitPointerLockElement = null");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
Test iframe from same origin can not access webkitPointerLockElement.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Lock targetDiv1.
PASS onwebkitpointerlockchange received after: Lock targetDiv1.
PASS document.webkitPointerLockElement is targetDiv1
PASS message is "inner-iframe-prefixed.html document.webkitPointerLockElement = null"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/inner-iframe-prefixed.html" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test iframe from same origin can not access webkitPointerLockElement.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
expectOnlyChangeEvent("Lock targetDiv1.");
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("document.webkitPointerLockElement", "targetDiv1");
doNextStep();
},
function () {
iframe.contentWindow.postMessage(["eval", 'parent.postMessage(thisFileName() + " document.webkitPointerLockElement = " + document.webkitPointerLockElement, "*")'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html document.webkitPointerLockElement = null");
window.onmessage = null;
doNextStep();
}
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
Test iframe from same origin can not transfer pointer lock across documents.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Lock targetDiv1.
PASS onwebkitpointerlockchange received after: Lock targetDiv1.
PASS document.webkitPointerLockElement is targetDiv1
PASS message is "inner-iframe-prefixed.html onwebkitpointerlockerror"
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
<script src="../resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<iframe src="../resources/pointer-lock/inner-iframe-prefixed.html" onload="doNextStepWithUserGesture()"></iframe>
</div>
<script>
description("Test iframe from same origin can not transfer pointer lock across documents.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
iframe = document.getElementsByTagName("iframe")[0];
todo = [
function () {
expectOnlyChangeEvent("Lock targetDiv1.");
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("document.webkitPointerLockElement", "targetDiv1");
doNextStep();
},
function () {
iframe.contentWindow.postMessage(["eval", 'document.body.webkitRequestPointerLock()'], "*");
window.onmessage = function (messageEvent) {
message = messageEvent.data;
shouldBeEqualToString("message", "inner-iframe-prefixed.html onwebkitpointerlockerror");
window.onmessage = null;
doNextStep();
}
},
function () {
iframe.contentWindow.postMessage(["eval", 'document.webkitExitPointerLock()'], "*");
window.onmessage = function (messageEvent) {
testFailed("webkitExitPointerLock from a document that doesn't have a lock caused an event " + messageEvent.data);
finishJSTest();
}
doNextStep();
},
];
// doNextStep() called by iframe onload handler.
</script>
</body>
</html>
<!DOCTYPE HTML>
<html>
<head>
<script src="iframe-common-prefixed.js"></script>
</head>
<body>
iframe-allows-inner-iframe-prefixed.html
<iframe src="inner-iframe-prefixed.html" sandbox="allow-pointer-lock allow-scripts"></iframe>
</body>
</html>
function thisFileName()
{
return window.location.href.split("/").pop();
}
window.onmessage = function (messageEvent) {
switch (messageEvent.data[0]) {
case "eval":
eval(messageEvent.data[1]);
break;
case "pass message down":
iframe = document.getElementsByTagName("iframe")[0];
iframe.contentWindow.postMessage(messageEvent.data.slice(1), "*");
break;
default:
// Pass all other messages up to parent.
parent.postMessage(messageEvent.data, "*");
}
}
document.onwebkitpointerlockchange = function () {
parent.postMessage(thisFileName() + " onwebkitpointerlockchange, document.webkitPointerLockElement = " + document.webkitPointerLockElement, "*");
}
document.onwebkitpointerlockerror = function () {
parent.postMessage(thisFileName() + " onwebkitpointerlockerror", "*");
}
<!DOCTYPE HTML>
<html>
<head>
<script src="iframe-common-prefixed.js"></script>
</head>
<body>
inner-iframe-prefixed.html
</body>
</html>
// Automatically add doNextStepButton to document for manual tests.
if (!window.testRunner) {
setTimeout(function () {
if (window.doNextStepButtonDisabled)
return;
doNextStepButton = document.body.insertBefore(document.createElement("button"), document.body.firstChild);
doNextStepButton.onclick = doNextStep;
doNextStepButton.innerText = "doNextStep button for manual testing. Use keyboard to select button and press (TAB, then SPACE).";
}, 0);
}
function runOnKeyPress(fn)
{
function keypressHandler() {
document.removeEventListener('keypress', keypressHandler, false);
fn();
}
document.addEventListener('keypress', keypressHandler, false);
if (window.testRunner)
eventSender.keyDown(" ", []);
}
function doNextStep(args)
{
args = args || {};
if (!window.testRunner && args.withUserGesture)
return; // Wait for human to press doNextStep button.
if (typeof(currentStep) == "undefined")
currentStep = 0;
setTimeout(function () {
var thisStep = currentStep++;
if (thisStep < todo.length)
if (args.withUserGesture)
runOnKeyPress(todo[thisStep]);
else
todo[thisStep]();
else if (thisStep == todo.length)
setTimeout(function () { finishJSTest(); }, 0); // Deferred so that excessive doNextStep calls will be observed.
else
testFailed("doNextStep called too many times.");
}, 0);
}
function doNextStepWithUserGesture()
{
doNextStep({withUserGesture: true});
}
function eventExpected(eventHandlerName, message, expectedCalls, targetHanderNode)
{
targetHanderNode[eventHandlerName] = function () {
switch (expectedCalls--) {
case 0:
testFailed(eventHandlerName + " received after: " + message);
finishJSTest();
break;
case 1:
doNextStep();
default:
testPassed(eventHandlerName + " received after: " + message);
};
};
};
function expectOnlyChangeEvent(message, targetDocument) {
debug(" " + message);
targetDocument = targetDocument !== undefined ? targetDocument : document;
eventExpected("onwebkitpointerlockchange", message, 1, targetDocument);
eventExpected("onwebkitpointerlockerror", message, 0, targetDocument);
};
function expectOnlyErrorEvent(message, targetDocument) {
debug(" " + message);
targetDocument = targetDocument !== undefined ? targetDocument : document;
eventExpected("onwebkitpointerlockchange", message, 0, targetDocument);
eventExpected("onwebkitpointerlockerror", message, 1, targetDocument);
};
function expectNoEvents(message, targetDocument) {
debug(" " + message);
targetDocument = targetDocument !== undefined ? targetDocument : document;
eventExpected("onwebkitpointerlockchange", message, 0, targetDocument);
eventExpected("onwebkitpointerlockerror", message, 0, targetDocument);
};
bug 90391: pointer lock mouse move events then window.open should not crash.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Locking targetdiv1.
PASS document.onwebkitpointerlockchange event received.
Sending mouse move events.
Calling window.open.
PASS Didn't crash
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
</div>
<script>
description("bug 90391: pointer lock mouse move events then window.open should not crash.")
window.jsTestIsAsync = true;
targetdiv1 = document.getElementById("target1");
todo = [
function () {
debug(" Locking targetdiv1.")
targetdiv1.webkitRequestPointerLock();
document.onwebkitpointerlockchange = function () {
document.onwebkitpointerlockchange = null;
testPassed("document.onwebkitpointerlockchange event received.");
doNextStep();
};
},
function () {
debug(" Sending mouse move events.")
var mouseMoveEvents = 0;
targetdiv1.onmousemove = function () {
if (++mouseMoveEvents == 2) {
targetdiv1.onmousemove = null;
doNextStep();
}
}
if (window.eventSender) {
eventSender.mouseMoveTo(100, 100);
eventSender.mouseMoveTo(200, 200);
}
},
function () {
debug(" Calling window.open.")
gc();
window.open();
testPassed("Didn't crash");
document.webkitExitPointerLock();
doNextStep();
},
];
doNextStepWithUserGesture();
</script>
</body>
</html>
Test calling lock when already in a locked state.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS document.webkitPointerLockElement is null
Locking targetdiv1.
PASS document.onwebkitpointerlockchange event received.
PASS document.webkitPointerLockElement is targetdiv1
Locking targetdiv1, again.
PASS document.onwebkitpointerlockchange event received.
PASS document.webkitPointerLockElement is targetdiv1
Locking targetdiv2.
PASS document.onwebkitpointerlockchange event received.
PASS document.webkitPointerLockElement is targetdiv2
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<div id="target2"></div>
</div>
<script>
description("Test calling lock when already in a locked state.")
window.jsTestIsAsync = true;
targetdiv1 = document.getElementById("target1");
targetdiv2 = document.getElementById("target2");
// Expect change event only for all transitions below.
expectedTargetToBeLockedString = "";
document.onwebkitpointerlockchange = function ()
{
testPassed("document.onwebkitpointerlockchange event received.");
shouldBe("document.webkitPointerLockElement", expectedTargetToBeLockedString);
doNextStepWithUserGesture();
};
document.onwebkitpointerlockerror =
function () { testFailed("document.onwebkitpointerlockerror event received."); finishJSTest(); };
var expectTarget1Unlock = false;
targetdiv1.addEventListener("webkitpointerlocklost",
function () { shouldBe("expectTarget1Unlock", "true"); });
var expectTarget2Unlock = false;
targetdiv2.addEventListener("webkitpointerlocklost",
function () { shouldBe("expectTarget2Unlock", "true"); });
todo = [
function () {
shouldBe("document.webkitPointerLockElement", "null");
debug(" Locking targetdiv1.")
targetdiv1.webkitRequestPointerLock();
expectedTargetToBeLockedString = "targetdiv1";
// doNextStep() called by onwebkitpointerlockchange handler.
},
function () {
debug(" Locking targetdiv1, again.")
targetdiv1.webkitRequestPointerLock();
expectedTargetToBeLockedString = "targetdiv1";
// doNextStep() called by onwebkitpointerlockchange handler.
},
function () {
debug(" Locking targetdiv2.")
expectTarget1Unlock = true;
targetdiv2.webkitRequestPointerLock();
expectedTargetToBeLockedString = "targetdiv2";
// doNextStep() called by onwebkitpointerlockchange handler.
},
];
doNextStepWithUserGesture();
</script>
</body>
</html>
Test locking an element not in a document is rejected and pointerlockerror event dispatched.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS targetDiv1.parentElement is not null
Remove targetDiv1 from document, and try to lock it.
PASS targetDiv1.parentElement is null
PASS onwebkitpointerlockerror received after: Remove targetDiv1 from document, and try to lock it.
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
</div>
<script>
description("Test locking an element not in a document is rejected and pointerlockerror event dispatched.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
todo = [
function () {
shouldNotBe("targetDiv1.parentElement", "null");
expectOnlyErrorEvent("Remove targetDiv1 from document, and try to lock it.");
targetDiv1.parentElement.removeChild(targetDiv1);
shouldBe("targetDiv1.parentElement", "null");
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
];
doNextStepWithUserGesture();
</script>
</body>
</html>
Test removing an iframe containing a locked element causes lock to be released.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Lock target in iframe. (main document handler)
Lock target in iframe. (iframe handler)
PASS onwebkitpointerlockchange received after: Lock target in iframe. (iframe handler)
PASS targetIframe1.contentDocument.webkitPointerLockElement is targetDiv1
PASS targetDiv1.parentElement.parentElement is targetIframe1.contentDocument.body
Remove iframe & immediately lock target2. (main document handler)
Remove iframe & immediately lock target2. (iframe handler)
PASS document.webkitPointerLockElement is null
PASS onwebkitpointerlockchange received after: Remove iframe & immediately lock target2. (main document handler)
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<iframe id="iframe1"></iframe>
<div id="target2"></div>
</div>
<script>
description("Test removing an iframe containing a locked element causes lock to be released.")
window.jsTestIsAsync = true;
targetIframe1 = document.getElementById("iframe1");
targetDiv2 = document.getElementById("target2");
todo = [
function () {
// Load a blank iframe.
targetIframe1.src = "about:blank";
targetIframe1.onload = function () { doNextStepWithUserGesture(); }
},
function () {
// Nest target element into iframe document.
targetIframe1.contentDocument.body.innerHTML ="<div><div></div></div>";
targetDiv1 = targetIframe1.contentDocument.body.firstChild.firstChild
expectNoEvents("Lock target in iframe. (main document handler)");
expectOnlyChangeEvent("Lock target in iframe. (iframe handler)", targetIframe1.contentDocument);
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("targetIframe1.contentDocument.webkitPointerLockElement", "targetDiv1");
shouldBe("targetDiv1.parentElement.parentElement", "targetIframe1.contentDocument.body");
expectOnlyChangeEvent("Remove iframe & immediately lock target2. (main document handler)");
expectNoEvents("Remove iframe & immediately lock target2. (iframe handler)", targetIframe1.contentDocument);
targetIframe1.parentElement.removeChild(targetIframe1);
targetDiv2.webkitRequestPointerLock();
shouldBe("document.webkitPointerLockElement", "null");
// doNextStep called by event handler.
},
];
doNextStep();
</script>
</body>
</html>
Test removing a locked element from a document causes lock to be released.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Lock target in iframe. (main document handler).
Lock target in iframe. (iframe handler)
PASS onwebkitpointerlockchange received after: Lock target in iframe. (iframe handler)
PASS targetIframe1.contentDocument.webkitPointerLockElement is targetDiv1
PASS targetDiv1.parentElement.parentElement is targetIframe1.contentDocument.body
Remove targetDiv1's parent from iframe & immediately lock target2. (main document handler)
Remove targetDiv1's parent from iframe & immediately lock target2. (iframe handler)
PASS document.webkitPointerLockElement is null
PASS targetDiv1.parentElement.parentElement is null
PASS onwebkitpointerlockerror received after: Remove targetDiv1's parent from iframe & immediately lock target2. (main document handler)
PASS onwebkitpointerlockchange received after: Remove targetDiv1's parent from iframe & immediately lock target2. (iframe handler)
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<iframe id="iframe1"></iframe>
<div id="target2"></div>
</div>
<script>
description("Test removing a locked element from a document causes lock to be released.")
window.jsTestIsAsync = true;
targetIframe1 = document.getElementById("iframe1");
targetDiv2 = document.getElementById("target2");
todo = [
function () {
// Load a blank iframe.
targetIframe1.src = "about:blank";
targetIframe1.onload = function () { doNextStepWithUserGesture(); }
},
function () {
// Nest target element into iframe document.
targetIframe1.contentDocument.body.innerHTML ="<div><div></div></div>";
targetDiv1 = targetIframe1.contentDocument.body.firstChild.firstChild
expectNoEvents("Lock target in iframe. (main document handler).");
expectOnlyChangeEvent("Lock target in iframe. (iframe handler)", targetIframe1.contentDocument);
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("targetIframe1.contentDocument.webkitPointerLockElement", "targetDiv1");
shouldBe("targetDiv1.parentElement.parentElement", "targetIframe1.contentDocument.body");
expectOnlyErrorEvent("Remove targetDiv1's parent from iframe & immediately lock target2. (main document handler)");
expectOnlyChangeEvent("Remove targetDiv1's parent from iframe & immediately lock target2. (iframe handler)", targetIframe1.contentDocument);
targetDiv1.parentElement.parentElement.removeChild(targetDiv1.parentElement);
targetDiv2.webkitRequestPointerLock();
shouldBe("document.webkitPointerLockElement", "null");
shouldBe("targetDiv1.parentElement.parentElement", "null");
// doNextStep called by event handler.
},
function () {
// Absorb an extra doNextStep() from previous event handlers.
},
];
doNextStep();
</script>
</body>
</html>
PASS mouseEvent.webkitMovementX is defined.
PASS mouseEvent.webkitMovementY is defined.
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
</head>
<body>
<script>
var mouseEvent = document.createEvent("MouseEvent");
shouldBeDefined("mouseEvent.webkitMovementX");
shouldBeDefined("mouseEvent.webkitMovementY");
</script>
</body>
</html>
Test mouse events are routed to lock target.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS document.onwebkitpointerlockchange event received.
PASS document.webkitPointerLockElement is targetdiv1
With a lock in place send a click.
PASS event type: mousedown, target: target1, received on: target1
PASS event type: mousedown, target: target1, received on: body
PASS document.onwebkitpointerlockchange event received.
PASS document.webkitPointerLockElement is targetdiv2
With a lock in place send a click.
PASS event type: mousedown, target: target2, received on: target2
PASS event type: mousedown, target: target2, received on: body
Ensure double clicks work as expected, sending 4 clicks.
Creating a click and dblclick.
PASS event type: mousedown, target: target2, received on: target2
PASS event type: mouseup, target: target2, received on: target2
PASS event type: click, target: target2, received on: target2
PASS event type: mousedown, target: target2, received on: target2
PASS event type: mouseup, target: target2, received on: target2
PASS event type: click, target: target2, received on: target2
PASS event type: dblclick, target: target2, received on: target2
Ensuring no false dblclicks if we continue.
PASS event type: mousedown, target: target2, received on: target2
PASS event type: mouseup, target: target2, received on: target2
PASS event type: click, target: target2, received on: target2
PASS event type: mousedown, target: target2, received on: target2
PASS event type: mouseup, target: target2, received on: target2
PASS event type: click, target: target2, received on: target2
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body id="body">
<div>
<div id="target1"></div>
<div id="target2"></div>
</div>
<script>
description("Test mouse events are routed to lock target.")
window.jsTestIsAsync = true;
targetdiv1 = document.getElementById("target1");
targetdiv2 = document.getElementById("target2");
// Expect change event only for all transitions below.
expectedTargetToBeLockedString = "";
document.onwebkitpointerlockchange = function ()
{
testPassed("document.onwebkitpointerlockchange event received.");
shouldBe("document.webkitPointerLockElement", expectedTargetToBeLockedString);
doNextStep();
};
document.onwebkitpointerlockerror =
function () { testFailed("document.onwebkitpointerlockerror event received."); finishJSTest(); };
function eventNotExpected(e) {
testFailed("Unexpected event " + e.type + " on " + e.currentTarget.id);
finishJSTest();
}
function eventExpected(e) {
testPassed("event type: " + e.type + ", target: " + e.target.id + ", received on: " + e.currentTarget.id);
}
todo = [
function () {
targetdiv1.webkitRequestPointerLock();
expectedTargetToBeLockedString = "targetdiv1";
// doNextStep() called by onwebkitpointerlockchange handler.
},
function () {
debug(" With a lock in place send a click.")
targetdiv1.onmousedown = eventExpected;
targetdiv2.onmousedown = eventNotExpected;
document.body.onmousedown = eventExpected;
if (window.eventSender) {
window.eventSender.leapForward(1000);
window.eventSender.mouseDown();
window.eventSender.mouseUp();
}
doNextStepWithUserGesture();
},
function () {
targetdiv2.webkitRequestPointerLock();
expectedTargetToBeLockedString = "targetdiv2";
// doNextStep() called by onwebkitpointerlockchange handler.
},
function () {
debug(" With a lock in place send a click.")
targetdiv1.onmousedown = eventNotExpected;
targetdiv2.onmousedown = eventExpected;
document.body.onmousedown = eventExpected;
if (window.eventSender) {
window.eventSender.leapForward(1000);
window.eventSender.mouseDown();
window.eventSender.mouseUp();
}
doNextStepWithUserGesture();
},
function () {
debug(" Ensure double clicks work as expected, sending 4 clicks.")
targetdiv1.onmousedown = undefined;
document.body.onmousedown = undefined;
targetdiv2.onmousedown = eventExpected;
targetdiv2.onmouseup = eventExpected;
targetdiv2.onclick = eventExpected;
targetdiv2.ondblclick = eventExpected;
debug(" Creating a click and dblclick.");
if (window.eventSender) {
window.eventSender.leapForward(1000);
window.eventSender.mouseDown();
window.eventSender.mouseUp();
window.eventSender.mouseDown();
window.eventSender.mouseUp();
}
debug(" Ensuring no false dblclicks if we continue.");
if (window.eventSender) {
window.eventSender.mouseDown();
window.eventSender.mouseUp();
window.eventSender.mouseDown();
window.eventSender.mouseUp();
}
doNextStepWithUserGesture();
},
];
doNextStepWithUserGesture();
</script>
</body>
</html>
Basic API existence test for Pointer Lock.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS document.onwebkitpointerlockchange is defined.
PASS document.onwebkitpointerlockerror is defined.
PASS document.webkitExitPointerLock is defined.
PASS document.webkitPointerLockElement is null
PASS element.webkitRequestPointerLock is defined.
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
</head>
<body>
<script>
description("Basic API existence test for Pointer Lock.")
shouldBeDefined("document.onwebkitpointerlockchange");
shouldBeDefined("document.onwebkitpointerlockerror");
shouldBeDefined("document.webkitExitPointerLock");
shouldEvaluateTo("document.webkitPointerLockElement", null);
element = document.createElement('x');
shouldBeDefined("element.webkitRequestPointerLock");
</script>
</body>
</html>
Test that webkitpointerlockchange event is dispatched when lock is lost.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS window.testRunner is defined.
Lock targetDiv1.
PASS onwebkitpointerlockchange received after: Lock targetDiv1.
PASS document.webkitPointerLockElement is targetDiv1
Host initiated unlock.
PASS onwebkitpointerlockchange received after: Host initiated unlock.
PASS document.webkitPointerLockElement is null
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
</div>
<script>
description("Test that webkitpointerlockchange event is dispatched when lock is lost.")
window.jsTestIsAsync = true;
shouldBeDefined("window.testRunner");
targetDiv1 = document.getElementById("target1");
todo = [
function () {
expectOnlyChangeEvent("Lock targetDiv1.");
targetDiv1.webkitRequestPointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("document.webkitPointerLockElement", "targetDiv1");
expectOnlyChangeEvent("Host initiated unlock.");
testRunner.didLosePointerLock();
// doNextStep called by event handler.
},
function () {
shouldBe("document.webkitPointerLockElement", "null");
doNextStep();
},
];
doNextStepWithUserGesture();
</script>
</body>
</html>
Test expected pointerlockchange and pointerlockerror events.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
Unlock.
Lock targetDiv1.
PASS onwebkitpointerlockchange received after: Lock targetDiv1.
Unlock again.
PASS onwebkitpointerlockchange received after: Unlock again.
Lock targetDiv1 again.
PASS onwebkitpointerlockchange received after: Lock targetDiv1 again.
Lock targetDiv2.
PASS onwebkitpointerlockchange received after: Lock targetDiv2.
Lock targetDiv2 again.
PASS onwebkitpointerlockchange received after: Lock targetDiv2 again.
Unlock targetDiv2.
PASS onwebkitpointerlockchange received after: Unlock targetDiv2.
Lock targetIframe1.
Lock targetIframe1 (handler for iframe1).
PASS onwebkitpointerlockchange received after: Lock targetIframe1 (handler for iframe1).
Lock targetIframe2.
Lock targetIframe2 (handler for iframe1).
Lock targetIframe2 (handler for iframe2).
PASS onwebkitpointerlockerror received after: Lock targetIframe2 (handler for iframe2).
Unlock targetIframe2.
Unlock targetIframe2 (handler for iframe1).
Unlock targetIframe2 (handler for iframe2).
PASS onwebkitpointerlockchange received after: Unlock targetIframe2 (handler for iframe1).
PASS testRunner.setPointerLockWillFailSynchronously is defined.
Lock with synchronous failure.
PASS onwebkitpointerlockerror received after: Lock with synchronous failure.
PASS testRunner.setPointerLockWillRespondAsynchronously is defined.
PASS testRunner.didAcquirePointerLock is defined.
PASS testRunner.didNotAcquirePointerLock is defined.
Lock with asynchronous failure.
PASS onwebkitpointerlockerror received after: Lock with asynchronous failure.
Lock with asynchronous success.
PASS onwebkitpointerlockchange received after: Lock with asynchronous success.
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
<div id="target2"></div>
<iframe id="iframe1"></iframe>
<iframe id="iframe2"></iframe>
</div>
<script>
description("Test expected pointerlockchange and pointerlockerror events.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
targetDiv2 = document.getElementById("target2");
targetIframe1 = document.getElementById("iframe1");
targetIframe2 = document.getElementById("iframe2");
// Events must not bubble from document.
function errorIfEventsBubble() {
testFailed("Events must not bubble to the window.");
finishJSTest();
}
window.addEventListener("webkitpointerlockchange", errorIfEventsBubble);
window.addEventListener("webkitpointerlockerror", errorIfEventsBubble);
todo = [
function () {
expectNoEvents("Unlock.");
document.webkitExitPointerLock();
doNextStepWithUserGesture();
},
function () {
expectOnlyChangeEvent("Lock targetDiv1.");
targetDiv1.webkitRequestPointerLock();
},
function () {
expectOnlyChangeEvent("Unlock again.");
document.webkitExitPointerLock();
},
function () {
expectOnlyChangeEvent("Lock targetDiv1 again.");
targetDiv1.webkitRequestPointerLock();
},
function () {
expectOnlyChangeEvent("Lock targetDiv2.");
targetDiv2.webkitRequestPointerLock();
},
function () {
expectOnlyChangeEvent("Lock targetDiv2 again.");
targetDiv2.webkitRequestPointerLock();
},
function () {
expectOnlyChangeEvent("Unlock targetDiv2.");
document.webkitExitPointerLock();
},
function () {
targetIframe1.src = "about:blank";
targetIframe1.onload = function () { doNextStep(); }
},
function () {
targetIframe2.src = "about:blank";
targetIframe2.onload = function () { doNextStep(); }
},
function () {
expectNoEvents("Lock targetIframe1.");
expectOnlyChangeEvent("Lock targetIframe1 (handler for iframe1).", targetIframe1.contentDocument);
targetIframe1.contentDocument.body.webkitRequestPointerLock();
},
function () {
expectNoEvents("Lock targetIframe2.");
expectNoEvents("Lock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
expectOnlyErrorEvent("Lock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
targetIframe2.contentDocument.body.webkitRequestPointerLock();
},
function () {
expectNoEvents("Unlock targetIframe2.");
expectOnlyChangeEvent("Unlock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
expectNoEvents("Unlock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
targetIframe1.contentDocument.webkitExitPointerLock();
},
function () {
shouldBeDefined("testRunner.setPointerLockWillFailSynchronously");
testRunner.setPointerLockWillFailSynchronously();
expectOnlyErrorEvent("Lock with synchronous failure.");
targetDiv1.webkitRequestPointerLock();
},
function () {
shouldBeDefined("testRunner.setPointerLockWillRespondAsynchronously");
shouldBeDefined("testRunner.didAcquirePointerLock");
shouldBeDefined("testRunner.didNotAcquirePointerLock");
testRunner.setPointerLockWillRespondAsynchronously();
expectOnlyErrorEvent("Lock with asynchronous failure.");
targetDiv1.webkitRequestPointerLock();
doNextStep();
},
function () {
testRunner.didNotAcquirePointerLock();
},
function () {
testRunner.setPointerLockWillRespondAsynchronously();
expectOnlyChangeEvent("Lock with asynchronous success.");
targetDiv1.webkitRequestPointerLock();
doNextStep();
},
function () {
testRunner.didAcquirePointerLock();
},
];
doNextStep();
</script>
</body>
</html>
Test pointerLockElement is null when a lock is pending.
On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
PASS document.webkitPointerLockElement is null
Lock.
PASS document.webkitPointerLockElement is null
PASS onwebkitpointerlockchange received after: Lock.
PASS document.webkitPointerLockElement is targetDiv1
Unlock.
PASS document.webkitPointerLockElement is targetDiv1
PASS onwebkitpointerlockchange received after: Unlock.
PASS document.webkitPointerLockElement is null
PASS successfullyParsed is true
TEST COMPLETE
<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../http/tests/resources/pointer-lock/pointer-lock-test-harness-prefixed.js"></script>
</head>
<body>
<div>
<div id="target1"></div>
</div>
<script>
description("Test pointerLockElement is null when a lock is pending.")
window.jsTestIsAsync = true;
targetDiv1 = document.getElementById("target1");
todo = [
function () {
shouldBe("document.webkitPointerLockElement", "null");
testRunner.setPointerLockWillRespondAsynchronously();
expectOnlyChangeEvent("Lock.");
targetDiv1.webkitRequestPointerLock();
doNextStep();
},
function () {
shouldBe("document.webkitPointerLockElement", "null");
testRunner.didAcquirePointerLock();
// doNextStep called from event handler set with expect...
},
function () {
shouldBe("document.webkitPointerLockElement", "targetDiv1");
expectOnlyChangeEvent("Unlock.");
document.webkitExitPointerLock();
shouldBe("document.webkitPointerLockElement", "targetDiv1");
// doNextStep called from event handler set with expect...
},
function () {
shouldBe("document.webkitPointerLockElement", "null");
doNextStep();
},
];
doNextStep();
</script>
</body>
</html>
......@@ -266,6 +266,8 @@ public:
DEFINE_ATTRIBUTE_EVENT_LISTENER(touchstart);
DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenchange);
DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitfullscreenerror);
DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitpointerlockchange);
DEFINE_ATTRIBUTE_EVENT_LISTENER(webkitpointerlockerror);
DEFINE_ATTRIBUTE_EVENT_LISTENER(wheel);
bool shouldMergeWithLegacyDescription(ViewportDescription::Type);
......
......@@ -164,6 +164,8 @@ typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;
[MeasureAs=DocumentExitPointerLock] void exitPointerLock();
[MeasureAs=DocumentPointerLockElement] readonly attribute Element pointerLockElement;
[MeasureAs=PrefixedDocumentExitPointerLock, ImplementedAs=exitPointerLock] void webkitExitPointerLock();
[MeasureAs=PrefixedDocumentPointerLockElement, ImplementedAs=pointerLockElement] readonly attribute Element webkitPointerLockElement;
// Event handler attributes
attribute EventHandler onbeforecopy;
......@@ -185,6 +187,8 @@ typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;
[RuntimeEnabled=Touch] attribute EventHandler ontouchstart;
attribute EventHandler onwebkitfullscreenchange;
attribute EventHandler onwebkitfullscreenerror;
attribute EventHandler onwebkitpointerlockchange;
attribute EventHandler onwebkitpointerlockerror;
attribute EventHandler onwheel;
[RuntimeEnabled=Touch] Touch createTouch([Default=Undefined] optional Window window,
......
......@@ -2706,6 +2706,12 @@ void Element::setIsInTopLayer(bool inTopLayer)
lazyReattachIfAttached();
}
void Element::webkitRequestPointerLock()
{
if (document().page())
document().page()->pointerLockController().requestPointerLock(this);
}
void Element::requestPointerLock()
{
if (document().page())
......
......@@ -477,6 +477,7 @@ public:
bool isInTopLayer() const { return hasElementFlag(IsInTopLayer); }
void setIsInTopLayer(bool);
void webkitRequestPointerLock();
void requestPointerLock();
bool isSpellCheckingEnabled() const;
......
......@@ -121,6 +121,7 @@
// W3C version
[LogActivity, LogAllWorlds, MeasureAs=PrefixedElementRequestFullscreen] void webkitRequestFullscreen();
[MeasureAs=PrefixedElementRequestPointerLock] void webkitRequestPointerLock();
[MeasureAs=ElementRequestPointerLock] void requestPointerLock();
// Event handler attributes
......
......@@ -220,6 +220,8 @@ webkitkeyadded
webkitkeyerror
webkitkeymessage
webkitneedkey
webkitpointerlockchange
webkitpointerlockerror
webkitprerenderdomcontentloaded
webkitprerenderload
webkitprerenderstart
......
......@@ -50,6 +50,7 @@ void PointerLockController::requestPointerLock(Element* target)
{
if (!target || !target->inDocument() || m_documentOfRemovedElementWhileWaitingForUnlock) {
enqueueEvent(EventTypeNames::pointerlockerror, target);
enqueueEvent(EventTypeNames::webkitpointerlockerror, target);
return;
}
......@@ -57,21 +58,25 @@ void PointerLockController::requestPointerLock(Element* target)
// FIXME: This message should be moved off the console once a solution to https://bugs.webkit.org/show_bug.cgi?id=103274 exists.
target->document().addConsoleMessage(SecurityMessageSource, ErrorMessageLevel, "Blocked pointer lock on an element because the element's frame is sandboxed and the 'allow-pointer-lock' permission is not set.");
enqueueEvent(EventTypeNames::pointerlockerror, target);
enqueueEvent(EventTypeNames::webkitpointerlockerror, target);
return;
}
if (m_element) {
if (m_element->document() != target->document()) {
enqueueEvent(EventTypeNames::pointerlockerror, target);
enqueueEvent(EventTypeNames::webkitpointerlockerror, target);
return;
}
enqueueEvent(EventTypeNames::pointerlockchange, target);
enqueueEvent(EventTypeNames::webkitpointerlockchange, target);
m_element = target;
} else if (m_page->chrome().client().requestPointerLock()) {
m_lockPending = true;
m_element = target;
} else {
enqueueEvent(EventTypeNames::pointerlockerror, target);
enqueueEvent(EventTypeNames::webkitpointerlockerror, target);
}
}
......@@ -112,18 +117,21 @@ Element* PointerLockController::element() const
void PointerLockController::didAcquirePointerLock()
{
enqueueEvent(EventTypeNames::pointerlockchange, m_element.get());
enqueueEvent(EventTypeNames::webkitpointerlockchange, m_element.get());
m_lockPending = false;
}
void PointerLockController::didNotAcquirePointerLock()
{
enqueueEvent(EventTypeNames::pointerlockerror, m_element.get());
enqueueEvent(EventTypeNames::webkitpointerlockerror, m_element.get());
clearElement();
}
void PointerLockController::didLosePointerLock()
{
enqueueEvent(EventTypeNames::pointerlockchange, m_element ? &m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get());
enqueueEvent(EventTypeNames::webkitpointerlockchange, m_element ? &m_element->document() : m_documentOfRemovedElementWhileWaitingForUnlock.get());
clearElement();
m_documentOfRemovedElementWhileWaitingForUnlock = nullptr;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment