Title: [211650] trunk
Revision
211650
Author
commit-qu...@webkit.org
Date
2017-02-03 13:56:43 -0800 (Fri, 03 Feb 2017)

Log Message

Pointer lock events should be delivered directly to the target element
https://bugs.webkit.org/show_bug.cgi?id=167134
rdar://problem/30268004

Patch by Jeremy Jones <jere...@apple.com> on 2017-02-03
Reviewed by Dean Jackson.

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.

The pointer-lock/mouse-event-delivery.html is also modified to explicitly wait for the delivery of the
wheel event before continuing with the test. This prevents flakeyness with the order the events are received.

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:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (211649 => 211650)


--- trunk/LayoutTests/ChangeLog	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/LayoutTests/ChangeLog	2017-02-03 21:56:43 UTC (rev 211650)
@@ -1,3 +1,24 @@
+2017-02-03  Jeremy Jones  <jere...@apple.com>
+
+        Pointer lock events should be delivered directly to the target element
+        https://bugs.webkit.org/show_bug.cgi?id=167134
+        rdar://problem/30268004
+
+        Reviewed by Dean Jackson.
+
+        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.
+
+        The pointer-lock/mouse-event-delivery.html is also modified to explicitly wait for the delivery of the 
+        wheel event before continuing with the test. This prevents flakeyness with the order the events are received.
+
+        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-02-03  Yoav Weiss  <y...@yoav.ws>
 
         Avoid evicting link preload resources when parsing is done.

Modified: trunk/LayoutTests/platform/mac/TestExpectations (211649 => 211650)


--- trunk/LayoutTests/platform/mac/TestExpectations	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/LayoutTests/platform/mac/TestExpectations	2017-02-03 21:56:43 UTC (rev 211650)
@@ -280,7 +280,6 @@
 # Pointer Lock can only check some of the API at the moment.
 pointer-lock/bug90391-move-then-window-open-crash.html
 pointer-lock/locked-element-iframe-removed-from-dom.html
-pointer-lock/mouse-event-delivery.html
 pointer-lock/pointerlockchange-event-on-lock-lost.html
 pointer-lock/pointerlockchange-pointerlockerror-events.html
 pointer-lock/pointerlockelement-null-when-pending.html

Modified: trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt (211649 => 211650)


--- trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/LayoutTests/pointer-lock/mouse-event-delivery-expected.txt	2017-02-03 21:56:43 UTC (rev 211650)
@@ -5,11 +5,17 @@
 
 PASS document.onpointerlockchange event received.
 PASS document.pointerLockElement is targetdiv1
+     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
      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.onpointerlockchange event received.
 PASS document.pointerLockElement is targetdiv2
+     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
      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

Modified: trunk/LayoutTests/pointer-lock/mouse-event-delivery.html (211649 => 211650)


--- trunk/LayoutTests/pointer-lock/mouse-event-delivery.html	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/LayoutTests/pointer-lock/mouse-event-delivery.html	2017-02-03 21:56:43 UTC (rev 211650)
@@ -34,6 +34,10 @@
     function eventExpected(e) {
       testPassed("event type: " + e.type + ", target: " + e.target.id + ", received on: " + e.currentTarget.id);
     }
+    function eventExpectedThenNextStep(e) {
+      testPassed("event type: " + e.type + ", target: " + e.target.id + ", received on: " + e.currentTarget.id);
+      doNextStep();
+    }
 
     todo = [
         function () {
@@ -42,6 +46,17 @@
             // doNextStep() called by onpointerlockchange handler.
         },
         function () {
+            debug("     With a lock in place send a wheel event.")
+            targetdiv1._onwheel_ = eventExpectedThenNextStep;
+            targetdiv2._onwheel_ = eventNotExpected;
+            document.body._onwheel_ = eventExpected;
+            if (window.eventSender) {
+                window.eventSender.mouseMoveTo(20,20);
+                window.eventSender.leapForward(1000);
+                window.eventSender.mouseScrollBy(0,10);
+            }
+        },
+        function () {
             debug("     With a lock in place send a click.")
             targetdiv1._onmousedown_ = eventExpected;
             targetdiv2._onmousedown_ = eventNotExpected;
@@ -59,6 +74,17 @@
             // doNextStep() called by onpointerlockchange handler.
         },
         function () {
+            debug("     With a lock in place send a wheel event.")
+            targetdiv1._onwheel_ = eventNotExpected;
+            targetdiv2._onwheel_ = eventExpected;
+            document.body._onwheel_ = eventExpected;
+            if (window.eventSender) {
+                window.eventSender.leapForward(1000);
+                window.eventSender.mouseScrollBy(0,10);
+            }
+            doNextStep();
+        },
+        function () {
             debug("     With a lock in place send a click.")
             targetdiv1._onmousedown_ = eventNotExpected;
             targetdiv2._onmousedown_ = eventExpected;

Modified: trunk/Source/WebCore/ChangeLog (211649 => 211650)


--- trunk/Source/WebCore/ChangeLog	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/Source/WebCore/ChangeLog	2017-02-03 21:56:43 UTC (rev 211650)
@@ -1,3 +1,28 @@
+2017-02-03  Jeremy Jones  <jere...@apple.com>
+
+        Pointer lock events should be delivered directly to the target element
+        https://bugs.webkit.org/show_bug.cgi?id=167134
+        rdar://problem/30268004
+
+        Reviewed by Dean Jackson.
+
+        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:
+
 2017-02-03  Yoav Weiss  <y...@yoav.ws>
 
         Avoid evicting link preload resources when parsing is done.

Modified: trunk/Source/WebCore/page/EventHandler.cpp (211649 => 211650)


--- trunk/Source/WebCore/page/EventHandler.cpp	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/Source/WebCore/page/EventHandler.cpp	2017-02-03 21:56:43 UTC (rev 211650)
@@ -1621,6 +1621,13 @@
         return true;
     }
 
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mousedownEvent);
+        return true;
+    }
+#endif
+
     if (m_frame.mainFrame().pageOverlayController().handleMouseEvent(platformMouseEvent))
         return true;
 
@@ -1761,6 +1768,13 @@
 
     UserGestureIndicator gestureIndicator(ProcessingUserGesture, m_frame.document());
 
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mouseupEvent);
+        return true;
+    }
+#endif
+
     // We get this instead of a second mouse-up 
     m_mousePressed = false;
     setLastKnownMousePosition(platformMouseEvent);
@@ -1855,7 +1869,14 @@
 
     Ref<Frame> protectedFrame(m_frame);
     RefPtr<FrameView> protector(m_frame.view());
-    
+
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mousemoveEvent);
+        return true;
+    }
+#endif
+
     setLastKnownMousePosition(platformMouseEvent);
 
     if (m_hoverTimer.isActive())
@@ -1989,6 +2010,13 @@
 
     m_frame.selection().setCaretBlinkingSuspended(false);
 
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedMouseEvent(platformMouseEvent, eventNames().mouseupEvent);
+        return true;
+    }
+#endif
+
     if (m_frame.mainFrame().pageOverlayController().handleMouseEvent(platformMouseEvent))
         return true;
 
@@ -2067,6 +2095,17 @@
     Ref<Frame> protectedFrame(m_frame);
     RefPtr<FrameView> protector(m_frame.view());
 
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforcechangedEvent);
+        if (event.type() == PlatformEvent::MouseForceDown)
+            m_frame.page()->pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforcedownEvent);
+        if (event.type() == PlatformEvent::MouseForceUp)
+            m_frame.page()->pointerLockController().dispatchLockedMouseEvent(event, eventNames().webkitmouseforceupEvent);
+        return true;
+    }
+#endif
+
     setLastKnownMousePosition(event);
 
     HitTestRequest::HitTestRequestType hitType = HitTestRequest::DisallowUserAgentShadowContent | HitTestRequest::Active;
@@ -2672,6 +2711,13 @@
     if (!view)
         return false;
 
+#if ENABLE(POINTER_LOCK)
+    if (m_frame.page()->pointerLockController().isLocked()) {
+        m_frame.page()->pointerLockController().dispatchLockedWheelEvent(event);
+        return true;
+    }
+#endif
+
     m_isHandlingWheelEvent = true;
     setFrameWasScrolledByUser();
 

Modified: trunk/Source/WebCore/page/PointerLockController.cpp (211649 => 211650)


--- trunk/Source/WebCore/page/PointerLockController.cpp	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/Source/WebCore/page/PointerLockController.cpp	2017-02-03 21:56:43 UTC (rev 211650)
@@ -123,6 +123,11 @@
     }
 }
 
+bool PointerLockController::isLocked() const
+{
+    return m_element && !m_lockPending;
+}
+
 bool PointerLockController::lockPending() const
 {
     return m_lockPending;
@@ -175,6 +180,14 @@
         m_element->dispatchMouseEvent(event, eventNames().clickEvent, event.clickCount());
 }
 
+void PointerLockController::dispatchLockedWheelEvent(const PlatformWheelEvent& event)
+{
+    if (!m_element || !m_element->document().frame())
+        return;
+
+    m_element->dispatchWheelEvent(event);
+}
+
 void PointerLockController::clearElement()
 {
     m_lockPending = false;

Modified: trunk/Source/WebCore/page/PointerLockController.h (211649 => 211650)


--- trunk/Source/WebCore/page/PointerLockController.h	2017-02-03 21:52:50 UTC (rev 211649)
+++ trunk/Source/WebCore/page/PointerLockController.h	2017-02-03 21:56:43 UTC (rev 211650)
@@ -35,6 +35,7 @@
 class Document;
 class Page;
 class PlatformMouseEvent;
+class PlatformWheelEvent;
 class VoidCallback;
 
 class PointerLockController {
@@ -48,6 +49,7 @@
     void requestPointerUnlockAndForceCursorVisible();
     void elementRemoved(Element&);
     void documentDetached(Document&);
+    bool isLocked() const;
     WEBCORE_EXPORT bool lockPending() const;
     WEBCORE_EXPORT Element* element() const;
 
@@ -55,6 +57,7 @@
     WEBCORE_EXPORT void didNotAcquirePointerLock();
     WEBCORE_EXPORT void didLosePointerLock();
     void dispatchLockedMouseEvent(const PlatformMouseEvent&, const AtomicString& eventType);
+    void dispatchLockedWheelEvent(const PlatformWheelEvent&);
 
 private:
     void clearElement();
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to