Changeset 52816 in webkit


Ignore:
Timestamp:
Jan 5, 2010 11:44:02 AM (14 years ago)
Author:
eric@webkit.org
Message:

2010-01-05 Yael Aharon <yael.aharon@nokia.com>

Reviewed by Kenneth Rohde Christiansen.

[Qt] Reimplement EventSender::leapForward
https://bugs.webkit.org/show_bug.cgi?id=33114

Follow Windows implementation of leapForward. When leapForward is called,
messages are queued and posted after the timeout. A new event loop is created to
handle those messages and the additional messages that are created as a result.

  • DumpRenderTree/qt/DumpRenderTree.pro:
  • DumpRenderTree/qt/EventSenderQt.cpp: (EventSender::EventSender): (EventSender::mouseDown): (EventSender::mouseUp): (EventSender::mouseMoveTo): (EventSender::leapForward): (EventSender::sendOrQueueEvent): (EventSender::replaySavedEvents): (EventSender::eventFilter):
  • DumpRenderTree/qt/EventSenderQt.h:
Location:
trunk/WebKitTools
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKitTools/ChangeLog

    r52814 r52816  
     12010-01-05  Yael Aharon  <yael.aharon@nokia.com>
     2
     3        Reviewed by Kenneth Rohde Christiansen.
     4
     5        [Qt] Reimplement EventSender::leapForward
     6        https://bugs.webkit.org/show_bug.cgi?id=33114
     7
     8        Follow Windows implementation of leapForward. When leapForward is called,
     9        messages are queued and posted after the timeout. A new event loop is created to
     10        handle those messages and the additional messages that are created as a result.
     11
     12        * DumpRenderTree/qt/DumpRenderTree.pro:
     13        * DumpRenderTree/qt/EventSenderQt.cpp:
     14        (EventSender::EventSender):
     15        (EventSender::mouseDown):
     16        (EventSender::mouseUp):
     17        (EventSender::mouseMoveTo):
     18        (EventSender::leapForward):
     19        (EventSender::sendOrQueueEvent):
     20        (EventSender::replaySavedEvents):
     21        (EventSender::eventFilter):
     22        * DumpRenderTree/qt/EventSenderQt.h:
     23
    1242010-01-05  Adam Barth  <abarth@webkit.org>
    225
  • trunk/WebKitTools/DumpRenderTree/qt/DumpRenderTree.pro

    r52150 r52816  
    2121PKGCONFIG += fontconfig
    2222
    23 QT = core gui network
     23QT = core gui network testlib
    2424macx: QT += xml
    2525
  • trunk/WebKitTools/DumpRenderTree/qt/EventSenderQt.cpp

    r52697 r52816  
    3232//#include <QtDebug>
    3333
     34#include <QtTest/QtTest>
     35
    3436#define KEYCODE_DEL         127
    3537#define KEYCODE_BACKSPACE   8
     
    3941#define KEYCODE_DOWNARROW   0xf701
    4042
     43#define DRT_MESSAGE_DONE (QEvent::User + 1)
     44
     45struct DRTEventQueue {
     46    QEvent* m_event;
     47    int m_delay;
     48};
     49
     50static DRTEventQueue eventQueue[1024];
     51static unsigned endOfQueue;
     52static unsigned startOfQueue;
    4153
    4254EventSender::EventSender(QWebPage* parent)
     
    4456{
    4557    m_page = parent;
     58    m_mouseButtonPressed = false;
     59    m_drag = false;
     60    memset(eventQueue, 0, sizeof(eventQueue));
     61    endOfQueue = 0;
     62    startOfQueue = 0;
     63    m_eventLoop = 0;
     64    m_page->view()->installEventFilter(this);
    4665}
    4766
     
    7190
    7291//     qDebug() << "EventSender::mouseDown" << frame;
    73     QMouseEvent event(QEvent::MouseButtonPress, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier);
    74     QApplication::sendEvent(m_page, &event);
     92    QMouseEvent* event = new QMouseEvent(QEvent::MouseButtonPress, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier);
     93    sendOrQueueEvent(event);
    7594}
    7695
     
    100119
    101120//     qDebug() << "EventSender::mouseUp" << frame;
    102     QMouseEvent event(QEvent::MouseButtonRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier);
    103     QApplication::sendEvent(m_page, &event);
     121    QMouseEvent* event = new QMouseEvent(QEvent::MouseButtonRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier);
     122    sendOrQueueEvent(event);
    104123}
    105124
     
    108127//     qDebug() << "EventSender::mouseMoveTo" << x << y;
    109128    m_mousePos = QPoint(x, y);
    110     QMouseEvent event(QEvent::MouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier);
    111     QApplication::sendEvent(m_page, &event);
     129    QMouseEvent* event = new QMouseEvent(QEvent::MouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier);
     130    sendOrQueueEvent(event);
    112131}
    113132
    114133void EventSender::leapForward(int ms)
    115134{
    116     m_timeLeap += ms;
     135    eventQueue[endOfQueue].m_delay = ms;
    117136    //qDebug() << "EventSender::leapForward" << ms;
    118137}
     
    376395    return 0;
    377396}
     397
     398void EventSender::sendOrQueueEvent(QEvent* event)
     399{
     400    // Mouse move events are queued if
     401    // 1. A previous event was queued.
     402    // 2. A delay was set-up by leapForward().
     403    // 3. A call to mouseMoveTo while the mouse button is pressed could initiate a drag operation, and that does not return until mouseUp is processed.
     404    // To be safe and avoid a deadlock, this event is queued.
     405    if (endOfQueue == startOfQueue && !eventQueue[endOfQueue].m_delay && (!(m_mouseButtonPressed && (m_eventLoop && event->type() == QEvent::MouseButtonRelease)))) {
     406        QApplication::sendEvent(m_page->view(), event);
     407        delete event;
     408        return;
     409    }
     410    eventQueue[endOfQueue++].m_event = event;
     411    eventQueue[endOfQueue].m_delay = 0;
     412    replaySavedEvents(event->type() != QEvent::MouseMove);
     413}
     414
     415void EventSender::replaySavedEvents(bool flush)
     416{
     417    if (startOfQueue < endOfQueue) {
     418        // First send all the events that are ready to be sent
     419        while (!eventQueue[startOfQueue].m_delay && startOfQueue < endOfQueue) {
     420            QEvent* ev = eventQueue[startOfQueue++].m_event;
     421            QApplication::postEvent(m_page->view(), ev); // ev deleted by the system
     422        }
     423        if (startOfQueue == endOfQueue) {
     424            // Reset the queue
     425            startOfQueue = 0;
     426            endOfQueue = 0;
     427        } else {
     428            QTest::qWait(eventQueue[startOfQueue].m_delay);
     429            eventQueue[startOfQueue].m_delay = 0;
     430        }
     431    }
     432    if (!flush)
     433        return;
     434
     435    // Send a marker event, it will tell us when it is safe to exit the new event loop
     436    QEvent* drtEvent = new QEvent((QEvent::Type)DRT_MESSAGE_DONE);
     437    QApplication::postEvent(m_page->view(), drtEvent);
     438
     439    // Start an event loop for async handling of Drag & Drop
     440    m_eventLoop = new QEventLoop;
     441    m_eventLoop->exec();
     442    delete m_eventLoop;
     443    m_eventLoop = 0;
     444}
     445
     446bool EventSender::eventFilter(QObject* watched, QEvent* event)
     447{
     448    if (watched != m_page->view())
     449        return false;
     450    switch (event->type()) {
     451    case QEvent::Leave:
     452        return true;
     453    case QEvent::MouseButtonPress:
     454        m_mouseButtonPressed = true;
     455        break;
     456    case QEvent::MouseMove:
     457        if (m_mouseButtonPressed)
     458            m_drag = true;
     459        break;
     460    case QEvent::MouseButtonRelease:
     461        m_mouseButtonPressed = false;
     462        m_drag = false;
     463        break;
     464    case DRT_MESSAGE_DONE:
     465        m_eventLoop->exit();
     466        return true;
     467    }
     468    return false;
     469}
  • trunk/WebKitTools/DumpRenderTree/qt/EventSenderQt.h

    r52192 r52816  
    3232#include <QApplication>
    3333#include <QEvent>
     34#include <QEventLoop>
    3435#include <QMouseEvent>
    3536#include <QObject>
     
    4950public:
    5051    EventSender(QWebPage* parent);
     52    virtual bool eventFilter(QObject* watched, QEvent* event);
    5153
    5254public slots:
     
    7072private:
    7173    void sendTouchEvent(QEvent::Type);
     74    void sendOrQueueEvent(QEvent*);
     75    void replaySavedEvents(bool flush);
    7276    QPoint m_mousePos;
    7377    Qt::MouseButtons m_mouseButtons;
    7478    QWebPage* m_page;
    7579    int m_timeLeap;
     80    bool m_mouseButtonPressed;
     81    bool m_drag;
     82    QEventLoop* m_eventLoop;
    7683    QWebFrame* frameUnderMouse() const;
    7784#if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
Note: See TracChangeset for help on using the changeset viewer.