void EventSender::continuousMouseScrollBy(int x, int y) { // continuousMouseScrollBy() mimics devices that send fine-grained scroll events where the 'delta' specified is not the usual // multiple of 120. See http://doc.qt.nokia.com/4.6/qwheelevent.html#delta for a good explanation of this. if (x) { QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneWheelEvent(QEvent::GraphicsSceneWheel, m_mousePos, m_mousePos, x, Qt::NoModifier, Qt::Horizontal); } else event = new QWheelEvent(m_mousePos, m_mousePos, x, m_mouseButtons, Qt::NoModifier, Qt::Horizontal); sendOrQueueEvent(event); } if (y) { QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneWheelEvent(QEvent::GraphicsSceneWheel, m_mousePos, m_mousePos, y, Qt::NoModifier, Qt::Vertical); } else event = new QWheelEvent(m_mousePos, m_mousePos, y, m_mouseButtons, Qt::NoModifier, Qt::Vertical); sendOrQueueEvent(event); } }
void EventSender::continuousMouseScrollBy(int x, int y) { // continuousMouseScrollBy() mimics devices that send fine-grained scroll events where the 'delta' specified is not the usual // multiple of 120. See http://doc.qt.nokia.com/4.6/qwheelevent.html#delta for a good explanation of this. // A wheel delta of 120 (in 1/8 degrees) corresponds to one wheel tick, and we scroll tickStep pixels per wheel tick. const int tickStep = QApplication::wheelScrollLines() * 20; if (x) { QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneWheelEvent(QEvent::GraphicsSceneWheel, m_mousePos, m_mousePos, (x * 120) / tickStep, Qt::NoModifier, Qt::Horizontal); } else event = new QWheelEvent(m_mousePos, m_mousePos, (x * 120) / tickStep, m_mouseButtons, Qt::NoModifier, Qt::Horizontal); sendOrQueueEvent(event); } if (y) { QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneWheelEvent(QEvent::GraphicsSceneWheel, m_mousePos, m_mousePos, (y * 120) / tickStep, Qt::NoModifier, Qt::Vertical); } else event = new QWheelEvent(m_mousePos, m_mousePos, (y * 120) / tickStep, m_mouseButtons, Qt::NoModifier, Qt::Vertical); sendOrQueueEvent(event); } }
void EventSender::mouseDown(int button, const QStringList& modifiers) { Qt::KeyboardModifiers modifs = getModifiers(modifiers); Qt::MouseButton mouseButton; switch (button) { case 0: mouseButton = Qt::LeftButton; break; case 1: mouseButton = Qt::MidButton; break; case 2: mouseButton = Qt::RightButton; break; case 3: // fast/events/mouse-click-events expects the 4th button to be treated as the middle button mouseButton = Qt::MidButton; break; default: mouseButton = Qt::LeftButton; break; } // only consider a click to count, an event originated by the // same previous button and at the same position. if (m_currentButton == button && m_mousePos == m_clickPos && m_clickTimer.isActive()) m_clickCount++; else m_clickCount = 1; m_currentButton = button; m_clickPos = m_mousePos; m_mouseButtons |= mouseButton; // qDebug() << "EventSender::mouseDown" << frame; QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneMouseEvent((m_clickCount == 2) ? QEvent::GraphicsSceneMouseDoubleClick : QEvent::GraphicsSceneMousePress, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, modifs); } else { event = new QMouseEvent((m_clickCount == 2) ? QEvent::MouseButtonDblClick : QEvent::MouseButtonPress, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, modifs); } sendOrQueueEvent(event); m_clickTimer.start(QApplication::doubleClickInterval(), this); }
void EventSender::mouseMoveTo(int x, int y) { // qDebug() << "EventSender::mouseMoveTo" << x << y; m_mousePos = QPoint(x, y); QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneMouseEvent(QEvent::GraphicsSceneMouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier); } else { event = new QMouseEvent(QEvent::MouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier); } sendOrQueueEvent(event); }
void EventSender::mouseUp(int button) { Qt::MouseButton mouseButton; switch (button) { case 0: mouseButton = Qt::LeftButton; break; case 1: mouseButton = Qt::MidButton; break; case 2: mouseButton = Qt::RightButton; break; case 3: // fast/events/mouse-click-events expects the 4th button to be treated as the middle button mouseButton = Qt::MidButton; break; default: mouseButton = Qt::LeftButton; break; } m_mouseButtons &= ~mouseButton; // qDebug() << "EventSender::mouseUp" << frame; QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneMouseEvent(QEvent::GraphicsSceneMouseRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier); } else { event = new QMouseEvent(QEvent::MouseButtonRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier); } sendOrQueueEvent(event); if (m_currentDragData.urls().isEmpty()) return; event = new QDropEvent(m_mousePos, m_currentDragActionsAllowed, &m_currentDragData, m_mouseButtons, Qt::NoModifier); sendEvent(m_page, event); m_currentDragData.clear(); }
QStringList EventSender::contextClick() { QMouseEvent event(QEvent::MouseButtonPress, m_mousePos, Qt::RightButton, Qt::RightButton, Qt::NoModifier); sendEvent(m_page, &event); QMouseEvent event2(QEvent::MouseButtonRelease, m_mousePos, Qt::RightButton, Qt::RightButton, Qt::NoModifier); sendEvent(m_page, &event2); if (isGraphicsBased()) { QGraphicsSceneContextMenuEvent ctxEvent(QEvent::GraphicsSceneContextMenu); ctxEvent.setReason(QGraphicsSceneContextMenuEvent::Mouse); ctxEvent.setPos(m_mousePos); WebCore::WebViewGraphicsBased* view = qobject_cast<WebCore::WebViewGraphicsBased*>(m_page->view()); if (view) sendEvent(view->graphicsView(), &ctxEvent); } else { QContextMenuEvent ctxEvent(QContextMenuEvent::Mouse, m_mousePos); sendEvent(m_page->view(), &ctxEvent); } return DumpRenderTreeSupportQt::contextMenu(m_page); }
void EventSender::mouseMoveTo(int x, int y) { // qDebug() << "EventSender::mouseMoveTo" << x << y; m_mousePos = QPoint(x, y); QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneMouseEvent(QEvent::GraphicsSceneMouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier); } else { event = new QMouseEvent(QEvent::MouseMove, m_mousePos, m_mousePos, Qt::NoButton, m_mouseButtons, Qt::NoModifier); } sendOrQueueEvent(event); if (m_currentDragData.urls().isEmpty()) return; Qt::MouseButtons mouseButtons = m_mouseButtons | Qt::LeftButton; event = new QDragMoveEvent(m_mousePos, m_currentDragActionsAllowed, &m_currentDragData, mouseButtons, Qt::NoModifier); sendEvent(m_page, event); }
void EventSender::mouseUp(int button) { Qt::MouseButton mouseButton; switch (button) { case 0: mouseButton = Qt::LeftButton; break; case 1: mouseButton = Qt::MidButton; break; case 2: mouseButton = Qt::RightButton; break; case 3: // fast/events/mouse-click-events expects the 4th button to be treated as the middle button mouseButton = Qt::MidButton; break; default: mouseButton = Qt::LeftButton; break; } m_mouseButtons &= ~mouseButton; // qDebug() << "EventSender::mouseUp" << frame; QEvent* event; if (isGraphicsBased()) { event = createGraphicsSceneMouseEvent(QEvent::GraphicsSceneMouseRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier); } else { event = new QMouseEvent(QEvent::MouseButtonRelease, m_mousePos, m_mousePos, mouseButton, m_mouseButtons, Qt::NoModifier); } sendOrQueueEvent(event); }
DumpRenderTree::DumpRenderTree() : m_dumpPixels(false) , m_stdin(0) , m_enableTextOutput(false) , m_standAloneMode(false) , m_graphicsBased(false) , m_persistentStoragePath(QString(getenv("DUMPRENDERTREE_TEMP"))) { QByteArray viewMode = getenv("QT_DRT_WEBVIEW_MODE"); if (viewMode == "graphics") setGraphicsBased(true); DumpRenderTreeSupportQt::overwritePluginDirectories(); DumpRenderTreeSupportQt::activeMockDeviceOrientationClient(true); QWebSettings::enablePersistentStorage(m_persistentStoragePath); m_networkAccessManager = new NetworkAccessManager(this); // create our primary testing page/view. if (isGraphicsBased()) { WebViewGraphicsBased* view = new WebViewGraphicsBased(0); m_page = new WebPage(view, this); view->setPage(m_page); m_mainView = view; } else { QWebView* view = new QWebView(0); m_page = new WebPage(view, this); view->setPage(m_page); m_mainView = view; } // Use a frame group name for all pages created by DumpRenderTree to allow // testing of cross-page frame lookup. DumpRenderTreeSupportQt::webPageSetGroupName(m_page, "org.webkit.qt.DumpRenderTree"); m_mainView->setContextMenuPolicy(Qt::NoContextMenu); m_mainView->resize(QSize(LayoutTestController::maxViewWidth, LayoutTestController::maxViewHeight)); // clean up cache by resetting quota. qint64 quota = webPage()->settings()->offlineWebApplicationCacheQuota(); webPage()->settings()->setOfflineWebApplicationCacheQuota(quota); // create our controllers. This has to be done before connectFrame, // as it exports there to the JavaScript DOM window. m_controller = new LayoutTestController(this); connect(m_controller, SIGNAL(showPage()), this, SLOT(showPage())); connect(m_controller, SIGNAL(hidePage()), this, SLOT(hidePage())); // async geolocation permission set by controller connect(m_controller, SIGNAL(geolocationPermissionSet()), this, SLOT(geolocationPermissionSet())); connect(m_controller, SIGNAL(done()), this, SLOT(dump())); m_eventSender = new EventSender(m_page); m_textInputController = new TextInputController(m_page); m_plainTextController = new PlainTextController(m_page); m_gcController = new GCController(m_page); // now connect our different signals connect(m_page, SIGNAL(frameCreated(QWebFrame *)), this, SLOT(connectFrame(QWebFrame *))); connectFrame(m_page->mainFrame()); connect(m_page, SIGNAL(loadFinished(bool)), m_controller, SLOT(maybeDump(bool))); // We need to connect to loadStarted() because notifyDone should only // dump results itself when the last page loaded in the test has finished loading. connect(m_page, SIGNAL(loadStarted()), m_controller, SLOT(resetLoadFinished())); connect(m_page, SIGNAL(windowCloseRequested()), this, SLOT(windowCloseRequested())); connect(m_page, SIGNAL(printRequested(QWebFrame*)), this, SLOT(dryRunPrint(QWebFrame*))); connect(m_page->mainFrame(), SIGNAL(titleChanged(const QString&)), SLOT(titleChanged(const QString&))); connect(m_page, SIGNAL(databaseQuotaExceeded(QWebFrame*,QString)), this, SLOT(dumpDatabaseQuota(QWebFrame*,QString))); connect(m_page, SIGNAL(applicationCacheQuotaExceeded(QWebSecurityOrigin *, quint64)), this, SLOT(dumpApplicationCacheQuota(QWebSecurityOrigin *, quint64))); connect(m_page, SIGNAL(statusBarMessage(const QString&)), this, SLOT(statusBarMessage(const QString&))); QObject::connect(this, SIGNAL(quit()), qApp, SLOT(quit()), Qt::QueuedConnection); DumpRenderTreeSupportQt::setDumpRenderTreeModeEnabled(true); QFocusEvent event(QEvent::FocusIn, Qt::ActiveWindowFocusReason); QApplication::sendEvent(m_mainView, &event); }