Changeset 163406 in webkit


Ignore:
Timestamp:
Feb 4, 2014 3:24:00 PM (10 years ago)
Author:
Simon Fraser
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):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r163402 r163406  
     12014-02-04  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Add WK2 event handling path for iOS, and make Mac and iOS code more similar
     4        https://bugs.webkit.org/show_bug.cgi?id=128199
     5
     6        Reviewed by Sam Weinig.
     7
     8        EventHandlerIOS need some changes for WebKit2, where we have no native
     9        widget. Merge those changes from EventHandlerMac.
     10       
     11        Make a few drive-by changes to match EventHandlerMac behavior.
     12       
     13        Clean up EventHandlerMac, removing trailing whitespace and fixing
     14        the odd comment.
     15
     16        * page/ios/EventHandlerIOS.mm:
     17        (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
     18        (WebCore::EventHandler::passMouseDownEventToWidget):
     19        (WebCore::EventHandler::passSubframeEventToSubframe):
     20        (WebCore::EventHandler::passWheelEventToWidget):
     21        (WebCore::EventHandler::mouseDown):
     22        (WebCore::EventHandler::mouseMoved):
     23        (WebCore::frameHasPlatformWidget):
     24        (WebCore::EventHandler::passMousePressEventToSubframe):
     25        (WebCore::EventHandler::passMouseMoveEventToSubframe):
     26        (WebCore::EventHandler::passMouseReleaseEventToSubframe):
     27        * page/mac/EventHandlerMac.mm:
     28        (WebCore::EventHandler::passWidgetMouseDownEventToWidget):
     29        (WebCore::EventHandler::passMouseDownEventToWidget):
     30        (WebCore::findViewInSubviews):
     31        (WebCore::EventHandler::eventLoopHandleMouseUp):
     32        (WebCore::EventHandler::passWheelEventToWidget):
     33        (WebCore::EventHandler::mouseMoved):
     34
    1352014-02-04  Benjamin Poulain  <bpoulain@apple.com>
    236
  • trunk/Source/WebCore/page/ios/EventHandlerIOS.mm

    r161227 r163406  
    170170{
    171171    // Figure out which view to send the event to.
    172     RenderObject* target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
     172    auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
    173173    if (!target || !target->isWidget())
    174174        return false;
     
    216216        return true;
    217217    }
     218
     219    // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
     220    // dispatching the event.
     221    if (!widget->platformWidget())
     222        return false;
    218223
    219224    BEGIN_BLOCK_OBJC_EXCEPTIONS;
     
    252257    ASSERT(!m_sendingEventToSubview);
    253258    m_sendingEventToSubview = true;
    254     [view mouseDown:currentEvent()];
     259
     260    {
     261        WidgetHierarchyUpdatesSuspensionScope suspendWidgetHierarchyUpdates;
     262        [view mouseDown:currentEvent()];
     263    }
     264
    255265    m_sendingEventToSubview = false;
    256266   
     
    354364            if (!node)
    355365                return false;
    356             RenderObject* renderer = node->renderer();
     366            auto renderer = node->renderer();
    357367            if (!renderer || !renderer->isWidget())
    358368                return false;
     
    392402    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    393403
     404    if (!widget)
     405        return false;
     406
     407    NSView* nodeView = widget->platformWidget();
     408    if (!nodeView) {
     409        // WK2 code path. No wheel events on iOS anyway.
     410        return false;
     411    }
     412
    394413    if (currentEvent().type != WebEventScrollWheel || m_sendingEventToSubview || !widget)
    395414        return false;
    396415
    397     NSView* nodeView = widget->platformWidget();
    398416    ASSERT(nodeView);
    399417    ASSERT([nodeView superview]);
     
    422440    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    423441
     442    // FIXME: Why is this here? EventHandler::handleMousePressEvent() calls it.
    424443    m_frame.loader().resetMultipleFormSubmissionProtection();
    425444
     
    464483    CurrentEventScope scope(event);
    465484    event.wasHandled = mouseMoved(currentPlatformMouseEvent());
     485   
     486    // FIXME: Why is this here?
    466487    m_frame.document()->updateStyleIfNeeded();
    467488    WKStopObservingContentChanges();
     
    470491}
    471492
     493static bool frameHasPlatformWidget(const Frame& frame)
     494{
     495    if (FrameView* frameView = frame.view()) {
     496        if (frameView->platformWidget())
     497            return true;
     498    }
     499
     500    return false;
     501}
     502
    472503bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
    473504{
    474     return passSubframeEventToSubframe(mev, subframe);
     505    // WebKit1 code path.
     506    if (frameHasPlatformWidget(m_frame))
     507        return passSubframeEventToSubframe(mev, subframe);
     508
     509    // WebKit2 code path.
     510    subframe->eventHandler().handleMousePressEvent(mev.event());
     511    return true;
    475512}
    476513
    477514bool EventHandler::passMouseMoveEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe, HitTestResult* hoveredNode)
    478515{
    479     return passSubframeEventToSubframe(mev, subframe, hoveredNode);
     516    // WebKit1 code path.
     517    if (frameHasPlatformWidget(m_frame))
     518        return passSubframeEventToSubframe(mev, subframe, hoveredNode);
     519
     520    subframe->eventHandler().handleMouseMoveEvent(mev.event(), hoveredNode);
     521    return true;
    480522}
    481523
    482524bool EventHandler::passMouseReleaseEventToSubframe(MouseEventWithHitTestResults& mev, Frame* subframe)
    483525{
    484     return passSubframeEventToSubframe(mev, subframe);
     526    // WebKit1 code path.
     527    if (frameHasPlatformWidget(m_frame))
     528        return passSubframeEventToSubframe(mev, subframe);
     529
     530    // WebKit2 code path.
     531    subframe->eventHandler().handleMouseReleaseEvent(mev.event());
     532    return true;
    485533}
    486534
  • trunk/Source/WebCore/page/mac/EventHandlerMac.mm

    r156860 r163406  
    139139{
    140140    // Figure out which view to send the event to.
    141     auto target = event.targetNode() ? event.targetNode()->renderer() : 0;
     141    auto target = event.targetNode() ? event.targetNode()->renderer() : nullptr;
    142142    if (!target || !target->isWidget())
    143143        return false;
    144    
    145     // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget will
     144
     145    // Double-click events don't exist in Cocoa. Since passWidgetMouseDownEventToWidget() will
    146146    // just pass currentEvent down to the widget, we don't want to call it for events that
    147     // don't correspond to Cocoa events.  The mousedown/ups will have already been passed on as
     147    // don't correspond to Cocoa events. The mousedown/ups will have already been passed on as
    148148    // part of the pressed/released handling.
    149149    return passMouseDownEventToWidget(toRenderWidget(target)->widget());
     
    177177    // FIXME: This function always returns true. It should be changed either to return
    178178    // false in some cases or the return value should be removed.
    179    
     179
    180180    RefPtr<Widget> widget = pWidget;
    181181
     
    185185    }
    186186
    187     // In WebKit2 we will never have an NSView. Just return early and let the regular event handler machinery take care of
     187    // In WebKit2 we will never have a native widget. Just return early and let the regular event handler machinery take care of
    188188    // dispatching the event.
    189189    if (!widget->platformWidget())
     
    191191
    192192    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    193    
     193
    194194    NSView *nodeView = widget->platformWidget();
    195195    ASSERT([nodeView superview]);
     
    199199        return true;
    200200    }
    201    
     201
    202202    Page* page = m_frame.page();
    203203    if (!page)
     
    213213    // We need to "defer loading" while tracking the mouse, because tearing down the
    214214    // page while an AppKit control is tracking the mouse can cause a crash.
    215    
     215
    216216    // FIXME: In theory, WebCore now tolerates tear-down while tracking the
    217217    // mouse. We should confirm that, and then remove the deferrsLoading
    218218    // hack entirely.
    219    
     219
    220220    bool wasDeferringLoading = page->defersLoading();
    221221    if (!wasDeferringLoading)
     
    238238    m_mouseDownView = view;
    239239    m_mouseDownWasInSubframe = false;
    240    
     240
    241241    // Many AppKit widgets run their own event loops and consume events while the mouse is down.
    242242    // When they finish, currentEvent is the mouseUp that they exited on.  We need to update
     
    251251    return true;
    252252}
    253    
     253
    254254// Note that this does the same kind of check as [target isDescendantOf:superview].
    255255// There are two differences: This is a lot slower because it has to walk the whole
     
    266266    }
    267267    END_BLOCK_OBJC_EXCEPTIONS;
    268    
     268
    269269    return false;
    270270}
     
    308308}
    309309#endif // ENABLE(DRAG_SUPPORT)
    310    
     310
    311311bool EventHandler::eventLoopHandleMouseUp(const MouseEventWithHitTestResults&)
    312312{
     
    314314    if (!view)
    315315        return false;
    316    
     316
    317317    if (!m_mouseDownWasInSubframe) {
    318318        ASSERT(!m_sendingEventToSubview);
     
    441441    ASSERT([nodeView superview]);
    442442    NSView *view = [nodeView hitTest:[[nodeView superview] convertPoint:[currentNSEvent() locationInWindow] fromView:nil]];
    443     if (!view)
     443    if (!view) {
    444444        // We probably hit the border of a RenderWidget
    445445        return false;
     446    }
    446447
    447448    ASSERT(!m_sendingEventToSubview);
     
    455456    m_sendingEventToSubview = false;
    456457    return true;
    457            
     458
    458459    END_BLOCK_OBJC_EXCEPTIONS;
    459460    return false;
     
    592593    if (!m_frame.view() || m_mousePressed || m_sendingEventToSubview)
    593594        return;
    594    
     595
    595596    BEGIN_BLOCK_OBJC_EXCEPTIONS;
    596597    CurrentEventScope scope(event);
Note: See TracChangeset for help on using the changeset viewer.