#include "config.h"
#include "qquickwebpage_p.h"
#include "QtWebPageEventHandler.h"
#include "QtWebPageSGNode.h"
#include "TransformationMatrix.h"
#include "qquickwebpage_p_p.h"
#include "qquickwebview_p.h"
#include "qquickwebview_p_p.h"
#include "qwebkittest_p.h"
#include <QQuickWindow>
#include <WKPage.h>
#include <WebCore/CoordinatedGraphicsScene.h>
using namespace WebKit;
QQuickWebPage::QQuickWebPage(QQuickWebView* viewportItem)
: QQuickItem(viewportItem->contentItem())
, d(new QQuickWebPagePrivate(this, viewportItem))
{
setFlag(ItemHasContents);
setClip(true);
setTransformOrigin(TopLeft);
}
QQuickWebPage::~QQuickWebPage()
{
delete d;
}
QQuickWebPagePrivate::QQuickWebPagePrivate(QQuickWebPage* q, QQuickWebView* viewportItem)
: q(q)
, viewportItem(viewportItem)
, paintingIsInitialized(false)
, contentsScale(1)
{
}
void QQuickWebPagePrivate::paint(QPainter* painter)
{
if (WebCore::CoordinatedGraphicsScene* scene = QQuickWebViewPrivate::get(viewportItem)->coordinatedGraphicsScene())
scene->paintToGraphicsContext(painter);
}
QSGNode* QQuickWebPage::updatePaintNode(QSGNode* oldNode, UpdatePaintNodeData*)
{
QQuickWebViewPrivate* webViewPrivate = QQuickWebViewPrivate::get(d->viewportItem);
WebCore::CoordinatedGraphicsScene* scene = webViewPrivate->coordinatedGraphicsScene();
if (!scene)
return oldNode;
QtWebPageSGNode* node = static_cast<QtWebPageSGNode*>(oldNode);
const QWindow* window = this->window();
ASSERT(window);
WKPageRef pageRef = webViewPrivate->webPage.get();
if (window && WKPageGetBackingScaleFactor(pageRef) != window->devicePixelRatio()) {
WKPageSetCustomBackingScaleFactor(pageRef, window->devicePixelRatio());
emit d->viewportItem->experimental()->test()->devicePixelRatioChanged();
}
if (!node)
node = new QtWebPageSGNode;
node->setCoordinatedGraphicsScene(scene);
node->setScale(d->contentsScale);
node->setDevicePixelRatio(window->devicePixelRatio());
QColor backgroundColor = webViewPrivate->transparentBackground() ? Qt::transparent : Qt::white;
QRectF backgroundRect(QPointF(0, 0), d->contentsSize);
node->setBackground(backgroundRect, backgroundColor);
return node;
}
void QQuickWebPage::setContentsSize(const QSizeF& size)
{
if (size.isEmpty() || d->contentsSize == size)
return;
d->contentsSize = size;
d->updateSize();
emit d->viewportItem->experimental()->test()->contentsSizeChanged();
}
const QSizeF& QQuickWebPage::contentsSize() const
{
return d->contentsSize;
}
void QQuickWebPage::setContentsScale(qreal scale)
{
ASSERT(scale > 0);
d->contentsScale = scale;
d->updateSize();
emit d->viewportItem->experimental()->test()->contentsScaleChanged();
}
qreal QQuickWebPage::contentsScale() const
{
ASSERT(d->contentsScale > 0);
return d->contentsScale;
}
QTransform QQuickWebPage::transformFromItem() const
{
return transformToItem().inverted();
}
QTransform QQuickWebPage::transformToItem() const
{
qreal xPos = x();
qreal yPos = y();
if (d->viewportItem->experimental()->flickableViewportEnabled()) {
xPos += d->viewportItem->contentItem()->x();
yPos += d->viewportItem->contentItem()->y();
}
return QTransform(d->contentsScale, 0, 0, 0, d->contentsScale, 0, xPos, yPos, 1);
}
void QQuickWebPagePrivate::updateSize()
{
QSizeF scaledSize = contentsSize * contentsScale;
q->setSize(scaledSize);
if (viewportItem->experimental()->flickableViewportEnabled()) {
if (viewportItem->experimental()->useDefaultContentItemSize()) {
viewportItem->setContentWidth(scaledSize.width());
viewportItem->setContentHeight(scaledSize.height());
}
}
}
QQuickWebPagePrivate::~QQuickWebPagePrivate()
{
}
#include "moc_qquickwebpage_p.cpp"