Changeset 52816 in webkit
- Timestamp:
- Jan 5, 2010 11:44:02 AM (14 years ago)
- Location:
- trunk/WebKitTools
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebKitTools/ChangeLog
r52814 r52816 1 2010-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 1 24 2010-01-05 Adam Barth <abarth@webkit.org> 2 25 -
trunk/WebKitTools/DumpRenderTree/qt/DumpRenderTree.pro
r52150 r52816 21 21 PKGCONFIG += fontconfig 22 22 23 QT = core gui network 23 QT = core gui network testlib 24 24 macx: QT += xml 25 25 -
trunk/WebKitTools/DumpRenderTree/qt/EventSenderQt.cpp
r52697 r52816 32 32 //#include <QtDebug> 33 33 34 #include <QtTest/QtTest> 35 34 36 #define KEYCODE_DEL 127 35 37 #define KEYCODE_BACKSPACE 8 … … 39 41 #define KEYCODE_DOWNARROW 0xf701 40 42 43 #define DRT_MESSAGE_DONE (QEvent::User + 1) 44 45 struct DRTEventQueue { 46 QEvent* m_event; 47 int m_delay; 48 }; 49 50 static DRTEventQueue eventQueue[1024]; 51 static unsigned endOfQueue; 52 static unsigned startOfQueue; 41 53 42 54 EventSender::EventSender(QWebPage* parent) … … 44 56 { 45 57 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); 46 65 } 47 66 … … 71 90 72 91 // 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); 75 94 } 76 95 … … 100 119 101 120 // 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); 104 123 } 105 124 … … 108 127 // qDebug() << "EventSender::mouseMoveTo" << x << y; 109 128 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); 112 131 } 113 132 114 133 void EventSender::leapForward(int ms) 115 134 { 116 m_timeLeap += ms;135 eventQueue[endOfQueue].m_delay = ms; 117 136 //qDebug() << "EventSender::leapForward" << ms; 118 137 } … … 376 395 return 0; 377 396 } 397 398 void 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 415 void 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 446 bool 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 32 32 #include <QApplication> 33 33 #include <QEvent> 34 #include <QEventLoop> 34 35 #include <QMouseEvent> 35 36 #include <QObject> … … 49 50 public: 50 51 EventSender(QWebPage* parent); 52 virtual bool eventFilter(QObject* watched, QEvent* event); 51 53 52 54 public slots: … … 70 72 private: 71 73 void sendTouchEvent(QEvent::Type); 74 void sendOrQueueEvent(QEvent*); 75 void replaySavedEvents(bool flush); 72 76 QPoint m_mousePos; 73 77 Qt::MouseButtons m_mouseButtons; 74 78 QWebPage* m_page; 75 79 int m_timeLeap; 80 bool m_mouseButtonPressed; 81 bool m_drag; 82 QEventLoop* m_eventLoop; 76 83 QWebFrame* frameUnderMouse() const; 77 84 #if QT_VERSION >= QT_VERSION_CHECK(4, 6, 0)
Note: See TracChangeset
for help on using the changeset viewer.