Title: [163406] trunk/Source/WebCore
Revision
163406
Author
[email protected]
Date
2014-02-04 15:24:00 -0800 (Tue, 04 Feb 2014)

Log Message

Add WK2 event handling path for iOS, and make Mac and iOS code more similar
https://bugs.webkit.org/show_bug.cgi?id=128199

Reviewed by Sam Weinig.

EventHandlerIOS need some changes for WebKit2, where we have no native
widget. Merge those changes from EventHandlerMac.

Make a few drive-by changes to match EventHandlerMac behavior.

Clean up EventHandlerMac, removing trailing whitespace and fixing
the odd comment.

* page/ios/EventHandlerIOS.mm:
(WebCore::EventHandler::passWidgetMouseDownEventToWidget):
(WebCore::EventHandler::passMouseDownEventToWidget):
(WebCore::EventHandler::passSubframeEventToSubframe):
(WebCore::EventHandler::passWheelEventToWidget):
(WebCore::EventHandler::mouseDown):
(WebCore::EventHandler::mouseMoved):
(WebCore::frameHasPlatformWidget):
(WebCore::EventHandler::passMousePressEventToSubframe):
(WebCore::EventHandler::passMouseMoveEventToSubframe):
(WebCore::EventHandler::passMouseReleaseEventToSubframe):
* page/mac/EventHandlerMac.mm:
(WebCore::EventHandler::passWidgetMouseDownEventToWidget):
(WebCore::EventHandler::passMouseDownEventToWidget):
(WebCore::findViewInSubviews):
(WebCore::EventHandler::eventLoopHandleMouseUp):
(WebCore::EventHandler::passWheelEventToWidget):
(WebCore::EventHandler::mouseMoved):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (163405 => 163406)


--- trunk/Source/WebCore/ChangeLog	2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/ChangeLog	2014-02-04 23:24:00 UTC (rev 163406)
@@ -1,3 +1,37 @@
+2014-02-04  Simon Fraser  <[email protected]>
+
+        Add WK2 event handling path for iOS, and make Mac and iOS code more similar
+        https://bugs.webkit.org/show_bug.cgi?id=128199
+
+        Reviewed by Sam Weinig.
+
+        EventHandlerIOS need some changes for WebKit2, where we have no native
+        widget. Merge those changes from EventHandlerMac.
+        
+        Make a few drive-by changes to match EventHandlerMac behavior.
+        
+        Clean up EventHandlerMac, removing trailing whitespace and fixing
+        the odd comment.
+
+        * page/ios/EventHandlerIOS.mm:
+        (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
+        (WebCore::EventHandler::passMouseDownEventToWidget):
+        (WebCore::EventHandler::passSubframeEventToSubframe):
+        (WebCore::EventHandler::passWheelEventToWidget):
+        (WebCore::EventHandler::mouseDown):
+        (WebCore::EventHandler::mouseMoved):
+        (WebCore::frameHasPlatformWidget):
+        (WebCore::EventHandler::passMousePressEventToSubframe):
+        (WebCore::EventHandler::passMouseMoveEventToSubframe):
+        (WebCore::EventHandler::passMouseReleaseEventToSubframe):
+        * page/mac/EventHandlerMac.mm:
+        (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
+        (WebCore::EventHandler::passMouseDownEventToWidget):
+        (WebCore::findViewInSubviews):
+        (WebCore::EventHandler::eventLoopHandleMouseUp):
+        (WebCore::EventHandler::passWheelEventToWidget):
+        (WebCore::EventHandler::mouseMoved):
+
 2014-02-04  Benjamin Poulain  <[email protected]>
 
         [OSX] Limit progress bar's dimensions to ushort

Modified: trunk/Source/WebCore/page/ios/EventHandlerIOS.mm (163405 => 163406)


--- trunk/Source/WebCore/page/ios/EventHandlerIOS.mm	2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/page/ios/EventHandlerIOS.mm	2014-02-04 23:24:00 UTC (rev 163406)
@@ -169,7 +169,7 @@
 bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
 {
     // Figure out which view to send the event to.
-    RenderObject* target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
+    auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
     if (!target || !target->isWidget())
         return false;
 
@@ -216,6 +216,11 @@
         return true;
     }
 
+    // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
+    // dispatching the event.
+    if (!widget->platformWidget())
+        return false;
+
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
 
     NSView *nodeView = widget->platformWidget();
@@ -251,7 +256,12 @@
 
     ASSERT(!m_sendingEventToSubview);
     m_sendingEventToSubview = true;
-    [view mouseDown:currentEvent()];
+
+    {
+        WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
+        [view mouseDown:currentEvent()];
+    }
+
     m_sendingEventToSubview = false;
     
     if (!wasDeferringLoading)
@@ -353,7 +363,7 @@
             Node* node = event.targetNode();
             if (!node)
                 return false;
-            RenderObject* renderer = node->renderer();
+            auto renderer = node->renderer();
             if (!renderer || !renderer->isWidget())
                 return false;
             Widget* widget = toRenderWidget(renderer)->widget();
@@ -391,10 +401,18 @@
 {
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
 
+    if (!widget)
+        return false;
+
+    NSView* nodeView = widget->platformWidget();
+    if (!nodeView) {
+        // WK2 code path. No wheel events on iOS anyway.
+        return false;
+    }
+
     if (currentEvent().type != WebEventScrollWheel || m_sendingEventToSubview || !widget)
         return false;
 
-    NSView* nodeView = widget->platformWidget();
     ASSERT(nodeView);
     ASSERT([nodeView superview]);
     NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:currentEvent().locationInWindow fromView:nil]];
@@ -421,6 +439,7 @@
 
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
 
+    // FIXME: Why is this here? EventHandler::handleMousePressEvent() calls it.
     m_frame.loader().resetMultipleFormSubmissionProtection();
 
     m_mouseDownView = nil;
@@ -463,25 +482,54 @@
     WKBeginObservingContentChanges(true);
     CurrentEventScope scope(event);
     event.wasHandled = mouseMoved(currentPlatformMouseEvent());
+    
+    // FIXME: Why is this here?
     m_frame.document()->updateStyleIfNeeded();
     WKStopObservingContentChanges();
 
     END_BLOCK_OBJC_EXCEPTIONS;
 }
 
+static bool frameHasPlatformWidget(const Frame& frame)
+{
+    if (FrameView* frameView = frame.view()) {
+        if (frameView->platformWidget())
+            return true;
+    }
+
+    return false;
+}
+
 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
 {
-    return passSubframeEventToSubframe(mev, subframe);
+    // WebKit1 code path.
+    if (frameHasPlatformWidget(m_frame))
+        return passSubframeEventToSubframe(mev, subframe);
+
+    // WebKit2 code path.
+    subframe->eventHandler().handleMousePressEvent(mev.event());
+    return true;
 }
 
 bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)
 {
-    return passSubframeEventToSubframe(mev, subframe, hoveredNode);
+    // WebKit1 code path.
+    if (frameHasPlatformWidget(m_frame))
+        return passSubframeEventToSubframe(mev, subframe, hoveredNode);
+
+    subframe->eventHandler().handleMouseMoveEvent(mev.event(), hoveredNode);
+    return true;
 }
 
 bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
 {
-    return passSubframeEventToSubframe(mev, subframe);
+    // WebKit1 code path.
+    if (frameHasPlatformWidget(m_frame))
+        return passSubframeEventToSubframe(mev, subframe);
+
+    // WebKit2 code path.
+    subframe->eventHandler().handleMouseReleaseEvent(mev.event());
+    return true;
 }
 
 unsigned EventHandler::accessKeyModifiers()

Modified: trunk/Source/WebCore/page/mac/EventHandlerMac.mm (163405 => 163406)


--- trunk/Source/WebCore/page/mac/EventHandlerMac.mm	2014-02-04 23:21:23 UTC (rev 163405)
+++ trunk/Source/WebCore/page/mac/EventHandlerMac.mm	2014-02-04 23:24:00 UTC (rev 163406)
@@ -138,13 +138,13 @@
 bool EventHandler::passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults& event)
 {
     // Figure out which view to send the event to.
-    auto target = event.targetNode() ? event.targetNode()->renderer() : 0;
+    auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
     if (!target || !target->isWidget())
         return false;
-    
-    // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will
+
+    // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget() will
     // just pass currentEvent down to the widget, we don't want to call it for events that
-    // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as
+    // don't correspond to Cocoa events. The mousedown/ups will have already been passed on as
     // part of the pressed/released handling.
     return passMouseDownEventToWidget(toRenderWidget(target)->widget());
 }
@@ -176,7 +176,7 @@
 {
     // FIXME: This function always returns true. It should be changed either to return
     // false in some cases or the return value should be removed.
-    
+
     RefPtr<Widget> widget = pWidget;
 
     if (!widget) {
@@ -184,13 +184,13 @@
         return true;
     }
 
-    // In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of
+    // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
     // dispatching the event.
     if (!widget->platformWidget())
         return false;
 
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
-    
+
     NSView *nodeView = widget->platformWidget();
     ASSERT([nodeView superview]);
     NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
@@ -198,7 +198,7 @@
         // We probably hit the border of a RenderWidget
         return true;
     }
-    
+
     Page* page = m_frame.page();
     if (!page)
         return true;
@@ -212,11 +212,11 @@
 
     // We need to "defer loading" while tracking the mouse, because tearing down the
     // page while an AppKit control is tracking the mouse can cause a crash.
-    
+
     // FIXME: In theory, WebCore now tolerates tear-down while tracking the
     // mouse. We should confirm that, and then remove the deferrsLoading
     // hack entirely.
-    
+
     bool wasDeferringLoading = page->defersLoading();
     if (!wasDeferringLoading)
         page->setDefersLoading(true);
@@ -237,7 +237,7 @@
     // Remember which view we sent the event to, so we can direct the release event properly.
     m_mouseDownView = view;
     m_mouseDownWasInSubframe = false;
-    
+
     // Many AppKit widgets run their own event loops and consume events while the mouse is down.
     // When they finish, currentEvent is the mouseUp that they exited on.  We need to update
     // the EventHandler state with this mouseUp, which we never saw.
@@ -250,7 +250,7 @@
 
     return true;
 }
-    
+
 // Note that this does the same kind of check as [target isDescendantOf:superview].
 // There are two differences: This is a lot slower because it has to walk the whole
 // tree, and this works in cases where the target has already been deallocated.
@@ -265,7 +265,7 @@
         }
     }
     END_BLOCK_OBJC_EXCEPTIONS;
-    
+
     return false;
 }
 
@@ -307,13 +307,13 @@
     return true;
 }
 #endif // ENABLE(DRAG_SUPPORT)
-    
+
 bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&)
 {
     NSView *view = mouseDownViewIfStillGood();
     if (!view)
         return false;
-    
+
     if (!m_mouseDownWasInSubframe) {
         ASSERT(!m_sendingEventToSubview);
         m_sendingEventToSubview = true;
@@ -440,9 +440,10 @@
     ASSERT(nodeView);
     ASSERT([nodeView superview]);
     NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
-    if (!view)
+    if (!view) {
         // We probably hit the border of a RenderWidget
         return false;
+    }
 
     ASSERT(!m_sendingEventToSubview);
     m_sendingEventToSubview = true;
@@ -454,7 +455,7 @@
     setNSScrollViewScrollWheelShouldRetainSelf(false);
     m_sendingEventToSubview = false;
     return true;
-            
+
     END_BLOCK_OBJC_EXCEPTIONS;
     return false;
 }
@@ -591,7 +592,7 @@
     // These happen because WebKit sometimes has to fake up moved events.
     if (!m_frame.view() || m_mousePressed || m_sendingEventToSubview)
         return;
-    
+
     BEGIN_BLOCK_OBJC_EXCEPTIONS;
     CurrentEventScope scope(event);
     mouseMoved(currentPlatformMouseEvent());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to