Title: [124301] trunk
Revision
124301
Author
[email protected]
Date
2012-07-31 22:10:30 -0700 (Tue, 31 Jul 2012)

Log Message

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.

Source/WebCore:

Test: http/tests/pointer-lock/requestPointerLock-can-not-transfer-between-documents.html

* dom/Document.cpp:
(WebCore::Document::webkitExitPointerLock):
* page/PointerLockController.cpp:
(WebCore::PointerLockController::requestPointerLock):

LayoutTests:

* 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:

Modified Paths

Added Paths

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())
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to