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