Changeset 155519 in webkit


Ignore:
Timestamp:
Sep 11, 2013 4:44:58 AM (11 years ago)
Author:
allan.jensen@digia.com
Message:

Mouseenter/-leave not triggered when element under cursor is moved/removed
https://bugs.webkit.org/show_bug.cgi?id=120786

Reviewed by Antonio Gomes.

Source/WebCore:

When a hovered element is detached it will now emit a fake mousemove event
similar to what happens when a hovered element has CSS display set to none.

Test: fast/events/mouseenterleave-detached-element.html

  • dom/Document.cpp:

(WebCore::Document::hoveredElementDidDetach):

  • page/EventHandler.cpp:

(WebCore::EventHandler::EventHandler):
(WebCore::EventHandler::clear):
(WebCore::EventHandler::handleMouseMoveEvent):

  • page/EventHandler.h:

LayoutTests:

Test of mouseenter/mouseleave events when a hovered element is removed.

  • fast/events/mouseenterleave-detached-element-expected.txt: Added.
  • fast/events/mouseenterleave-detached-element.html: Added.
Location:
trunk
Files:
2 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r155518 r155519  
     12013-09-11  Allan Sandfeld Jensen  <allan.jensen@digia.com>
     2
     3        Mouseenter/-leave not triggered when element under cursor is moved/removed
     4        https://bugs.webkit.org/show_bug.cgi?id=120786
     5
     6        Reviewed by Antonio Gomes.
     7
     8        Test of mouseenter/mouseleave events when a hovered element is removed.
     9
     10        * fast/events/mouseenterleave-detached-element-expected.txt: Added.
     11        * fast/events/mouseenterleave-detached-element.html: Added.
     12
    1132013-09-11  Krzysztof Czech  <k.czech@samsung.com>
    214
  • trunk/Source/WebCore/ChangeLog

    r155518 r155519  
     12013-09-11  Allan Sandfeld Jensen  <allan.jensen@digia.com>
     2
     3        Mouseenter/-leave not triggered when element under cursor is moved/removed
     4        https://bugs.webkit.org/show_bug.cgi?id=120786
     5
     6        Reviewed by Antonio Gomes.
     7
     8        When a hovered element is detached it will now emit a fake mousemove event
     9        similar to what happens when a hovered element has CSS display set to none.
     10
     11        Test: fast/events/mouseenterleave-detached-element.html
     12
     13        * dom/Document.cpp:
     14        (WebCore::Document::hoveredElementDidDetach):
     15        * page/EventHandler.cpp:
     16        (WebCore::EventHandler::EventHandler):
     17        (WebCore::EventHandler::clear):
     18        (WebCore::EventHandler::handleMouseMoveEvent):
     19        * page/EventHandler.h:
     20
    1212013-09-11  Krzysztof Czech  <k.czech@samsung.com>
    222
  • trunk/Source/WebCore/dom/Document.cpp

    r155496 r155519  
    32703270        return;
    32713271
    3272     m_hoveredElement = element->parentElement();
    3273     while (m_hoveredElement && !m_hoveredElement->renderer())
    3274         m_hoveredElement = m_hoveredElement->parentElement();
     3272    RenderObject* hoverAncestor = element->renderer()->hoverAncestor();
     3273    if (hoverAncestor && hoverAncestor->node() && hoverAncestor->node()->isElementNode())
     3274        m_hoveredElement = toElement(hoverAncestor->node());
     3275    else
     3276        m_hoveredElement = 0;
     3277
    32753278    if (frame())
    3276         frame()->eventHandler().scheduleHoverStateUpdate();
     3279        frame()->eventHandler().dispatchFakeMouseMoveEventSoon();
    32773280}
    32783281
  • trunk/Source/WebCore/page/EventHandler.cpp

    r155356 r155519  
    320320    , m_mouseDownWasSingleClickInSelection(false)
    321321    , m_selectionInitiationState(HaveNotStartedSelection)
    322     , m_hoverTimer(this, &EventHandler::hoverTimerFired)
    323322    , m_cursorUpdateTimer(this, &EventHandler::cursorUpdateTimerFired)
    324323    , m_autoscrollController(adoptPtr(new AutoscrollController))
     
    378377void EventHandler::clear()
    379378{
    380     m_hoverTimer.stop();
    381379    m_cursorUpdateTimer.stop();
    382380    m_fakeMouseMoveEventTimer.stop();
     
    17331731    setLastKnownMousePosition(mouseEvent);
    17341732
    1735     if (m_hoverTimer.isActive())
    1736         m_hoverTimer.stop();
    1737 
    17381733    m_cursorUpdateTimer.stop();
    17391734
     
    31023097#endif // ENABLE(CONTEXT_MENUS)
    31033098
    3104 void EventHandler::scheduleHoverStateUpdate()
    3105 {
    3106     if (!m_hoverTimer.isActive())
    3107         m_hoverTimer.startOneShot(0);
    3108 }
    3109 
    31103099void EventHandler::scheduleCursorUpdate()
    31113100{
     
    31893178    ASSERT(m_resizeLayer);
    31903179    m_resizeLayer = 0;
    3191 }
    3192 
    3193 void EventHandler::hoverTimerFired(Timer<EventHandler>*)
    3194 {
    3195     m_hoverTimer.stop();
    3196 
    3197     ASSERT(m_frame.document());
    3198 
    3199     if (RenderView* renderer = m_frame.contentRenderer()) {
    3200         if (FrameView* view = m_frame.view()) {
    3201             HitTestRequest request(HitTestRequest::Move | HitTestRequest::DisallowShadowContent);
    3202             HitTestResult result(view->windowToContents(m_lastKnownMousePosition));
    3203             renderer->hitTest(request, result);
    3204             m_frame.document()->updateHoverActiveState(request, result.innerElement());
    3205         }
    3206     }
    32073180}
    32083181
  • trunk/Source/WebCore/page/EventHandler.h

    r154947 r155519  
    288288    OptionalCursor selectCursor(const HitTestResult&, bool shiftKey);
    289289
    290     void hoverTimerFired(Timer<EventHandler>*);
    291290    void cursorUpdateTimerFired(Timer<EventHandler>*);
    292291
     
    431430    bool m_panScrollButtonPressed;
    432431
    433     Timer<EventHandler> m_hoverTimer;
    434432    Timer<EventHandler> m_cursorUpdateTimer;
    435433
Note: See TracChangeset for help on using the changeset viewer.