Changeset 156815 in webkit


Ignore:
Timestamp:
Oct 2, 2013 6:32:43 PM (11 years ago)
Author:
akling@apple.com
Message:

CTTE: Drag events are only dispatched on Elements.
<https://webkit.org/b/122250>

Reviewed by Antti Koivisto.

We never dispatch drag events on non-Element nodes so tighten up the
code to operate on Elements instead.

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r156814 r156815  
     12013-10-02  Andreas Kling  <akling@apple.com>
     2
     3        CTTE: Drag events are only dispatched on Elements.
     4        <https://webkit.org/b/122250>
     5
     6        Reviewed by Antti Koivisto.
     7
     8        We never dispatch drag events on non-Element nodes so tighten up the
     9        code to operate on Elements instead.
     10
    1112013-10-02  Hans Muller  <hmuller@adobe.com>
    212
  • trunk/Source/WebCore/page/EventHandler.cpp

    r156800 r156815  
    19661966#if ENABLE(DRAG_SUPPORT)
    19671967
    1968 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTarget, const PlatformMouseEvent& event, Clipboard* clipboard)
     1968bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Element& dragTarget, const PlatformMouseEvent& event, Clipboard* clipboard)
    19691969{
    19701970    FrameView* view = m_frame.view();
     
    19841984        0, 0, clipboard);
    19851985
    1986     dragTarget->dispatchEvent(me.get(), IGNORE_EXCEPTION);
     1986    dragTarget.dispatchEvent(me.get(), IGNORE_EXCEPTION);
    19871987    return me->defaultPrevented();
    19881988}
     
    20982098    MouseEventWithHitTestResults mev = prepareMouseEvent(request, event);
    20992099
    2100     // Drag events should never go to text nodes (following IE, and proper mouseover/out dispatch)
    2101     RefPtr<Node> newTarget = mev.targetNode();
    2102     if (newTarget && newTarget->isTextNode())
    2103         newTarget = newTarget->parentOrShadowHostElement();
     2100    RefPtr<Element> newTarget;
     2101    if (Node* targetNode = mev.targetNode()) {
     2102        // Drag events should never go to non-element nodes (following IE, and proper mouseover/out dispatch)
     2103        if (!targetNode->isElementNode())
     2104            newTarget = targetNode->parentOrShadowHostElement();
     2105        else
     2106            newTarget = toElement(targetNode);
     2107    }
    21042108
    21052109    m_autoscrollController->updateDragAndDrop(newTarget.get(), event.position(), event.timestamp());
     
    21212125                dispatchDragSrcEvent(eventNames().dragEvent, event);
    21222126            }
    2123             accept = dispatchDragEvent(eventNames().dragenterEvent, newTarget.get(), event, clipboard);
     2127            accept = dispatchDragEvent(eventNames().dragenterEvent, *newTarget, event, clipboard);
    21242128            if (!accept)
    21252129                accept = findDropZone(newTarget.get(), clipboard);
     
    21302134                accept = targetFrame->eventHandler().updateDragAndDrop(event, clipboard);
    21312135        } else if (m_dragTarget)
    2132             dispatchDragEvent(eventNames().dragleaveEvent, m_dragTarget.get(), event, clipboard);
     2136            dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, clipboard);
    21332137
    21342138        if (newTarget) {
     
    21482152                dispatchDragSrcEvent(eventNames().dragEvent, event);
    21492153            }
    2150             accept = dispatchDragEvent(eventNames().dragoverEvent, newTarget.get(), event, clipboard);
     2154            accept = dispatchDragEvent(eventNames().dragoverEvent, *newTarget, event, clipboard);
    21512155            if (!accept)
    21522156                accept = findDropZone(newTarget.get(), clipboard);
     
    21542158        }
    21552159    }
    2156     m_dragTarget = newTarget;
    2157 
     2160    m_dragTarget = newTarget.release();
    21582161    return accept;
    21592162}
     
    21652168        if (targetFrame)
    21662169            targetFrame->eventHandler().cancelDragAndDrop(event, clipboard);
    2167     } else if (m_dragTarget.get()) {
     2170    } else if (m_dragTarget) {
    21682171        if (dragState().source && dragState().shouldDispatchEvents)
    21692172            dispatchDragSrcEvent(eventNames().dragEvent, event);
    2170         dispatchDragEvent(eventNames().dragleaveEvent, m_dragTarget.get(), event, clipboard);
     2173        dispatchDragEvent(eventNames().dragleaveEvent, *m_dragTarget, event, clipboard);
    21712174    }
    21722175    clearDragState();
     
    21802183        if (targetFrame)
    21812184            preventedDefault = targetFrame->eventHandler().performDragAndDrop(event, clipboard);
    2182     } else if (m_dragTarget.get())
    2183         preventedDefault = dispatchDragEvent(eventNames().dropEvent, m_dragTarget.get(), event, clipboard);
     2185    } else if (m_dragTarget)
     2186        preventedDefault = dispatchDragEvent(eventNames().dropEvent, *m_dragTarget, event, clipboard);
    21842187    clearDragState();
    21852188    return preventedDefault;
     
    21892192{
    21902193    stopAutoscrollTimer();
    2191     m_dragTarget = 0;
     2194    m_dragTarget = nullptr;
    21922195    m_capturingMouseEventsElement = nullptr;
    21932196    m_shouldOnlyFireDragOverEvent = false;
     
    35363539bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent& event)
    35373540{
    3538     return !dispatchDragEvent(eventType, dragState().source.get(), event, dragState().clipboard.get());
     3541    return !dispatchDragEvent(eventType, *dragState().source, event, dragState().clipboard.get());
    35393542}
    35403543   
  • trunk/Source/WebCore/page/EventHandler.h

    r156761 r156815  
    329329    bool dispatchMouseEvent(const AtomicString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);
    330330#if ENABLE(DRAG_SUPPORT)
    331     bool dispatchDragEvent(const AtomicString& eventType, Node* target, const PlatformMouseEvent&, Clipboard*);
     331    bool dispatchDragEvent(const AtomicString& eventType, Element& target, const PlatformMouseEvent&, Clipboard*);
    332332
    333333    void freeClipboard();
     
    462462
    463463#if ENABLE(DRAG_SUPPORT)
    464     RefPtr<Node> m_dragTarget;
     464    RefPtr<Element> m_dragTarget;
    465465    bool m_shouldOnlyFireDragOverEvent;
    466466#endif
Note: See TracChangeset for help on using the changeset viewer.