Changeset 52008 in webkit


Ignore:
Timestamp:
Dec 11, 2009 10:46:14 AM (14 years ago)
Author:
bweinstein@apple.com
Message:

Fixes <http://webkit.org/b/32303>.
Middle-mouse button not firing mousedown DOM event when autoscroll happens.

Reviewed by Adam Roben.

WebCore:

This fix moves the pan scrolling code into Node.cpp, as part of the default event handler.
We get two wins out of this:

1) Mousedown DOM events are now fired before pan scrolling.
2) Calling event.preventDefault() on a middle mouse button will now prevent pan scrolling.


Added tests to show that middle mousedown DOM events are fired when panscrolling happens, and
that when event.preventDefault is called, pan scrolling doesn't happen.

Tests: platform/win/fast/events/panScroll-event-fired.html

platform/win/fast/events/panScroll-preventDefault.html

  • dom/Node.cpp:

(WebCore::Node::defaultEventHandler): Moved pan scrolling starting code to here.

  • page/EventHandler.cpp:

(WebCore::EventHandler::startPanScrolling): Function to initialize scrolling variables and start timer.
(WebCore::EventHandler::handleMousePressEvent): From here.

  • page/EventHandler.h:

LayoutTests:

Added tests to show that middle mousedown DOM events are fired when panscrolling happens, and
that when event.preventDefault is called, pan scrolling doesn't happen.

  • platform/win/fast/events/panScroll-event-fired-expected.txt: Added.
  • platform/win/fast/events/panScroll-event-fired.html: Added.
  • platform/win/fast/events/panScroll-preventDefault-expected.txt: Added.
  • platform/win/fast/events/panScroll-preventDefault.html: Added.
Location:
trunk
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r52002 r52008  
     12009-12-11  Brian Weinstein  <bweinstein@apple.com>
     2
     3        Reviewed by Adam Roben.
     4
     5        Fixes <http://webkit.org/b/32303>.
     6        Middle-mouse button not firing mousedown DOM event when autoscroll happens.
     7       
     8        Added tests to show that middle mousedown DOM events are fired when panscrolling happens, and
     9        that when event.preventDefault is called, pan scrolling doesn't happen.
     10
     11        * platform/win/fast/events/panScroll-event-fired-expected.txt: Added.
     12        * platform/win/fast/events/panScroll-event-fired.html: Added.
     13        * platform/win/fast/events/panScroll-preventDefault-expected.txt: Added.
     14        * platform/win/fast/events/panScroll-preventDefault.html: Added.
     15
    1162009-12-11  Csaba Osztrogonác  <ossy@webkit.org>
    217
  • trunk/WebCore/ChangeLog

    r52007 r52008  
     12009-12-11  Brian Weinstein  <bweinstein@apple.com>
     2
     3        Reviewed by Adam Roben.
     4
     5        Fixes <http://webkit.org/b/32303>.
     6        Middle-mouse button not firing mousedown DOM event when autoscroll happens.
     7       
     8        This fix moves the pan scrolling code into Node.cpp, as part of the default event handler.
     9        We get two wins out of this:
     10            1) Mousedown DOM events are now fired before pan scrolling.
     11            2) Calling event.preventDefault() on a middle mouse button will now prevent pan scrolling.
     12       
     13        Added tests to show that middle mousedown DOM events are fired when panscrolling happens, and
     14        that when event.preventDefault is called, pan scrolling doesn't happen.
     15
     16        Tests: platform/win/fast/events/panScroll-event-fired.html
     17               platform/win/fast/events/panScroll-preventDefault.html
     18
     19        * dom/Node.cpp:
     20        (WebCore::Node::defaultEventHandler): Moved pan scrolling starting code to here.
     21        * page/EventHandler.cpp:
     22        (WebCore::EventHandler::startPanScrolling): Function to initialize scrolling variables and start timer.
     23        (WebCore::EventHandler::handleMousePressEvent): From here.
     24        * page/EventHandler.h:
     25
    1262009-12-11  Chris Marrin  <cmarrin@apple.com>
    227
  • trunk/WebCore/dom/Node.cpp

    r51162 r52008  
    28282828            if (Frame* frame = document()->frame())
    28292829                frame->eventHandler()->defaultTextInputEventHandler(static_cast<TextEvent*>(event));
     2830#if ENABLE(PAN_SCROLLING)
     2831    } else if (eventType == eventNames().mousedownEvent) {
     2832        MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);
     2833        if (mouseEvent->button() == MiddleButton && !this->isLink()) {
     2834            RenderObject* renderer = this->renderer();
     2835
     2836            while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())) {
     2837                // FIXME: If we start in a frame that can't scroll, we don't want to jump out of it to start scrolling:
     2838                // <https://bugs.webkit.org/show_bug.cgi?id=32399>.
     2839                if (!renderer->parent() && renderer->node() == renderer->document() && renderer->document()->ownerElement())
     2840                    renderer = renderer->document()->ownerElement()->renderer();
     2841                else
     2842                    renderer = renderer->parent();
     2843            }
     2844
     2845            if (renderer) {
     2846                if (Frame* frame = renderer->document()->frame())
     2847                    frame->eventHandler()->startPanScrolling(renderer);
     2848            }
     2849        }
     2850#endif
    28302851    }
    28312852}
  • trunk/WebCore/page/EventHandler.cpp

    r51991 r52008  
    694694
    695695#if ENABLE(PAN_SCROLLING)
     696
     697void EventHandler::startPanScrolling(RenderObject* renderer)
     698{
     699    m_panScrollInProgress = true;
     700    m_panScrollButtonPressed = true;
     701    handleAutoscroll(renderer);
     702    invalidateClick();
     703}
    696704
    697705void EventHandler::updatePanScrollState()
     
    11941202        return true;
    11951203    }
    1196 
    1197     if (mouseEvent.button() == MiddleButton && !mev.isOverLink()) {
    1198         RenderObject* renderer = mev.targetNode()->renderer();
    1199 
    1200         while (renderer && (!renderer->isBox() || !toRenderBox(renderer)->canBeScrolledAndHasScrollableArea())) {
    1201             if (!renderer->parent() && renderer->node() == renderer->document() && renderer->document()->ownerElement())
    1202                 renderer = renderer->document()->ownerElement()->renderer();
    1203             else
    1204                 renderer = renderer->parent();
    1205         }
    1206 
    1207         if (renderer) {
    1208             m_panScrollInProgress = true;
    1209             m_panScrollButtonPressed = true;
    1210             handleAutoscroll(renderer);
    1211             invalidateClick();
    1212             return true;
    1213         }
    1214     }
    12151204#endif
    12161205
  • trunk/WebCore/page/EventHandler.h

    r51991 r52008  
    8888    void setMousePressNode(PassRefPtr<Node>);
    8989
     90    void startPanScrolling(RenderObject*);
    9091    bool panScrollInProgress() { return m_panScrollInProgress; }
    9192    void setPanScrollInProgress(bool inProgress) { m_panScrollInProgress = inProgress; }
Note: See TracChangeset for help on using the changeset viewer.