#include "config.h"
#include "qwebkittest_p.h"
#include "PageViewportControllerClientQt.h"
#include "qquickwebview_p_p.h"
#include <QMutableListIterator>
#include <QTouchEvent>
#include <QWheelEvent>
#include <qpa/qwindowsysteminterface.h>
using namespace WebKit;
QWebKitTest::QWebKitTest(QQuickWebViewPrivate* webViewPrivate, QObject* parent)
: QObject(parent)
, m_webViewPrivate(webViewPrivate)
{
}
QWebKitTest::~QWebKitTest()
{
}
static QTouchEvent::TouchPoint touchPoint(qreal x, qreal y)
{
QPointF localPos(x, y);
QTouchEvent::TouchPoint point;
point.setId(1);
point.setLastPos(localPos);
QRectF touchRect(0, 0, 40, 40);
touchRect.moveCenter(localPos);
point.setRect(touchRect);
point.setPressure(1);
return point;
}
bool QWebKitTest::sendTouchEvent(QQuickWebView* window, QEvent::Type type, const QList<QTouchEvent::TouchPoint>& points, ulong timestamp)
{
ASSERT(window);
static QTouchDevice* device = 0;
if (!device) {
device = new QTouchDevice;
device->setType(QTouchDevice::TouchScreen);
QWindowSystemInterface::registerTouchDevice(device);
}
Qt::TouchPointStates touchPointStates = 0;
foreach (const QTouchEvent::TouchPoint& touchPoint, points)
touchPointStates |= touchPoint.state();
QTouchEvent event(type, device, Qt::NoModifier, touchPointStates, points);
event.setTimestamp(timestamp);
event.setAccepted(false);
window->touchEvent(&event);
return event.isAccepted();
}
bool QWebKitTest::touchTap(QObject* item, qreal x, qreal y, int delay)
{
QQuickWebView* window = qobject_cast<QQuickWebView*>(item);
if (!window) {
qWarning("Touch event \"TouchBegin\" not accepted by receiving item");
return false;
}
Q_UNUSED(delay);
QList<QTouchEvent::TouchPoint> points;
points.append(touchPoint(x, y));
points[0].setState(Qt::TouchPointPressed);
sendTouchEvent(window, QEvent::TouchBegin, points, QDateTime::currentMSecsSinceEpoch());
points[0].setState(Qt::TouchPointReleased);
sendTouchEvent(window, QEvent::TouchEnd, points, QDateTime::currentMSecsSinceEpoch());
return true;
}
bool QWebKitTest::touchDoubleTap(QObject* item, qreal x, qreal y, int delay)
{
if (!touchTap(item, x, y, delay))
return false;
if (!touchTap(item, x, y, delay))
return false;
return true;
}
bool QWebKitTest::wheelEvent(QObject* item, qreal x, qreal y, int delta, Qt::Orientation orient)
{
QQuickWebView* window = qobject_cast<QQuickWebView*>(item);
if (!window) {
qWarning("Wheel event not accepted by receiving item");
return false;
}
QWheelEvent event(QPointF(x, y), delta, Qt::NoButton, Qt::NoModifier, orient);
event.setTimestamp(QDateTime::currentMSecsSinceEpoch());
event.setAccepted(false);
window->wheelEvent(&event);
return event.isAccepted();
}
QSize QWebKitTest::contentsSize() const
{
return QSize(m_webViewPrivate->pageView->contentsSize().toSize());
}
static inline QJsonObject toJsonObject(const QSizeF& sizeF)
{
QJsonObject result;
result.insert(QLatin1String("width"), sizeF.width());
result.insert(QLatin1String("height"), sizeF.height());
return result;
}
QJsonObject QWebKitTest::viewport() const
{
QJsonObject viewportData;
if (const PageViewportController* const viewportHandler = m_webViewPrivate->viewportController()) {
viewportData.insert(QLatin1String("layoutSize"), toJsonObject(viewportHandler->contentsLayoutSize()));
viewportData.insert(QLatin1String("isScalable"), viewportHandler->allowsUserScaling());
viewportData.insert(QLatin1String("minimumScale"), viewportHandler->minimumScale());
viewportData.insert(QLatin1String("maximumScale"), viewportHandler->maximumScale());
} else {
viewportData.insert(QLatin1String("initialScale"), 1.0);
viewportData.insert(QLatin1String("layoutSize"), toJsonObject(QSizeF()));
viewportData.insert(QLatin1String("isScalable"), false);
viewportData.insert(QLatin1String("minimumScale"), 1.0);
viewportData.insert(QLatin1String("maximumScale"), 1.0);
}
return viewportData;
}
QVariant QWebKitTest::devicePixelRatio() const
{
if (const PageViewportController* const viewport = m_webViewPrivate->viewportController())
return viewport->deviceScaleFactor();
return 1.0;
}
QVariant QWebKitTest::contentsScale() const
{
if (const PageViewportController* const viewport = m_webViewPrivate->viewportController())
return viewport->currentScale();
return 1.0;
}