diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp | 123 |
1 files changed, 60 insertions, 63 deletions
diff --git a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp index fa0446fec..6ca413f66 100644 --- a/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp +++ b/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp @@ -32,7 +32,6 @@ #include "QtWebPageEventHandler.h" #include "QtWebPageLoadClient.h" #include "QtWebPagePolicyClient.h" -#include "UtilsQt.h" #include "WebBackForwardList.h" #include "WebInspectorProxy.h" #include "WebInspectorServer.h" @@ -185,7 +184,7 @@ static QQuickWebViewPrivate* createPrivateObject(QQuickWebView* publicObject) QQuickWebViewPrivate::FlickableAxisLocker::FlickableAxisLocker() : m_allowedDirection(QQuickFlickable::AutoFlickDirection) - , m_sampleCount(0) + , m_time(0), m_sampleCount(0) { } @@ -197,8 +196,8 @@ QVector2D QQuickWebViewPrivate::FlickableAxisLocker::touchVelocity(const QTouchE if (touchVelocityAvailable) return touchPoint.velocity(); - const QLineF movementLine(touchPoint.screenPos(), m_initialScreenPosition); - const qint64 elapsed = m_time.elapsed(); + const QLineF movementLine(touchPoint.pos(), m_initialPosition); + const ulong elapsed = event->timestamp() - m_time; if (!elapsed) return QVector2D(0, 0); @@ -215,8 +214,8 @@ void QQuickWebViewPrivate::FlickableAxisLocker::update(const QTouchEvent* event) ++m_sampleCount; if (m_sampleCount == 1) { - m_initialScreenPosition = touchPoint.screenPos(); - m_time.restart(); + m_initialPosition = touchPoint.pos(); + m_time = event->timestamp(); return; } @@ -270,7 +269,6 @@ QQuickWebViewPrivate::QQuickWebViewPrivate(QQuickWebView* viewport) , m_useDefaultContentItemSize(true) , m_navigatorQtObjectEnabled(false) , m_renderToOffscreenBuffer(false) - , m_dialogActive(false) , m_allowAnyHTTPSCertificateForLocalHost(false) , m_loadProgress(0) { @@ -297,6 +295,7 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa context = contextRef ? QtWebContext::create(toImpl(contextRef)) : QtWebContext::defaultContext(); webPageProxy = context->createWebPage(&pageClient, pageGroup.get()); + webPageProxy->setUseFixedLayout(s_flickableViewportEnabled); #if ENABLE(FULLSCREEN_API) webPageProxy->fullScreenManager()->setWebView(q_ptr); #endif @@ -321,6 +320,13 @@ void QQuickWebViewPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pa webPageProxy->initializeWebPage(); } +void QQuickWebViewPrivate::onComponentComplete() +{ + Q_Q(QQuickWebView); + m_viewportHandler.reset(new QtViewportHandler(webPageProxy.get(), q, pageView.data())); + pageView->eventHandler()->setViewportHandler(m_viewportHandler.data()); +} + void QQuickWebViewPrivate::setTransparentBackground(bool enable) { webPageProxy->setDrawsTransparentBackground(enable); @@ -408,6 +414,27 @@ void QQuickWebViewPrivate::loadDidFail(const QtWebError& error) emit q->loadingChanged(&loadRequest); } +void QQuickWebViewPrivate::handleMouseEvent(QMouseEvent* event) +{ + switch (event->type()) { + case QEvent::MouseButtonPress: + case QEvent::MouseButtonDblClick: + // If a MouseButtonDblClick was received then we got a MouseButtonPress before + // handleMousePressEvent will take care of double clicks. + pageView->eventHandler()->handleMousePressEvent(event); + break; + case QEvent::MouseMove: + pageView->eventHandler()->handleMouseMoveEvent(event); + break; + case QEvent::MouseButtonRelease: + pageView->eventHandler()->handleMouseReleaseEvent(event); + break; + default: + ASSERT_NOT_REACHED(); + break; + } +} + void QQuickWebViewPrivate::setNeedsDisplay() { Q_Q(QQuickWebView); @@ -767,8 +794,11 @@ QQuickWebViewLegacyPrivate::QQuickWebViewLegacyPrivate(QQuickWebView* viewport) void QQuickWebViewLegacyPrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef) { + Q_Q(QQuickWebView); QQuickWebViewPrivate::initialize(contextRef, pageGroupRef); - enableMouseEvents(); + + q->setAcceptedMouseButtons(Qt::MouseButtonMask); + q->setAcceptHoverEvents(true); // Trigger setting of correct visibility flags after everything was allocated and initialized. _q_onVisibleChanged(); @@ -777,29 +807,15 @@ void QQuickWebViewLegacyPrivate::initialize(WKContextRef contextRef, WKPageGroup void QQuickWebViewLegacyPrivate::updateViewportSize() { Q_Q(QQuickWebView); - QSize viewportSize = q->boundingRect().size().toSize(); + QSizeF viewportSize = q->boundingRect().size(); if (viewportSize.isEmpty()) return; pageView->setContentsSize(viewportSize); // The fixed layout is handled by the FrameView and the drawing area doesn't behave differently // whether its fixed or not. We still need to tell the drawing area which part of it // has to be rendered on tiles, and in desktop mode it's all of it. - webPageProxy->drawingArea()->setSize(viewportSize, IntSize()); - webPageProxy->drawingArea()->setVisibleContentsRect(IntRect(IntPoint(), viewportSize), 1, FloatPoint()); -} - -void QQuickWebViewLegacyPrivate::enableMouseEvents() -{ - Q_Q(QQuickWebView); - q->setAcceptedMouseButtons(Qt::MouseButtonMask); - q->setAcceptHoverEvents(true); -} - -void QQuickWebViewLegacyPrivate::disableMouseEvents() -{ - Q_Q(QQuickWebView); - q->setAcceptedMouseButtons(Qt::NoButton); - q->setAcceptHoverEvents(false); + webPageProxy->drawingArea()->setSize(viewportSize.toSize(), IntSize()); + webPageProxy->drawingArea()->setVisibleContentsRect(FloatRect(FloatPoint(), viewportSize), 1, FloatPoint()); } qreal QQuickWebViewLegacyPrivate::zoomFactor() const @@ -815,12 +831,6 @@ void QQuickWebViewLegacyPrivate::setZoomFactor(qreal factor) QQuickWebViewFlickablePrivate::QQuickWebViewFlickablePrivate(QQuickWebView* viewport) : QQuickWebViewPrivate(viewport) { - // Disable mouse events on the flickable web view so we do not - // select text during pan gestures on platforms which send both - // touch and mouse events simultaneously. - // FIXME: Temporary workaround code which should be removed when - // bug http://codereview.qt-project.org/21896 is fixed. - viewport->setAcceptedMouseButtons(Qt::NoButton); viewport->setAcceptHoverEvents(false); } @@ -832,15 +842,11 @@ QQuickWebViewFlickablePrivate::~QQuickWebViewFlickablePrivate() void QQuickWebViewFlickablePrivate::initialize(WKContextRef contextRef, WKPageGroupRef pageGroupRef) { QQuickWebViewPrivate::initialize(contextRef, pageGroupRef); - webPageProxy->setUseFixedLayout(true); } void QQuickWebViewFlickablePrivate::onComponentComplete() { - Q_Q(QQuickWebView); - - m_viewportHandler.reset(new QtViewportHandler(webPageProxy.get(), q, pageView.data())); - pageView->eventHandler()->setViewportHandler(m_viewportHandler.data()); + QQuickWebViewPrivate::onComponentComplete(); // Trigger setting of correct visibility flags after everything was allocated and initialized. _q_onVisibleChanged(); @@ -872,6 +878,15 @@ void QQuickWebViewFlickablePrivate::didChangeContentsSize(const QSize& newSize) m_viewportHandler->pageContentsSizeChanged(newSize, q->boundingRect().size().toSize()); } +void QQuickWebViewFlickablePrivate::handleMouseEvent(QMouseEvent* event) +{ + if (!pageView->eventHandler()) + return; + + // FIXME: Update the axis locker for mouse events as well. + pageView->eventHandler()->handleInputEvent(event); +} + /*! \qmlsignal WebView::onNavigationRequested(WebNavigationRequest request) @@ -1657,36 +1672,25 @@ void QQuickWebView::platformInitialize() bool QQuickWebView::childMouseEventFilter(QQuickItem* item, QEvent* event) { - if (!isVisible() || !isEnabled() || !s_flickableViewportEnabled) - return QQuickFlickable::childMouseEventFilter(item, event); - - Q_D(QQuickWebView); - if (d->m_dialogActive) { - event->ignore(); + if (!isVisible() || !isEnabled()) return false; - } // This function is used by MultiPointTouchArea and PinchArea to filter // touch events, thus to hinder the canvas from sending synthesized // mouse events to the Flickable implementation we need to reimplement - // childMouseEventFilter and filter incoming touch events as well. + // childMouseEventFilter to ignore touch and mouse events. switch (event->type()) { case QEvent::MouseButtonPress: - mousePressEvent(static_cast<QMouseEvent*>(event)); - return event->isAccepted(); case QEvent::MouseMove: - mouseMoveEvent(static_cast<QMouseEvent*>(event)); - return event->isAccepted(); case QEvent::MouseButtonRelease: - mouseReleaseEvent(static_cast<QMouseEvent*>(event)); - return event->isAccepted(); case QEvent::TouchBegin: case QEvent::TouchUpdate: case QEvent::TouchEnd: - touchEvent(static_cast<QTouchEvent*>(event)); - return event->isAccepted(); + // Force all mouse and touch events through the default propagation path. + return false; default: + ASSERT(event->type() == QEvent::UngrabMouse); break; } @@ -1743,10 +1747,6 @@ void QQuickWebView::focusOutEvent(QFocusEvent* event) void QQuickWebView::touchEvent(QTouchEvent* event) { Q_D(QQuickWebView); - if (d->m_dialogActive) { - event->ignore(); - return; - } bool lockingDisabled = flickableDirection() != AutoFlickDirection || event->touchPoints().size() != 1 @@ -1766,29 +1766,26 @@ void QQuickWebView::mousePressEvent(QMouseEvent* event) { Q_D(QQuickWebView); forceActiveFocus(); - d->pageView->eventHandler()->handleMousePressEvent(event); + d->handleMouseEvent(event); } void QQuickWebView::mouseMoveEvent(QMouseEvent* event) { Q_D(QQuickWebView); - d->pageView->eventHandler()->handleMouseMoveEvent(event); + d->handleMouseEvent(event); } void QQuickWebView::mouseReleaseEvent(QMouseEvent* event) { Q_D(QQuickWebView); - d->pageView->eventHandler()->handleMouseReleaseEvent(event); + d->handleMouseEvent(event); } void QQuickWebView::mouseDoubleClickEvent(QMouseEvent* event) { Q_D(QQuickWebView); - forceActiveFocus(); - // If a MouseButtonDblClick was received then we got a MouseButtonPress before - // handleMousePressEvent will take care of double clicks. - d->pageView->eventHandler()->handleMousePressEvent(event); + d->handleMouseEvent(event); } void QQuickWebView::wheelEvent(QWheelEvent* event) |