summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/qt/qquickwebview.cpp123
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)