• commit-queue@webkit.org's avatar
    Source/WebCore: Updating mouse cursor on style changes without emitting fake mousemove event · d9a17e16
    commit-queue@webkit.org authored
    https://bugs.webkit.org/show_bug.cgi?id=101857
    
    Patch by Aivo Paas <aivopaas@gmail.com> on 2013-04-05
    Reviewed by Allan Sandfeld Jensen.
    
    Mouse cursor changes in styles used to be reflected in UI through dispatching a fake
    mousemove event. The old approach has some flaws: it emits a mousemove event in
    javascript when there is no mouse movement involved (bug 85343); the fake mousemove
    event is cancelled while there is a mouse button held down - cursor won't change
    until mouse is moved or the button released (bug 53341).
    
    The new approach does not use the fake mousemove event. Instead, it uses only the logic
    needed for the actual cursor change to happen.
    
    EventHandler::selectCursor was refactored to not take a whole mouse event but instead work with
    HitTestResult so that EventHandler::updateCursor must not create a useless PlatformEvent.
    
    Fixes: https://bugs.webkit.org/show_bug.cgi?id=85343 (mousemove event on cursor change)
           https://bugs.webkit.org/show_bug.cgi?id=53341 (no cursor change when mouse button down)
    
    Tests: fast/events/mouse-cursor-change.html
           fast/events/mouse-cursor-no-mousemove.html
    
    * page/EventHandler.cpp:
    (WebCore::EventHandler::EventHandler):
    (WebCore::EventHandler::clear):
    (WebCore::EventHandler::cursorUpdateTimerFired):
    (WebCore::EventHandler::updateCursor):
    (WebCore::EventHandler::selectCursor):
    (WebCore::EventHandler::handleMouseMoveEvent):
    (WebCore::EventHandler::scheduleCursorUpdate):
    * page/EventHandler.h:
    * page/FrameView.cpp:
    (WebCore::FrameView::shouldSetCursor):
    * page/FrameView.h:
    * page/MouseEventWithHitTestResults.cpp:
    (WebCore::MouseEventWithHitTestResults::isOverLink):
    * rendering/HitTestResult.cpp:
    (WebCore::HitTestResult::isOverLink):
    * rendering/HitTestResult.h:
    * rendering/RenderObject.cpp:
    (WebCore::RenderObject::styleDidChange):
    
    LayoutTests: Updating mouse cursor on style changes without emitting fake mousemove event
    https://bugs.webkit.org/show_bug.cgi?id=101857
    Changing CSS cursor should work no matter is mouse button is pressed or not
    https://bugs.webkit.org/show_bug.cgi?id=53341
    
    Patch by Aivo Paas <aivopaas@gmail.com> on 2013-04-05
    Reviewed by Allan Sandfeld Jensen.
    
    Added tests for changing cursor on mousemove, mousedown, mouseup and mousemove
    while mouse button being held down. Also added test to verify that a mousemove
    event is not fired for changing cursor when mouse is not moving.
    
    * fast/events/mouse-cursor-change-expected.txt: Added.
    * fast/events/mouse-cursor-change.html: Added.
    * fast/events/mouse-cursor-no-mousemove-expected.txt: Added.
    * fast/events/mouse-cursor-no-mousemove.html: Added.
    * platform/mac/TestExpectations:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@147739 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    d9a17e16
MouseEventWithHitTestResults.cpp 1.25 KB