Diff
Modified: trunk/LayoutTests/ChangeLog (124300 => 124301)
--- trunk/LayoutTests/ChangeLog 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/LayoutTests/ChangeLog 2012-08-01 05:10:30 UTC (rev 124301)
@@ -1,3 +1,24 @@
+2012-07-31 Vincent Scheib <[email protected]>
+
+ webkitRequestPointerLock and webkitExitPointerLock limited to the same document of an active Pointer lock.
+ https://bugs.webkit.org/show_bug.cgi?id=91284
+
+ Reviewed by Adrienne Walker.
+
+ Previously, cross-talk between documents was possible, e.g. allowing one
+ document.webkitExitPointerLock to exit the lock from another document.
+ This change brings Pointer Lock closer to the Fullscreen API behavior,
+ and stops the pointer lock target from being transferable between
+ documents.
+
+ * http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents-expected.txt: Added.
+ * http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html: Added.
+ * http/tests/resources/pointer-lock/iframe-common.js:
+ (document.onwebkitpointerlockchange):
+ (document.onwebkitpointerlockerror):
+ * pointer-lock/pointerlockchange-pointerlockerror-events-expected.txt:
+ * pointer-lock/pointerlockchange-pointerlockerror-events.html:
+
2012-07-31 Ami Fischman <[email protected]>
[Chromium][Mac] Assertion failure in null_audio_sink.cc running WebGL video layout test on 10.5 debug bots
Added: trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents-expected.txt (0 => 124301)
--- trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents-expected.txt (rev 0)
+++ trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents-expected.txt 2012-08-01 05:10:30 UTC (rev 124301)
@@ -0,0 +1,13 @@
+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.html onwebkitpointerlockerror"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html (0 => 124301)
--- trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html (rev 0)
+++ trunk/LayoutTests/http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html 2012-08-01 05:10:30 UTC (rev 124301)
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<div>
+ <div id="target1"></div>
+ <iframe src="" _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.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>
+<script src=""
+</body>
+</html>
Modified: trunk/LayoutTests/http/tests/resources/pointer-lock/iframe-common.js (124300 => 124301)
--- trunk/LayoutTests/http/tests/resources/pointer-lock/iframe-common.js 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/LayoutTests/http/tests/resources/pointer-lock/iframe-common.js 2012-08-01 05:10:30 UTC (rev 124301)
@@ -11,3 +11,10 @@
}
}
+document._onwebkitpointerlockchange_ = function () {
+ parent.postMessage(thisFileName() + " onwebkitpointerlockchange, document.webkitPointerLockElement = " + document.webkitPointerLockElement, "*");
+}
+
+document._onwebkitpointerlockerror_ = function () {
+ parent.postMessage(thisFileName() + " onwebkitpointerlockerror", "*");
+}
Modified: trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events-expected.txt (124300 => 124301)
--- trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events-expected.txt 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events-expected.txt 2012-08-01 05:10:30 UTC (rev 124301)
@@ -14,19 +14,19 @@
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).
-PASS onwebkitpointerlockchange received after: Lock targetIframe1.
Lock targetIframe2.
Lock targetIframe2 (handler for iframe1).
Lock targetIframe2 (handler for iframe2).
-PASS onwebkitpointerlockchange received after: Lock targetIframe2 (handler for iframe2).
-PASS onwebkitpointerlockchange received after: Lock targetIframe2 (handler for iframe1).
+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 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.
Modified: trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events.html (124300 => 124301)
--- trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events.html 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/LayoutTests/pointer-lock/pointerlockchange-pointerlockerror-events.html 2012-08-01 05:10:30 UTC (rev 124301)
@@ -47,6 +47,10 @@
targetDiv2.webkitRequestPointerLock();
},
function () {
+ expectOnlyChangeEvent("Unlock targetDiv2.");
+ document.webkitExitPointerLock();
+ },
+ function () {
targetIframe1.src = ""
targetIframe1._onload_ = function () { doNextStep(); }
},
@@ -55,27 +59,21 @@
targetIframe2._onload_ = function () { doNextStep(); }
},
function () {
- expectOnlyChangeEvent("Lock targetIframe1.");
+ expectNoEvents("Lock targetIframe1.");
expectOnlyChangeEvent("Lock targetIframe1 (handler for iframe1).", targetIframe1.contentDocument);
targetIframe1.contentDocument.body.webkitRequestPointerLock();
},
function () {
- // Absorb an extra doNextStep() from previous event handlers.
- },
- function () {
expectNoEvents("Lock targetIframe2.");
- expectOnlyChangeEvent("Lock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
- expectOnlyChangeEvent("Lock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
+ expectNoEvents("Lock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
+ expectOnlyErrorEvent("Lock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
targetIframe2.contentDocument.body.webkitRequestPointerLock();
},
function () {
- // Absorb an extra doNextStep() from previous event handlers.
- },
- function () {
expectNoEvents("Unlock targetIframe2.");
- expectNoEvents("Unlock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
- expectOnlyChangeEvent("Unlock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
- document.webkitExitPointerLock();
+ expectOnlyChangeEvent("Unlock targetIframe2 (handler for iframe1).", targetIframe1.contentDocument);
+ expectNoEvents("Unlock targetIframe2 (handler for iframe2).", targetIframe2.contentDocument);
+ targetIframe1.contentDocument.webkitExitPointerLock();
},
function () {
shouldBeDefined("testRunner.setPointerLockWillFailSynchronously");
Modified: trunk/Source/WebCore/ChangeLog (124300 => 124301)
--- trunk/Source/WebCore/ChangeLog 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/Source/WebCore/ChangeLog 2012-08-01 05:10:30 UTC (rev 124301)
@@ -1,3 +1,23 @@
+2012-07-31 Vincent Scheib <[email protected]>
+
+ webkitRequestPointerLock and webkitExitPointerLock limited to the same document of an active Pointer lock.
+ https://bugs.webkit.org/show_bug.cgi?id=91284
+
+ Reviewed by Adrienne Walker.
+
+ Previously, cross-talk between documents was possible, e.g. allowing one
+ document.webkitExitPointerLock to exit the lock from another document.
+ This change brings Pointer Lock closer to the Fullscreen API behavior,
+ and stops the pointer lock target from being transferable between
+ documents.
+
+ Test: http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html
+
+ * dom/Document.cpp:
+ (WebCore::Document::webkitExitPointerLock):
+ * page/PointerLockController.cpp:
+ (WebCore::PointerLockController::requestPointerLock):
+
2012-07-31 Keishi Hattori <[email protected]>
ColorInputType::typeMismatchFor is returning the opposite bool
Modified: trunk/Source/WebCore/dom/Document.cpp (124300 => 124301)
--- trunk/Source/WebCore/dom/Document.cpp 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/Source/WebCore/dom/Document.cpp 2012-08-01 05:10:30 UTC (rev 124301)
@@ -5829,8 +5829,13 @@
#if ENABLE(POINTER_LOCK)
void Document::webkitExitPointerLock()
{
- if (page())
- page()->pointerLockController()->requestPointerUnlock();
+ if (!page())
+ return;
+ if (Element* target = page()->pointerLockController()->element()) {
+ if (target->document() != this)
+ return;
+ }
+ page()->pointerLockController()->requestPointerUnlock();
}
Element* Document::webkitPointerLockElement() const
Modified: trunk/Source/WebCore/page/PointerLockController.cpp (124300 => 124301)
--- trunk/Source/WebCore/page/PointerLockController.cpp 2012-08-01 05:07:18 UTC (rev 124300)
+++ trunk/Source/WebCore/page/PointerLockController.cpp 2012-08-01 05:10:30 UTC (rev 124301)
@@ -54,6 +54,11 @@
}
if (m_element) {
+ if (m_element->document() != target->document()) {
+ enqueueEvent(eventNames().webkitpointerlockerrorEvent, target);
+ return;
+ }
+
// FIXME: Keep enqueueEvent usage. (https://bugs.webkit.org/show_bug.cgi?id=84402)
enqueueEvent(eventNames().webkitpointerlockchangeEvent, target);
if (m_element->document() != target->document())