Changeset 86381 in webkit


Ignore:
Timestamp:
May 12, 2011 2:43:13 PM (13 years ago)
Author:
dbates@webkit.org
Message:

2011-05-12 Daniel Bates <dbates@rim.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] fast/events/fire-mousedown-while-pressing-mouse-button.html failing
https://bugs.webkit.org/show_bug.cgi?id=58863

Fixes an issue where a platform mouse event corresponding to mouse button A
may be associated with the wrong WebCore mouse button when the event occurs
while pressing and holding a mouse button B, where A != B.

For example, a person clicks the middle mouse button while pressing and holding
the left mouse button. Then we dispatch the following DOM events: mouse down for
left button, mouse down for left button, mouse up for left button. But, we should
have dispatched: mouse down for left button, mouse down for middle button, mouse up
for middle button.

  • platform/qt/PlatformMouseEventQt.cpp: (WebCore::mouseEventTypeAndMouseButtonFromQEvent): Added. (WebCore::PlatformMouseEvent::PlatformMouseEvent): Modified to call mouseEventTypeAndMouseButtonFromQEvent() to determine the WebCore mouse event type and button from the platform-specific event.

2011-05-12 Daniel Bates <dbates@rim.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] fast/events/fire-mousedown-while-pressing-mouse-button.html failing
https://bugs.webkit.org/show_bug.cgi?id=58863

Remove test case fast/events/fire-mousedown-while-pressing-mouse-button.html
from the Skipped list since it now passes.

  • platform/qt/Skipped:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r86378 r86381  
     12011-05-12  Daniel Bates  <dbates@rim.com>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] fast/events/fire-mousedown-while-pressing-mouse-button.html failing
     6        https://bugs.webkit.org/show_bug.cgi?id=58863
     7
     8        Remove test case fast/events/fire-mousedown-while-pressing-mouse-button.html
     9        from the Skipped list since it now passes.
     10
     11        * platform/qt/Skipped:
     12
    1132011-05-12  Chang Shu  <cshu@webkit.org>
    214
  • trunk/LayoutTests/platform/qt/Skipped

    r86376 r86381  
    12411241# failing fast tests
    12421242# ============================================================================= #
    1243 
    1244 # [Qt] fast/events/fire-mousedown-while-pressing-mouse-button.html failing
    1245 # https://bugs.webkit.org/show_bug.cgi?id=58863
    1246 fast/events/fire-mousedown-while-pressing-mouse-button.html
    12471243
    12481244# [Qt] fast/ruby/overhang* tests fail
  • trunk/Source/WebCore/ChangeLog

    r86377 r86381  
     12011-05-12  Daniel Bates  <dbates@rim.com>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] fast/events/fire-mousedown-while-pressing-mouse-button.html failing
     6        https://bugs.webkit.org/show_bug.cgi?id=58863
     7
     8        Fixes an issue where a platform mouse event corresponding to mouse button A
     9        may be associated with the wrong WebCore mouse button when the event occurs
     10        while pressing and holding a mouse button B, where A != B.
     11
     12        For example, a person clicks the middle mouse button while pressing and holding
     13        the left mouse button. Then we dispatch the following DOM events: mouse down for
     14        left button, mouse down for left button, mouse up for left button. But, we should
     15        have dispatched: mouse down for left button, mouse down for middle button, mouse up
     16        for middle button.
     17
     18        * platform/qt/PlatformMouseEventQt.cpp:
     19        (WebCore::mouseEventTypeAndMouseButtonFromQEvent): Added.
     20        (WebCore::PlatformMouseEvent::PlatformMouseEvent): Modified to call mouseEventTypeAndMouseButtonFromQEvent()
     21        to determine the WebCore mouse event type and button from the platform-specific event.
     22
    1232011-05-12  Levi Weintraub  <leviw@chromium.org>
    224
  • trunk/Source/WebCore/platform/qt/PlatformMouseEventQt.cpp

    r86273 r86381  
    11/*
    22 * Copyright (C) 2006 Zack Rusin <zack@kde.org>
     3 * Copyright (C) 2011 Research In Motion Limited.
    34 *
    45 * All rights reserved.
     
    4344}
    4445
     46static void mouseEventTypeAndMouseButtonFromQEvent(const QEvent* event, MouseEventType& mouseEventType, MouseButton& mouseButton)
     47{
     48    enum { MouseEvent, GraphicsSceneMouseEvent } frameworkMouseEventType;
     49    switch (event->type()) {
     50    case QEvent::MouseButtonDblClick:
     51    case QEvent::MouseButtonPress:
     52        frameworkMouseEventType = MouseEvent;
     53        mouseEventType = MouseEventPressed;
     54        break;
     55    case QEvent::MouseButtonRelease:
     56        frameworkMouseEventType = MouseEvent;
     57        mouseEventType = MouseEventReleased;
     58        break;
     59    case QEvent::MouseMove:
     60        frameworkMouseEventType = MouseEvent;
     61        mouseEventType = MouseEventMoved;
     62        break;
     63#if !defined(QT_NO_GRAPHICSVIEW)
     64    case QEvent::GraphicsSceneMouseDoubleClick:
     65    case QEvent::GraphicsSceneMousePress:
     66        frameworkMouseEventType = GraphicsSceneMouseEvent;
     67        mouseEventType = MouseEventPressed;
     68        break;
     69    case QEvent::GraphicsSceneMouseRelease:
     70        frameworkMouseEventType = GraphicsSceneMouseEvent;
     71        mouseEventType = MouseEventReleased;
     72        break;
     73    case QEvent::GraphicsSceneMouseMove:
     74        frameworkMouseEventType = GraphicsSceneMouseEvent;
     75        mouseEventType = MouseEventMoved;
     76        break;
     77#endif
     78    default:
     79        ASSERT_NOT_REACHED();
     80        frameworkMouseEventType = MouseEvent;
     81        mouseEventType = MouseEventMoved;
     82        break;
     83    }
     84
     85    Qt::MouseButtons mouseButtons;
     86    switch (frameworkMouseEventType) {
     87    case MouseEvent: {
     88        const QMouseEvent* mouseEvent = static_cast<const QMouseEvent*>(event);
     89        mouseButtons = mouseEventType == MouseEventMoved ? mouseEvent->buttons() : mouseEvent->button();
     90        break;
     91    }
     92    case GraphicsSceneMouseEvent: {
     93        const QGraphicsSceneMouseEvent* mouseEvent = static_cast<const QGraphicsSceneMouseEvent*>(event);
     94        mouseButtons = mouseEventType == MouseEventMoved ? mouseEvent->buttons() : mouseEvent->button();
     95        break;
     96    }
     97    }
     98
     99    if (mouseButtons & Qt::LeftButton)
     100        mouseButton = LeftButton;
     101    else if (mouseButtons & Qt::RightButton)
     102        mouseButton = RightButton;
     103    else if (mouseButtons & Qt::MidButton)
     104        mouseButton = MiddleButton;
     105    else
     106        mouseButton = NoButton;
     107}
     108
    45109#if !defined(QT_NO_GRAPHICSVIEW)
    46110PlatformMouseEvent::PlatformMouseEvent(QGraphicsSceneMouseEvent* event, int clickCount)
     
    48112    m_timestamp = WTF::currentTime();
    49113
    50     switch (event->type()) {
    51     case QEvent::GraphicsSceneMouseDoubleClick:
    52     case QEvent::GraphicsSceneMousePress:
    53         m_eventType = MouseEventPressed;
    54         break;
    55     case QEvent::GraphicsSceneMouseRelease:
    56         m_eventType = MouseEventReleased;
    57         break;
    58     case QEvent::GraphicsSceneMouseMove:
    59     default:
    60         m_eventType = MouseEventMoved;
    61     }
    62 
     114    // FIXME: Why don't we handle a context menu event here as we do in PlatformMouseEvent(QInputEvent*, int)?
     115    // See <https://bugs.webkit.org/show_bug.cgi?id=60728>.
     116    mouseEventTypeAndMouseButtonFromQEvent(event, m_eventType, m_button);
    63117    m_position = IntPoint(event->pos().toPoint());
    64118    m_globalPosition = IntPoint(event->screenPos());
    65 
    66     if (event->button() == Qt::LeftButton || (event->buttons() & Qt::LeftButton))
    67         m_button = LeftButton;
    68     else if (event->button() == Qt::RightButton || (event->buttons() & Qt::RightButton))
    69         m_button = RightButton;
    70     else if (event->button() == Qt::MidButton || (event->buttons() & Qt::MidButton))
    71         m_button = MiddleButton;
    72     else
    73         m_button = NoButton;
    74119
    75120    m_clickCount = clickCount;
     
    82127    m_timestamp = WTF::currentTime();
    83128
    84     QMouseEvent* me = 0;
    85 
    86     switch (event->type()) {
    87     case QEvent::MouseMove:
    88         m_eventType = MouseEventMoved;
    89         me = static_cast<QMouseEvent *>(event);
    90         break;
    91     case QEvent::MouseButtonDblClick:
    92     case QEvent::MouseButtonPress:
    93         m_eventType = MouseEventPressed;
    94         me = static_cast<QMouseEvent *>(event);
    95         break;
    96     case QEvent::MouseButtonRelease:
    97         m_eventType = MouseEventReleased;
    98         me = static_cast<QMouseEvent *>(event);
    99         break;
     129    bool isContextMenuEvent = false;
    100130#ifndef QT_NO_CONTEXTMENU
    101     case QEvent::ContextMenu: {
     131    if (event->type() == QEvent::ContextMenu) {
     132        isContextMenuEvent = true;
    102133        m_eventType = MouseEventPressed;
    103134        QContextMenuEvent* ce = static_cast<QContextMenuEvent*>(event);
     
    105136        m_globalPosition = IntPoint(ce->globalPos());
    106137        m_button = RightButton;
    107         break;
    108138    }
    109 #endif // QT_NO_CONTEXTMENU
    110     default:
    111         m_eventType = MouseEventMoved;
    112     }
    113 
    114     if (me) {
    115         m_position = IntPoint(me->pos());
    116         m_globalPosition = IntPoint(me->globalPos());
    117 
    118         if (me->button() == Qt::LeftButton || (me->buttons() & Qt::LeftButton))
    119             m_button = LeftButton;
    120         else if (me->button() == Qt::RightButton || (me->buttons() & Qt::RightButton))
    121             m_button = RightButton;
    122         else if (me->button() == Qt::MidButton || (me->buttons() & Qt::MidButton))
    123             m_button = MiddleButton;
    124         else
    125             m_button = NoButton;
     139#endif
     140    if (!isContextMenuEvent) {
     141        mouseEventTypeAndMouseButtonFromQEvent(event, m_eventType, m_button);
     142        QMouseEvent* mouseEvent = static_cast<QMouseEvent*>(event);
     143        m_position = IntPoint(mouseEvent->pos());
     144        m_globalPosition = IntPoint(mouseEvent->globalPos());
    126145    }
    127146
Note: See TracChangeset for help on using the changeset viewer.