<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[211235] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/211235">211235</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2017-01-26 15:47:53 -0800 (Thu, 26 Jan 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Pointer lock events should be delivered directly to the target element
https://bugs.webkit.org/show_bug.cgi?id=167134

Patch by Jeremy Jones &lt;jeremyj@apple.com&gt; on 2017-01-26
Reviewed by Jon Lee.

Source/WebCore:

pointer-lock/mouse-event-delivery.html: Enabled for mac, added wheel event tests.

When pointer is locked on an element, route mouse events directly to the target element, instead of
doing the normal event disptach.

* page/EventHandler.cpp:
(WebCore::EventHandler::handleMousePressEvent):
(WebCore::EventHandler::handleMouseDoubleClickEvent):
(WebCore::EventHandler::handleMouseMoveEvent):
(WebCore::EventHandler::handleMouseReleaseEvent):
(WebCore::EventHandler::handleMouseForceEvent):
(WebCore::EventHandler::handleWheelEvent):
* page/PointerLockController.cpp:
(WebCore::PointerLockController::isLocked): Added.
(WebCore::PointerLockController::dispatchLockedWheelEvent): Added.
* page/PointerLockController.h:

LayoutTests:

The pointer-lock/mouse-event-delivery.html test is modified to explicitly move the mouse pointer to a valid
location before sending mouse actions. Without this, the test infrastructure doesn't know that the pointer
is over the web view and doesn't deliver events.

Added code to test for wheel events.

* platform/mac/TestExpectations: enabled test.
* pointer-lock/mouse-event-delivery.html:
* pointer-lock/mouse-event-delivery-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacTestExpectations">trunk/LayoutTests/platform/mac/TestExpectations</a></li>
<li><a href="#trunkLayoutTestspointerlockmouseeventdeliveryexpectedtxt">trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt</a></li>
<li><a href="#trunkLayoutTestspointerlockmouseeventdeliveryhtml">trunk/LayoutTests/pointer-lock/mouse-event-delivery.html</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorepageEventHandlercpp">trunk/Source/WebCore/page/EventHandler.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePointerLockControllercpp">trunk/Source/WebCore/page/PointerLockController.cpp</a></li>
<li><a href="#trunkSourceWebCorepagePointerLockControllerh">trunk/Source/WebCore/page/PointerLockController.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/LayoutTests/ChangeLog        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -1,5 +1,22 @@
</span><span class="cx"> 2017-01-26  Jeremy Jones  &lt;jeremyj@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        Pointer lock events should be delivered directly to the target element
+        https://bugs.webkit.org/show_bug.cgi?id=167134
+
+        Reviewed by Jon Lee.
+
+        The pointer-lock/mouse-event-delivery.html test is modified to explicitly move the mouse pointer to a valid
+        location before sending mouse actions. Without this, the test infrastructure doesn't know that the pointer
+        is over the web view and doesn't deliver events.
+
+        Added code to test for wheel events.
+
+        * platform/mac/TestExpectations: enabled test.
+        * pointer-lock/mouse-event-delivery.html:
+        * pointer-lock/mouse-event-delivery-expected.txt:
+
+2017-01-26  Jeremy Jones  &lt;jeremyj@apple.com&gt;
+
</ins><span class="cx">         Request pointer unlock on navigation and re-enable pointer-lock tests for WK2.
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=166765
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac/TestExpectations (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac/TestExpectations        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/LayoutTests/platform/mac/TestExpectations        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -281,7 +281,6 @@
</span><span class="cx"> pointer-lock/bug90391-move-then-window-open-crash.html
</span><span class="cx"> pointer-lock/locked-element-iframe-removed-from-dom.html
</span><span class="cx"> pointer-lock/locked-element-removed-from-dom.html
</span><del>-pointer-lock/mouse-event-delivery.html
</del><span class="cx"> pointer-lock/pointerlockchange-event-on-lock-lost.html
</span><span class="cx"> pointer-lock/pointerlockchange-pointerlockerror-events.html
</span><span class="cx"> pointer-lock/pointerlockelement-null-when-pending.html
</span></span></pre></div>
<a id="trunkLayoutTestspointerlockmouseeventdeliveryexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -5,11 +5,17 @@
</span><span class="cx"> 
</span><span class="cx"> PASS document.onpointerlockchange event received.
</span><span class="cx"> PASS document.pointerLockElement is targetdiv1
</span><ins>+     With a lock in place send a wheel event.
+PASS event type: wheel, target: target1, received on: target1
+PASS event type: wheel, target: target1, received on: body
</ins><span class="cx">      With a lock in place send a click.
</span><span class="cx"> PASS event type: mousedown, target: target1, received on: target1
</span><span class="cx"> PASS event type: mousedown, target: target1, received on: body
</span><span class="cx"> PASS document.onpointerlockchange event received.
</span><span class="cx"> PASS document.pointerLockElement is targetdiv2
</span><ins>+     With a lock in place send a wheel event.
+PASS event type: wheel, target: target2, received on: target2
+PASS event type: wheel, target: target2, received on: body
</ins><span class="cx">      With a lock in place send a click.
</span><span class="cx"> PASS event type: mousedown, target: target2, received on: target2
</span><span class="cx"> PASS event type: mousedown, target: target2, received on: body
</span></span></pre></div>
<a id="trunkLayoutTestspointerlockmouseeventdeliveryhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/pointer-lock/mouse-event-delivery.html (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/pointer-lock/mouse-event-delivery.html        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/LayoutTests/pointer-lock/mouse-event-delivery.html        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -42,6 +42,18 @@
</span><span class="cx">             // doNextStep() called by onpointerlockchange handler.
</span><span class="cx">         },
</span><span class="cx">         function () {
</span><ins>+            debug(&quot;     With a lock in place send a wheel event.&quot;)
+            targetdiv1.onwheel = eventExpected;
+            targetdiv2.onwheel = eventNotExpected;
+            document.body.onwheel = eventExpected;
+            if (window.eventSender) {
+                window.eventSender.mouseMoveTo(20,20);
+                window.eventSender.leapForward(1000);
+                window.eventSender.mouseScrollBy(0,10);
+            }
+            doNextStep();
+        },
+        function () {
</ins><span class="cx">             debug(&quot;     With a lock in place send a click.&quot;)
</span><span class="cx">             targetdiv1.onmousedown = eventExpected;
</span><span class="cx">             targetdiv2.onmousedown = eventNotExpected;
</span><span class="lines">@@ -59,6 +71,17 @@
</span><span class="cx">             // doNextStep() called by onpointerlockchange handler.
</span><span class="cx">         },
</span><span class="cx">         function () {
</span><ins>+            debug(&quot;     With a lock in place send a wheel event.&quot;)
+            targetdiv1.onwheel = eventNotExpected;
+            targetdiv2.onwheel = eventExpected;
+            document.body.onwheel = eventExpected;
+            if (window.eventSender) {
+                window.eventSender.leapForward(1000);
+                window.eventSender.mouseScrollBy(0,10);
+            }
+            doNextStep();
+        },
+        function () {
</ins><span class="cx">             debug(&quot;     With a lock in place send a click.&quot;)
</span><span class="cx">             targetdiv1.onmousedown = eventNotExpected;
</span><span class="cx">             targetdiv2.onmousedown = eventExpected;
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/Source/WebCore/ChangeLog        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2017-01-26  Jeremy Jones  &lt;jeremyj@apple.com&gt;
+
+        Pointer lock events should be delivered directly to the target element
+        https://bugs.webkit.org/show_bug.cgi?id=167134
+
+        Reviewed by Jon Lee.
+
+        pointer-lock/mouse-event-delivery.html: Enabled for mac, added wheel event tests.
+
+        When pointer is locked on an element, route mouse events directly to the target element, instead of 
+        doing the normal event disptach.
+
+        * page/EventHandler.cpp:
+        (WebCore::EventHandler::handleMousePressEvent):
+        (WebCore::EventHandler::handleMouseDoubleClickEvent):
+        (WebCore::EventHandler::handleMouseMoveEvent):
+        (WebCore::EventHandler::handleMouseReleaseEvent):
+        (WebCore::EventHandler::handleMouseForceEvent):
+        (WebCore::EventHandler::handleWheelEvent):
+        * page/PointerLockController.cpp:
+        (WebCore::PointerLockController::isLocked): Added.
+        (WebCore::PointerLockController::dispatchLockedWheelEvent): Added.
+        * page/PointerLockController.h:
+
</ins><span class="cx"> 2017-01-26  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix CPU / Memory diagnostic logging in PerformanceMonitor
</span></span></pre></div>
<a id="trunkSourceWebCorepageEventHandlercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/EventHandler.cpp (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/EventHandler.cpp        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/Source/WebCore/page/EventHandler.cpp        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -1622,6 +1622,13 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mousedownEvent);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     if (m_frame.mainFrame().pageOverlayController().handleMouseEvent(platformMouseEvent))
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="lines">@@ -1762,6 +1769,13 @@
</span><span class="cx"> 
</span><span class="cx">     UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
</span><span class="cx"> 
</span><ins>+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mouseupEvent);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     // We get this instead of a second mouse-up 
</span><span class="cx">     m_mousePressed = false;
</span><span class="cx">     setLastKnownMousePosition(platformMouseEvent);
</span><span class="lines">@@ -1856,7 +1870,14 @@
</span><span class="cx"> 
</span><span class="cx">     Ref&lt;Frame&gt; protectedFrame(m_frame);
</span><span class="cx">     RefPtr&lt;FrameView&gt; protector(m_frame.view());
</span><del>-    
</del><ins>+
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mousemoveEvent);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     setLastKnownMousePosition(platformMouseEvent);
</span><span class="cx"> 
</span><span class="cx">     if (m_hoverTimer.isActive())
</span><span class="lines">@@ -1990,6 +2011,13 @@
</span><span class="cx"> 
</span><span class="cx">     m_frame.selection().setCaretBlinkingSuspended(false);
</span><span class="cx"> 
</span><ins>+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mouseupEvent);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     if (m_frame.mainFrame().pageOverlayController().handleMouseEvent(platformMouseEvent))
</span><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="lines">@@ -2068,6 +2096,17 @@
</span><span class="cx">     Ref&lt;Frame&gt; protectedFrame(m_frame);
</span><span class="cx">     RefPtr&lt;FrameView&gt; protector(m_frame.view());
</span><span class="cx"> 
</span><ins>+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforcechangedEvent);
+        if (event.type() == PlatformEvent::MouseForceDown)
+            m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforcedownEvent);
+        if (event.type() == PlatformEvent::MouseForceUp)
+            m_frame.page()-&gt;pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforceupEvent);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     setLastKnownMousePosition(event);
</span><span class="cx"> 
</span><span class="cx">     HitTestRequest::HitTestRequestType hitType = HitTestRequest::DisallowUserAgentShadowContent | HitTestRequest::Active;
</span><span class="lines">@@ -2673,6 +2712,13 @@
</span><span class="cx">     if (!view)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><ins>+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()-&gt;pointerLockController().isLocked()) {
+        m_frame.page()-&gt;pointerLockController().dispatchLockedWheelEvent(event);
+        return true;
+    }
+#endif
+
</ins><span class="cx">     m_isHandlingWheelEvent = true;
</span><span class="cx">     setFrameWasScrolledByUser();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorepagePointerLockControllercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PointerLockController.cpp (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PointerLockController.cpp        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/Source/WebCore/page/PointerLockController.cpp        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -120,6 +120,11 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool PointerLockController::isLocked() const
+{
+    return m_element &amp;&amp; !m_lockPending;
+}
+
</ins><span class="cx"> bool PointerLockController::lockPending() const
</span><span class="cx"> {
</span><span class="cx">     return m_lockPending;
</span><span class="lines">@@ -165,6 +170,14 @@
</span><span class="cx">         m_element-&gt;dispatchMouseEvent(event, eventNames().clickEvent, event.clickCount());
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void PointerLockController::dispatchLockedWheelEvent(const PlatformWheelEvent&amp; event)
+{
+    if (!m_element || !m_element-&gt;document().frame())
+        return;
+
+    m_element-&gt;dispatchWheelEvent(event);
+}
+
</ins><span class="cx"> void PointerLockController::clearElement()
</span><span class="cx"> {
</span><span class="cx">     m_lockPending = false;
</span></span></pre></div>
<a id="trunkSourceWebCorepagePointerLockControllerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/page/PointerLockController.h (211234 => 211235)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/page/PointerLockController.h        2017-01-26 23:47:06 UTC (rev 211234)
+++ trunk/Source/WebCore/page/PointerLockController.h        2017-01-26 23:47:53 UTC (rev 211235)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx"> class Document;
</span><span class="cx"> class Page;
</span><span class="cx"> class PlatformMouseEvent;
</span><ins>+class PlatformWheelEvent;
</ins><span class="cx"> class VoidCallback;
</span><span class="cx"> 
</span><span class="cx"> class PointerLockController {
</span><span class="lines">@@ -48,6 +49,7 @@
</span><span class="cx">     void requestPointerUnlockAndForceCursorVisible();
</span><span class="cx">     void elementRemoved(Element&amp;);
</span><span class="cx">     void documentDetached(Document&amp;);
</span><ins>+    bool isLocked() const;
</ins><span class="cx">     WEBCORE_EXPORT bool lockPending() const;
</span><span class="cx">     WEBCORE_EXPORT Element* element() const;
</span><span class="cx"> 
</span><span class="lines">@@ -55,6 +57,7 @@
</span><span class="cx">     WEBCORE_EXPORT void didNotAcquirePointerLock();
</span><span class="cx">     WEBCORE_EXPORT void didLosePointerLock();
</span><span class="cx">     void dispatchLockedMouseEvent(const PlatformMouseEvent&amp;, const AtomicString&amp; eventType);
</span><ins>+    void dispatchLockedWheelEvent(const PlatformWheelEvent&amp;);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     void clearElement();
</span></span></pre>
</div>
</div>

</body>
</html>