10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Copyright (C) 2009 Jakub Wieczorek <faw217@gmail.com>
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
40bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is free software; you can redistribute it and/or
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    modify it under the terms of the GNU Library General Public
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    License as published by the Free Software Foundation; either
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    version 2 of the License, or (at your option) any later version.
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is distributed in the hope that it will be useful,
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    but WITHOUT ANY WARRANTY; without even the implied warranty of
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Library General Public License for more details.
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    You should have received a copy of the GNU Library General Public License
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    along with this library; see the file COPYING.LIB.  If not, write to
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Boston, MA 02110-1301, USA.
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
20643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "../util.h"
21231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <QtTest/QtTest>
22545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <QGraphicsSceneMouseEvent>
23cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <QGraphicsView>
242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <QStyleOptionGraphicsItem>
25231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <qgraphicswebview.h>
26cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <qwebpage.h>
27cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <qwebframe.h>
28cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
292bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(ENABLE_WEBGL) && ENABLE_WEBGL
302bde8e466a4451c7319e3a072d118917957d6554Steve Block#include <QGLWidget>
312bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
322bde8e466a4451c7319e3a072d118917957d6554Steve Block
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockclass tst_QGraphicsWebView : public QObject
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
35231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Q_OBJECT
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
37231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprivate slots:
38231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void qgraphicswebview();
39cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void crashOnViewlessWebPages();
4021939df44de1705786c545cd1bf519d47250322dBen Murdoch    void microFocusCoordinates();
41545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void focusInputTypes();
42ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void crashOnSetScaleBeforeSetUrl();
43e14391e94c850b8bd03680c23b38978db68687a8John Reck    void widgetsRenderingThroughCache();
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette_data();
4581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette();
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    void renderHints();
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(ENABLE_TILED_BACKING_STORE) && ENABLE_TILED_BACKING_STORE
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void bug56929();
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
502bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(ENABLE_WEBGL) && ENABLE_WEBGL
512bde8e466a4451c7319e3a072d118917957d6554Steve Block    void webglSoftwareFallbackVerticalOrientation();
522bde8e466a4451c7319e3a072d118917957d6554Steve Block    void webglSoftwareFallbackHorizontalOrientation();
532bde8e466a4451c7319e3a072d118917957d6554Steve Block
542bde8e466a4451c7319e3a072d118917957d6554Steve Blockprivate:
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    void compareCanvasToImage(const QUrl&, const QImage&);
562bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid tst_QGraphicsWebView::qgraphicswebview()
60231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QGraphicsWebView item;
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.url();
63231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.title();
64231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.icon();
65231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.zoomFactor();
66231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.history();
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.settings();
68231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.page();
69231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setPage(0);
70231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.page();
71231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setUrl(QUrl());
72231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setZoomFactor(0);
73231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.load(QUrl());
74231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setHtml(QString());
75231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setContent(QByteArray());
76643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    item.isModified();
77231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
78231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
79cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass WebPage : public QWebPage
80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
81cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Q_OBJECT
82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
83cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockpublic:
84cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebPage(QObject* parent = 0): QWebPage(parent)
85cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    {
86cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
87cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
88cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsWebView* webView;
89cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
90cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockprivate slots:
91cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Force a webview deletion during the load.
92cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // It should not cause WebPage to crash due to
93cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // it accessing invalid pageClient pointer.
94cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void aborting()
95cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    {
96cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        delete webView;
97cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
98cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block};
99cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochclass GraphicsWebView : public QGraphicsWebView
101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Q_OBJECT
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochpublic:
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    GraphicsWebView(QGraphicsItem* parent = 0): QGraphicsWebView(parent)
106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
107545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
108545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
109545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void fireMouseClick(QPointF point) {
110545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsSceneMouseEvent presEv(QEvent::GraphicsSceneMousePress);
111545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setPos(point);
112545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setButton(Qt::LeftButton);
113545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setButtons(Qt::LeftButton);
114545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsSceneMouseEvent relEv(QEvent::GraphicsSceneMouseRelease);
115545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setPos(point);
116545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setButton(Qt::LeftButton);
117545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setButtons(Qt::LeftButton);
118545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsWebView::sceneEvent(&presEv);
119545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsWebView::sceneEvent(&relEv);
120545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
121545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch};
122545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
123cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid tst_QGraphicsWebView::crashOnViewlessWebPages()
124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
125cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsScene scene;
126cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsView view(&scene);
127cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
128cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsWebView* webView = new QGraphicsWebView;
129cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebPage* page = new WebPage;
130cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    webView->setPage(page);
131cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    page->webView = webView;
132cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    scene.addItem(webView);
133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
134cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
135cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.resize(600, 480);
136cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    webView->resize(view.geometry().size());
1376c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
138643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QCoreApplication::processEvents();
139cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.show();
140cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1416c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    // Resizing the page will resize and layout the empty "about:blank"
1426c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    // page, so we first connect the signal afterward.
1436c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    connect(page->mainFrame(), SIGNAL(initialLayoutCompleted()), page, SLOT(aborting()));
1446c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
145e14391e94c850b8bd03680c23b38978db68687a8John Reck    page->mainFrame()->load(QUrl("data:text/html,"
146e14391e94c850b8bd03680c23b38978db68687a8John Reck                                 "<frameset cols=\"25%,75%\">"
147e14391e94c850b8bd03680c23b38978db68687a8John Reck                                     "<frame src=\"data:text/html,foo \">"
148e14391e94c850b8bd03680c23b38978db68687a8John Reck                                     "<frame src=\"data:text/html,bar\">"
149e14391e94c850b8bd03680c23b38978db68687a8John Reck                                 "</frameset>"));
150cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
151643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QVERIFY(waitForSignal(page, SIGNAL(loadFinished(bool))));
1526c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    delete page;
153cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
154cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
155ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid tst_QGraphicsWebView::crashOnSetScaleBeforeSetUrl()
156ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
157ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    QGraphicsWebView* webView = new QGraphicsWebView;
158ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    webView->setScale(2.0);
159ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    delete webView;
160ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
161ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
162e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid tst_QGraphicsWebView::widgetsRenderingThroughCache()
163e14391e94c850b8bd03680c23b38978db68687a8John Reck{
164e14391e94c850b8bd03680c23b38978db68687a8John Reck    // Widgets should be rendered the same way with and without
165e14391e94c850b8bd03680c23b38978db68687a8John Reck    // intermediate cache (tiling for example).
166e14391e94c850b8bd03680c23b38978db68687a8John Reck    // See bug https://bugs.webkit.org/show_bug.cgi?id=47767 where
167e14391e94c850b8bd03680c23b38978db68687a8John Reck    // widget are rendered as disabled when caching is using.
168e14391e94c850b8bd03680c23b38978db68687a8John Reck
169e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsWebView* webView = new QGraphicsWebView;
170e14391e94c850b8bd03680c23b38978db68687a8John Reck    webView->setHtml(QLatin1String("<body style=\"background-color: white\"><input type=range></input><input type=checkbox></input><input type=radio></input><input type=file></input></body>"));
171e14391e94c850b8bd03680c23b38978db68687a8John Reck
172e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsView view;
173e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.show();
174e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsScene* scene = new QGraphicsScene(&view);
175e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.setScene(scene);
176e14391e94c850b8bd03680c23b38978db68687a8John Reck    scene->addItem(webView);
177e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.setGeometry(QRect(0, 0, 500, 500));
178e14391e94c850b8bd03680c23b38978db68687a8John Reck    QWidget *const widget = &view;
179e14391e94c850b8bd03680c23b38978db68687a8John Reck    QTest::qWaitForWindowShown(widget);
180e14391e94c850b8bd03680c23b38978db68687a8John Reck
181e14391e94c850b8bd03680c23b38978db68687a8John Reck    // 1. Reference without tiling.
182e14391e94c850b8bd03680c23b38978db68687a8John Reck    webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, false);
183e14391e94c850b8bd03680c23b38978db68687a8John Reck    QPixmap referencePixmap(view.size());
184e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&referencePixmap);
185e14391e94c850b8bd03680c23b38978db68687a8John Reck
186e14391e94c850b8bd03680c23b38978db68687a8John Reck    // 2. With tiling.
187e14391e94c850b8bd03680c23b38978db68687a8John Reck    webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, true);
188e14391e94c850b8bd03680c23b38978db68687a8John Reck    QPixmap viewWithTiling(view.size());
189e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&viewWithTiling);
190e14391e94c850b8bd03680c23b38978db68687a8John Reck    QApplication::processEvents();
191e14391e94c850b8bd03680c23b38978db68687a8John Reck    viewWithTiling.fill();
192e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&viewWithTiling);
193e14391e94c850b8bd03680c23b38978db68687a8John Reck
194e14391e94c850b8bd03680c23b38978db68687a8John Reck    QCOMPARE(referencePixmap.toImage(), viewWithTiling.toImage());
195e14391e94c850b8bd03680c23b38978db68687a8John Reck}
196e14391e94c850b8bd03680c23b38978db68687a8John Reck
1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(ENABLE_TILED_BACKING_STORE) && ENABLE_TILED_BACKING_STORE
1982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid tst_QGraphicsWebView::bug56929()
1992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // When rendering from tiles sychronous layout should not be triggered
2012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // and scrollbars should be in sync with the size of the document in the displayed state.
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QGraphicsWebView* webView = new QGraphicsWebView();
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->setGeometry(QRectF(0.0, 0.0, 100.0, 100.0));
2052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QGraphicsView view(new QGraphicsScene());
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    view.scene()->setParent(&view);
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    view.scene()->addItem(webView);
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, true);
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QUrl url("qrc:///resources/56929.html");
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->load(url);
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(waitForSignal(webView, SIGNAL(loadFinished(bool))));
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QStyleOptionGraphicsItem option;
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    option.exposedRect = webView->geometry();
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QImage img(option.exposedRect.width(), option.exposedRect.height(), QImage::Format_ARGB32_Premultiplied);
2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QPainter painter(&img);
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // This will not paint anything as the tiles are not ready, yet.
2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->paint(&painter, &option);
2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QApplication::processEvents();
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->paint(&painter, &option);
2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QCOMPARE(img.pixel(option.exposedRect.width() - 2, option.exposedRect.height() / 2), qRgba(255, 255, 255, 255));
2212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    painter.fillRect(option.exposedRect, Qt::black);
2222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QCOMPARE(img.pixel(option.exposedRect.width() - 2, option.exposedRect.height() / 2), qRgba(0, 0, 0, 255));
2232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->page()->mainFrame()->evaluateJavaScript(QString("resizeDiv();"));
2242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    webView->paint(&painter, &option);
2252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QCOMPARE(img.pixel(option.exposedRect.width() - 2, option.exposedRect.height() / 2), qRgba(255, 255, 255, 255));
2262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
22921939df44de1705786c545cd1bf519d47250322dBen Murdochvoid tst_QGraphicsWebView::microFocusCoordinates()
23021939df44de1705786c545cd1bf519d47250322dBen Murdoch{
23121939df44de1705786c545cd1bf519d47250322dBen Murdoch    QWebPage* page = new QWebPage;
23221939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsWebView* webView = new QGraphicsWebView;
23321939df44de1705786c545cd1bf519d47250322dBen Murdoch    webView->setPage( page );
23421939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsView* view = new QGraphicsView;
23521939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsScene* scene = new QGraphicsScene(view);
23621939df44de1705786c545cd1bf519d47250322dBen Murdoch    view->setScene(scene);
23721939df44de1705786c545cd1bf519d47250322dBen Murdoch    scene->addItem(webView);
23821939df44de1705786c545cd1bf519d47250322dBen Murdoch    view->setGeometry(QRect(0,0,500,500));
23921939df44de1705786c545cd1bf519d47250322dBen Murdoch
24021939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setHtml("<html><body>" \
24121939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='text' id='input1' style='font--family: serif' value='' maxlength='20'/><br>" \
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block        "<canvas id='canvas1' width='500' height='500'></canvas>" \
24321939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='password'/><br>" \
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block        "<canvas id='canvas2' width='500' height='500'></canvas>" \
24521939df44de1705786c545cd1bf519d47250322dBen Murdoch        "</body></html>");
24621939df44de1705786c545cd1bf519d47250322dBen Murdoch
24721939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setFocus();
24821939df44de1705786c545cd1bf519d47250322dBen Murdoch
24921939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant initialMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
25021939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(initialMicroFocus.isValid());
25121939df44de1705786c545cd1bf519d47250322dBen Murdoch
25221939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->scroll(0,300);
25321939df44de1705786c545cd1bf519d47250322dBen Murdoch
25421939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant currentMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
25521939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(currentMicroFocus.isValid());
25621939df44de1705786c545cd1bf519d47250322dBen Murdoch
25721939df44de1705786c545cd1bf519d47250322dBen Murdoch    QCOMPARE(initialMicroFocus.toRect().translated(QPoint(0,-300)), currentMicroFocus.toRect());
25821939df44de1705786c545cd1bf519d47250322dBen Murdoch
25921939df44de1705786c545cd1bf519d47250322dBen Murdoch    delete view;
26021939df44de1705786c545cd1bf519d47250322dBen Murdoch}
26121939df44de1705786c545cd1bf519d47250322dBen Murdoch
262545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid tst_QGraphicsWebView::focusInputTypes()
263545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
264545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QWebPage* page = new QWebPage;
265545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    GraphicsWebView* webView = new GraphicsWebView;
266545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->setPage( page );
267545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QGraphicsView* view = new QGraphicsView;
268545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QGraphicsScene* scene = new QGraphicsScene(view);
269545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    view->setScene(scene);
270545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    scene->addItem(webView);
271545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    view->setGeometry(QRect(0,0,500,500));
272545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QCoreApplication::processEvents();
273545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QUrl url("qrc:///resources/input_types.html");
274545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    page->mainFrame()->load(url);
275545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    page->mainFrame()->setFocus();
276545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
277545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(waitForSignal(page, SIGNAL(loadFinished(bool))));
278545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
279545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'text' type
280545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 10.0));
281545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
282545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhNoAutoUppercase);
283545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhNoPredictiveText);
284545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#else
285545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() == Qt::ImhNone);
286545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
287545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
288545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'password' field
289545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 60.0));
290545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhHiddenText);
291545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
292545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'tel' field
293545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 110.0));
294545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhDialableCharactersOnly);
295545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
296545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'number' field
297545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 160.0));
298545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhDigitsOnly);
299545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
300545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'email' field
301545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 210.0));
302545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhEmailCharactersOnly);
303545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
304545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'url' field
305545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 260.0));
306545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhUrlCharactersOnly);
307545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
308545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    delete webView;
309545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    delete view;
310545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
311545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QGraphicsWebView::setPalette_data()
31381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
31481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("active");
31581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("background");
31681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeBG") << true << true;
31781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeFG") << true << false;
31881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveBG") << false << true;
31981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveFG") << false << false;
32081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
32181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Render a QGraphicsWebView to a QImage twice, each time with a different palette set,
32381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// verify that images rendered are not the same, confirming WebCore usage of
32481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// custom palette on selections.
32581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QGraphicsWebView::setPalette()
32681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
32781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QString html = "<html><head></head>"
32881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "<body>"
32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "Some text here"
33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</body>"
33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</html>";
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, active);
33481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, background);
33581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWidget* activeView = 0;
33781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Use controlView to manage active/inactive state of test views by raising
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // or lowering their position in the window stack.
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene controlScene;
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView controlView(&controlScene);
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView controlWebView;
34381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlScene.addItem(&controlWebView);
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlWebView.setHtml(html);
34581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlWebView.setGeometry(QRectF(0, 0, 200, 200));
34681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene scene1;
34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView view1(&scene1);
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.setSceneRect(0, 0, 300, 300);
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView webView1;
35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setResizesToContents(true);
35281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    scene1.addItem(&webView1);
35381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setFocus();
35481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette1;
35681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush1(Qt::red);
35781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush1.setStyle(Qt::SolidPattern);
35881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
35981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an active QGraphicsWebView.
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::Highlight, brush1);
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an active QGraphicsWebView.
36381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::HighlightedText, brush1);
36481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
36581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an inactive QGraphicsWebView.
36681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::Highlight, brush1);
36781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
36881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an inactive QGraphicsWebView.
36981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush1);
37081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
37181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setHtml(html);
37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.resize(webView1.page()->viewportSize());
37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setPalette(palette1);
37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.show();
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(webView1.palette() == palette1);
37881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(webView1.page()->palette() == palette1);
37981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view1);
38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
38381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
38481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
38581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
38781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
38881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view1.activateWindow();
38981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view1;
39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
391545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
39381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.page()->triggerAction(QWebPage::SelectAll);
39581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img1(webView1.page()->viewportSize(), QImage::Format_ARGB32);
39781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter1(&img1);
39881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.page()->currentFrame()->render(&painter1);
39981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter1.end();
40081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.close();
40181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
40281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene scene2;
40481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView view2(&scene2);
40581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.setSceneRect(0, 0, 300, 300);
40681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView webView2;
40781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setResizesToContents(true);
40881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    scene2.addItem(&webView2);
40981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setFocus();
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette2;
41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush2(Qt::blue);
41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush2.setStyle(Qt::SolidPattern);
41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an active QGraphicsWebView.
41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::Highlight, brush2);
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an active QGraphicsWebView.
41981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::HighlightedText, brush2);
42081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an inactive QGraphicsWebView.
42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::Highlight, brush2);
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an inactive QGraphicsWebView.
42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush2);
42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setHtml(html);
42981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.resize(webView2.page()->viewportSize());
43081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setPalette(palette2);
43181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.show();
43281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
43381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view2);
43481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
43581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
43681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
43781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
43881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
43981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
44081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
44181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view2.activateWindow();
44281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view2;
44381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
44481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.page()->triggerAction(QWebPage::SelectAll);
44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img2(webView2.page()->viewportSize(), QImage::Format_ARGB32);
45081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter2(&img2);
45181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.page()->currentFrame()->render(&painter2);
45281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter2.end();
45381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
45481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.close();
45581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
45681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
45781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(img1 != img2);
45881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
45921939df44de1705786c545cd1bf519d47250322dBen Murdoch
4602bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_QGraphicsWebView::renderHints()
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsWebView webView;
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block
4642bde8e466a4451c7319e3a072d118917957d6554Steve Block    // default is only text antialiasing + smooth pixmap transform
4652bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
4672bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
4682bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
4692bde8e466a4451c7319e3a072d118917957d6554Steve Block
4702bde8e466a4451c7319e3a072d118917957d6554Steve Block    webView.setRenderHint(QPainter::Antialiasing, true);
4712bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::Antialiasing);
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
4732bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
4742bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
4752bde8e466a4451c7319e3a072d118917957d6554Steve Block
4762bde8e466a4451c7319e3a072d118917957d6554Steve Block    webView.setRenderHint(QPainter::Antialiasing, false);
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block    webView.setRenderHint(QPainter::SmoothPixmapTransform, true);
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block    webView.setRenderHint(QPainter::SmoothPixmapTransform, false);
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::SmoothPixmapTransform));
4912bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block}
4932bde8e466a4451c7319e3a072d118917957d6554Steve Block
4942bde8e466a4451c7319e3a072d118917957d6554Steve Blockclass GraphicsView : public QGraphicsView {
4952bde8e466a4451c7319e3a072d118917957d6554Steve Blockpublic:
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block    GraphicsView();
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsWebView* m_webView;
4982bde8e466a4451c7319e3a072d118917957d6554Steve Block};
4992bde8e466a4451c7319e3a072d118917957d6554Steve Block
5002bde8e466a4451c7319e3a072d118917957d6554Steve Block#if defined(ENABLE_WEBGL) && ENABLE_WEBGL
5012bde8e466a4451c7319e3a072d118917957d6554Steve Blockbool compareImagesFuzzyPixelCount(const QImage& image1, const QImage& image2, qreal tolerance = 0.05)
5022bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5032bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (image1.size() != image2.size())
5042bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
5052bde8e466a4451c7319e3a072d118917957d6554Steve Block
5062bde8e466a4451c7319e3a072d118917957d6554Steve Block    unsigned diffPixelCount = 0;
5072bde8e466a4451c7319e3a072d118917957d6554Steve Block    for (int row = 0; row < image1.size().width(); ++row) {
5082bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (int column = 0; column < image1.size().height(); ++column)
5092bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (image1.pixel(row, column) != image2.pixel(row, column))
5102bde8e466a4451c7319e3a072d118917957d6554Steve Block                ++diffPixelCount;
5112bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5122bde8e466a4451c7319e3a072d118917957d6554Steve Block
5132bde8e466a4451c7319e3a072d118917957d6554Steve Block    if (diffPixelCount > (image1.size().width() * image1.size().height()) * tolerance)
5142bde8e466a4451c7319e3a072d118917957d6554Steve Block        return false;
5152bde8e466a4451c7319e3a072d118917957d6554Steve Block
5162bde8e466a4451c7319e3a072d118917957d6554Steve Block    return true;
5172bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5182bde8e466a4451c7319e3a072d118917957d6554Steve Block
5192bde8e466a4451c7319e3a072d118917957d6554Steve BlockGraphicsView::GraphicsView()
5202bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5212bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsScene* const scene = new QGraphicsScene(this);
5222bde8e466a4451c7319e3a072d118917957d6554Steve Block    setScene(scene);
5232bde8e466a4451c7319e3a072d118917957d6554Steve Block
5242bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView = new QGraphicsWebView;
5252bde8e466a4451c7319e3a072d118917957d6554Steve Block    scene->addItem(m_webView);
5262bde8e466a4451c7319e3a072d118917957d6554Steve Block
5272bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView->page()->settings()->setAttribute(QWebSettings::WebGLEnabled, true);
5282bde8e466a4451c7319e3a072d118917957d6554Steve Block    m_webView->setResizesToContents(true);
5292bde8e466a4451c7319e3a072d118917957d6554Steve Block
5302bde8e466a4451c7319e3a072d118917957d6554Steve Block    setFrameShape(QFrame::NoFrame);
5312bde8e466a4451c7319e3a072d118917957d6554Steve Block    setViewport(new QGLWidget);
5322bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5332bde8e466a4451c7319e3a072d118917957d6554Steve Block
5342bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_QGraphicsWebView::webglSoftwareFallbackVerticalOrientation()
5352bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5362bde8e466a4451c7319e3a072d118917957d6554Steve Block    QSize canvasSize(100, 100);
5372bde8e466a4451c7319e3a072d118917957d6554Steve Block    QImage reference(canvasSize, QImage::Format_ARGB32);
5382bde8e466a4451c7319e3a072d118917957d6554Steve Block    reference.fill(0xFF00FF00);
5392bde8e466a4451c7319e3a072d118917957d6554Steve Block    { // Reference.
5402bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPainter painter(&reference);
5412bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPolygonF triangleUp;
5422bde8e466a4451c7319e3a072d118917957d6554Steve Block        triangleUp << QPointF(0, canvasSize.height())
5432bde8e466a4451c7319e3a072d118917957d6554Steve Block                   << QPointF(canvasSize.width(), canvasSize.height())
5442bde8e466a4451c7319e3a072d118917957d6554Steve Block                   << QPointF(canvasSize.width() / 2.0, canvasSize.height() / 2.0);
5452bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.setPen(Qt::NoPen);
5462bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.setBrush(Qt::red);
5472bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.drawPolygon(triangleUp);
5482bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5492bde8e466a4451c7319e3a072d118917957d6554Steve Block
5502bde8e466a4451c7319e3a072d118917957d6554Steve Block    compareCanvasToImage(QUrl(QLatin1String("qrc:///resources/pointing_up.html")), reference);
5512bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5522bde8e466a4451c7319e3a072d118917957d6554Steve Block
5532bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_QGraphicsWebView::webglSoftwareFallbackHorizontalOrientation()
5542bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5552bde8e466a4451c7319e3a072d118917957d6554Steve Block    QSize canvasSize(100, 100);
5562bde8e466a4451c7319e3a072d118917957d6554Steve Block    QImage reference(canvasSize, QImage::Format_ARGB32);
5572bde8e466a4451c7319e3a072d118917957d6554Steve Block    reference.fill(0xFF00FF00);
5582bde8e466a4451c7319e3a072d118917957d6554Steve Block    { // Reference.
5592bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPainter painter(&reference);
5602bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPolygonF triangleUp;
5612bde8e466a4451c7319e3a072d118917957d6554Steve Block        triangleUp << QPointF(0, 0)
5622bde8e466a4451c7319e3a072d118917957d6554Steve Block                   << QPointF(0, canvasSize.height())
5632bde8e466a4451c7319e3a072d118917957d6554Steve Block                   << QPointF(canvasSize.width() / 2.0, canvasSize.height() / 2.0);
5642bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.setPen(Qt::NoPen);
5652bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.setBrush(Qt::red);
5662bde8e466a4451c7319e3a072d118917957d6554Steve Block        painter.drawPolygon(triangleUp);
5672bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5682bde8e466a4451c7319e3a072d118917957d6554Steve Block
5692bde8e466a4451c7319e3a072d118917957d6554Steve Block    compareCanvasToImage(QUrl(QLatin1String("qrc:///resources/pointing_right.html")), reference);
5702bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5712bde8e466a4451c7319e3a072d118917957d6554Steve Block
5722bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_QGraphicsWebView::compareCanvasToImage(const QUrl& url, const QImage& reference)
5732bde8e466a4451c7319e3a072d118917957d6554Steve Block{
5742bde8e466a4451c7319e3a072d118917957d6554Steve Block    GraphicsView view;
5752bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.show();
5762bde8e466a4451c7319e3a072d118917957d6554Steve Block    QTest::qWaitForWindowShown(&view);
5772bde8e466a4451c7319e3a072d118917957d6554Steve Block
5782bde8e466a4451c7319e3a072d118917957d6554Steve Block    QGraphicsWebView* const graphicsWebView = view.m_webView;
5792bde8e466a4451c7319e3a072d118917957d6554Steve Block    graphicsWebView->load(url);
5802bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(waitForSignal(graphicsWebView, SIGNAL(loadFinished(bool))));
5812bde8e466a4451c7319e3a072d118917957d6554Steve Block    { // Force a render, to create the accelerated compositing tree.
5822bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPixmap pixmap(view.size());
5832bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPainter painter(&pixmap);
5842bde8e466a4451c7319e3a072d118917957d6554Steve Block        view.render(&painter);
5852bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5862bde8e466a4451c7319e3a072d118917957d6554Steve Block    QApplication::syncX();
5872bde8e466a4451c7319e3a072d118917957d6554Steve Block
5882bde8e466a4451c7319e3a072d118917957d6554Steve Block    const QSize imageSize = reference.size();
5892bde8e466a4451c7319e3a072d118917957d6554Steve Block
5902bde8e466a4451c7319e3a072d118917957d6554Steve Block    QImage target(imageSize, QImage::Format_ARGB32);
5912bde8e466a4451c7319e3a072d118917957d6554Steve Block    { // Web page content.
5922bde8e466a4451c7319e3a072d118917957d6554Steve Block        QPainter painter(&target);
5932bde8e466a4451c7319e3a072d118917957d6554Steve Block        QRectF renderRect(0, 0, imageSize.width(), imageSize.height());
5942bde8e466a4451c7319e3a072d118917957d6554Steve Block        view.scene()->render(&painter, renderRect, renderRect);
5952bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
5962bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(compareImagesFuzzyPixelCount(target, reference, 0.01));
5972bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5982bde8e466a4451c7319e3a072d118917957d6554Steve Block#endif
5992bde8e466a4451c7319e3a072d118917957d6554Steve Block
600231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockQTEST_MAIN(tst_QGraphicsWebView)
601231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
602231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "tst_qgraphicswebview.moc"
603