tst_qgraphicswebview.cpp revision 81bc750723a18f21cd17d1b173cd2a4dda9cea6e
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>
24231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include <qgraphicswebview.h>
25cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <qwebpage.h>
26cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <qwebframe.h>
27cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
28231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockclass tst_QGraphicsWebView : public QObject
29231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
30231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    Q_OBJECT
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockprivate slots:
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    void qgraphicswebview();
34cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void crashOnViewlessWebPages();
3521939df44de1705786c545cd1bf519d47250322dBen Murdoch    void microFocusCoordinates();
36545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void focusInputTypes();
37ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    void crashOnSetScaleBeforeSetUrl();
38e14391e94c850b8bd03680c23b38978db68687a8John Reck    void widgetsRenderingThroughCache();
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette_data();
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette();
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
43231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid tst_QGraphicsWebView::qgraphicswebview()
44231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
45231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    QGraphicsWebView item;
46231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.url();
47231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.title();
48231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.icon();
49231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.zoomFactor();
50231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.history();
51231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.settings();
52231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.page();
53231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setPage(0);
54231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.page();
55231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setUrl(QUrl());
56231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setZoomFactor(0);
57231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.load(QUrl());
58231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setHtml(QString());
59231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    item.setContent(QByteArray());
60643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    item.isModified();
61231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
62231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
63cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockclass WebPage : public QWebPage
64cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
65cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Q_OBJECT
66cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
67cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockpublic:
68cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebPage(QObject* parent = 0): QWebPage(parent)
69cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    {
70cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
71cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
72cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsWebView* webView;
73cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
74cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockprivate slots:
75cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // Force a webview deletion during the load.
76cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // It should not cause WebPage to crash due to
77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    // it accessing invalid pageClient pointer.
78cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void aborting()
79cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    {
80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        delete webView;
81cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block};
83cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
84545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochclass GraphicsWebView : public QGraphicsWebView
85545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
86545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    Q_OBJECT
87545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
88545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochpublic:
89545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    GraphicsWebView(QGraphicsItem* parent = 0): QGraphicsWebView(parent)
90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    {
91545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
92545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
93545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void fireMouseClick(QPointF point) {
94545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsSceneMouseEvent presEv(QEvent::GraphicsSceneMousePress);
95545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setPos(point);
96545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setButton(Qt::LeftButton);
97545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        presEv.setButtons(Qt::LeftButton);
98545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsSceneMouseEvent relEv(QEvent::GraphicsSceneMouseRelease);
99545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setPos(point);
100545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setButton(Qt::LeftButton);
101545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        relEv.setButtons(Qt::LeftButton);
102545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsWebView::sceneEvent(&presEv);
103545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        QGraphicsWebView::sceneEvent(&relEv);
104545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    }
105545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch};
106545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
107cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid tst_QGraphicsWebView::crashOnViewlessWebPages()
108cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
109cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsScene scene;
110cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsView view(&scene);
111cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
112cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QGraphicsWebView* webView = new QGraphicsWebView;
113cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    WebPage* page = new WebPage;
114cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    webView->setPage(page);
115cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    page->webView = webView;
116cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    scene.addItem(webView);
117cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
118cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
119cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.resize(600, 480);
120cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    webView->resize(view.geometry().size());
1216c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
122643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QCoreApplication::processEvents();
123cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view.show();
124cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
1256c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    // Resizing the page will resize and layout the empty "about:blank"
1266c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    // page, so we first connect the signal afterward.
1276c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    connect(page->mainFrame(), SIGNAL(initialLayoutCompleted()), page, SLOT(aborting()));
1286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
129e14391e94c850b8bd03680c23b38978db68687a8John Reck    page->mainFrame()->load(QUrl("data:text/html,"
130e14391e94c850b8bd03680c23b38978db68687a8John Reck                                 "<frameset cols=\"25%,75%\">"
131e14391e94c850b8bd03680c23b38978db68687a8John Reck                                     "<frame src=\"data:text/html,foo \">"
132e14391e94c850b8bd03680c23b38978db68687a8John Reck                                     "<frame src=\"data:text/html,bar\">"
133e14391e94c850b8bd03680c23b38978db68687a8John Reck                                 "</frameset>"));
134cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
135643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QVERIFY(waitForSignal(page, SIGNAL(loadFinished(bool))));
1366c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    delete page;
137cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
138cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
139ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Blockvoid tst_QGraphicsWebView::crashOnSetScaleBeforeSetUrl()
140ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block{
141ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    QGraphicsWebView* webView = new QGraphicsWebView;
142ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    webView->setScale(2.0);
143ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block    delete webView;
144ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block}
145ca9cb53ed1119a3fd98fafa0972ffeb56dee1c24Steve Block
146e14391e94c850b8bd03680c23b38978db68687a8John Reckvoid tst_QGraphicsWebView::widgetsRenderingThroughCache()
147e14391e94c850b8bd03680c23b38978db68687a8John Reck{
148e14391e94c850b8bd03680c23b38978db68687a8John Reck    // Widgets should be rendered the same way with and without
149e14391e94c850b8bd03680c23b38978db68687a8John Reck    // intermediate cache (tiling for example).
150e14391e94c850b8bd03680c23b38978db68687a8John Reck    // See bug https://bugs.webkit.org/show_bug.cgi?id=47767 where
151e14391e94c850b8bd03680c23b38978db68687a8John Reck    // widget are rendered as disabled when caching is using.
152e14391e94c850b8bd03680c23b38978db68687a8John Reck
153e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsWebView* webView = new QGraphicsWebView;
154e14391e94c850b8bd03680c23b38978db68687a8John 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>"));
155e14391e94c850b8bd03680c23b38978db68687a8John Reck
156e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsView view;
157e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.show();
158e14391e94c850b8bd03680c23b38978db68687a8John Reck    QGraphicsScene* scene = new QGraphicsScene(&view);
159e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.setScene(scene);
160e14391e94c850b8bd03680c23b38978db68687a8John Reck    scene->addItem(webView);
161e14391e94c850b8bd03680c23b38978db68687a8John Reck    view.setGeometry(QRect(0, 0, 500, 500));
162e14391e94c850b8bd03680c23b38978db68687a8John Reck    QWidget *const widget = &view;
163e14391e94c850b8bd03680c23b38978db68687a8John Reck    QTest::qWaitForWindowShown(widget);
164e14391e94c850b8bd03680c23b38978db68687a8John Reck
165e14391e94c850b8bd03680c23b38978db68687a8John Reck    // 1. Reference without tiling.
166e14391e94c850b8bd03680c23b38978db68687a8John Reck    webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, false);
167e14391e94c850b8bd03680c23b38978db68687a8John Reck    QPixmap referencePixmap(view.size());
168e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&referencePixmap);
169e14391e94c850b8bd03680c23b38978db68687a8John Reck
170e14391e94c850b8bd03680c23b38978db68687a8John Reck    // 2. With tiling.
171e14391e94c850b8bd03680c23b38978db68687a8John Reck    webView->settings()->setAttribute(QWebSettings::TiledBackingStoreEnabled, true);
172e14391e94c850b8bd03680c23b38978db68687a8John Reck    QPixmap viewWithTiling(view.size());
173e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&viewWithTiling);
174e14391e94c850b8bd03680c23b38978db68687a8John Reck    QApplication::processEvents();
175e14391e94c850b8bd03680c23b38978db68687a8John Reck    viewWithTiling.fill();
176e14391e94c850b8bd03680c23b38978db68687a8John Reck    widget->render(&viewWithTiling);
177e14391e94c850b8bd03680c23b38978db68687a8John Reck
178e14391e94c850b8bd03680c23b38978db68687a8John Reck    QCOMPARE(referencePixmap.toImage(), viewWithTiling.toImage());
179e14391e94c850b8bd03680c23b38978db68687a8John Reck}
180e14391e94c850b8bd03680c23b38978db68687a8John Reck
18121939df44de1705786c545cd1bf519d47250322dBen Murdochvoid tst_QGraphicsWebView::microFocusCoordinates()
18221939df44de1705786c545cd1bf519d47250322dBen Murdoch{
18321939df44de1705786c545cd1bf519d47250322dBen Murdoch    QWebPage* page = new QWebPage;
18421939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsWebView* webView = new QGraphicsWebView;
18521939df44de1705786c545cd1bf519d47250322dBen Murdoch    webView->setPage( page );
18621939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsView* view = new QGraphicsView;
18721939df44de1705786c545cd1bf519d47250322dBen Murdoch    QGraphicsScene* scene = new QGraphicsScene(view);
18821939df44de1705786c545cd1bf519d47250322dBen Murdoch    view->setScene(scene);
18921939df44de1705786c545cd1bf519d47250322dBen Murdoch    scene->addItem(webView);
19021939df44de1705786c545cd1bf519d47250322dBen Murdoch    view->setGeometry(QRect(0,0,500,500));
19121939df44de1705786c545cd1bf519d47250322dBen Murdoch
19221939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setHtml("<html><body>" \
19321939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='text' id='input1' style='font--family: serif' value='' maxlength='20'/><br>" \
19421939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<canvas id='canvas1' width='500' height='500'/>" \
19521939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='password'/><br>" \
19621939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<canvas id='canvas2' width='500' height='500'/>" \
19721939df44de1705786c545cd1bf519d47250322dBen Murdoch        "</body></html>");
19821939df44de1705786c545cd1bf519d47250322dBen Murdoch
19921939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setFocus();
20021939df44de1705786c545cd1bf519d47250322dBen Murdoch
20121939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant initialMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
20221939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(initialMicroFocus.isValid());
20321939df44de1705786c545cd1bf519d47250322dBen Murdoch
20421939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->scroll(0,300);
20521939df44de1705786c545cd1bf519d47250322dBen Murdoch
20621939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant currentMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
20721939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(currentMicroFocus.isValid());
20821939df44de1705786c545cd1bf519d47250322dBen Murdoch
20921939df44de1705786c545cd1bf519d47250322dBen Murdoch    QCOMPARE(initialMicroFocus.toRect().translated(QPoint(0,-300)), currentMicroFocus.toRect());
21021939df44de1705786c545cd1bf519d47250322dBen Murdoch
21121939df44de1705786c545cd1bf519d47250322dBen Murdoch    delete view;
21221939df44de1705786c545cd1bf519d47250322dBen Murdoch}
21321939df44de1705786c545cd1bf519d47250322dBen Murdoch
214545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid tst_QGraphicsWebView::focusInputTypes()
215545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
216545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QWebPage* page = new QWebPage;
217545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    GraphicsWebView* webView = new GraphicsWebView;
218545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->setPage( page );
219545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QGraphicsView* view = new QGraphicsView;
220545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QGraphicsScene* scene = new QGraphicsScene(view);
221545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    view->setScene(scene);
222545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    scene->addItem(webView);
223545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    view->setGeometry(QRect(0,0,500,500));
224545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QCoreApplication::processEvents();
225545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QUrl url("qrc:///resources/input_types.html");
226545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    page->mainFrame()->load(url);
227545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    page->mainFrame()->setFocus();
228545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
229545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(waitForSignal(page, SIGNAL(loadFinished(bool))));
230545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
231545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'text' type
232545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 10.0));
233545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
234545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhNoAutoUppercase);
235545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhNoPredictiveText);
236545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#else
237545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() == Qt::ImhNone);
238545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
239545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
240545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'password' field
241545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 60.0));
242545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhHiddenText);
243545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
244545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'tel' field
245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 110.0));
246545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhDialableCharactersOnly);
247545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
248545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'number' field
249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 160.0));
250545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhDigitsOnly);
251545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
252545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'email' field
253545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 210.0));
254545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhEmailCharactersOnly);
255545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
256545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'url' field
257545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    webView->fireMouseClick(QPointF(20.0, 260.0));
258545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QVERIFY(webView->inputMethodHints() & Qt::ImhUrlCharactersOnly);
259545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
260545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    delete webView;
261545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    delete view;
262545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
263545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QGraphicsWebView::setPalette_data()
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("active");
26781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("background");
26881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeBG") << true << true;
26981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeFG") << true << false;
27081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveBG") << false << true;
27181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveFG") << false << false;
27281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Render a QGraphicsWebView to a QImage twice, each time with a different palette set,
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// verify that images rendered are not the same, confirming WebCore usage of
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// custom palette on selections.
27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QGraphicsWebView::setPalette()
27881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
27981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QString html = "<html><head></head>"
28081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "<body>"
28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "Some text here"
28281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</body>"
28381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</html>";
28481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, active);
28681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, background);
28781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
28881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWidget* activeView = 0;
28981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
29081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Use controlView to manage active/inactive state of test views by raising
29181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // or lowering their position in the window stack.
29281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene controlScene;
29381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView controlView(&controlScene);
29481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView controlWebView;
29581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlScene.addItem(&controlWebView);
29681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlWebView.setHtml(html);
29781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlWebView.setGeometry(QRectF(0, 0, 200, 200));
29881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
29981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene scene1;
30081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView view1(&scene1);
30181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.setSceneRect(0, 0, 300, 300);
30281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView webView1;
30381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setResizesToContents(true);
30481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    scene1.addItem(&webView1);
30581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setFocus();
30681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
30781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette1;
30881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush1(Qt::red);
30981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush1.setStyle(Qt::SolidPattern);
31081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
31181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an active QGraphicsWebView.
31281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::Highlight, brush1);
31381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
31481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an active QGraphicsWebView.
31581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::HighlightedText, brush1);
31681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
31781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an inactive QGraphicsWebView.
31881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::Highlight, brush1);
31981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
32081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an inactive QGraphicsWebView.
32181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush1);
32281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
32381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setHtml(html);
32581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.resize(webView1.page()->viewportSize());
32681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.setPalette(palette1);
32781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.show();
32881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(webView1.palette() == palette1);
33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(webView1.page()->palette() == palette1);
33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view1);
33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
33581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
33681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
33781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view1.activateWindow();
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view1;
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
343545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
34581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.page()->triggerAction(QWebPage::SelectAll);
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img1(webView1.page()->viewportSize(), QImage::Format_ARGB32);
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter1(&img1);
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView1.page()->currentFrame()->render(&painter1);
35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter1.end();
35281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.close();
35381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
35481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsScene scene2;
35681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsView view2(&scene2);
35781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.setSceneRect(0, 0, 300, 300);
35881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QGraphicsWebView webView2;
35981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setResizesToContents(true);
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    scene2.addItem(&webView2);
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setFocus();
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
36381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette2;
36481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush2(Qt::blue);
36581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush2.setStyle(Qt::SolidPattern);
36681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
36781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an active QGraphicsWebView.
36881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::Highlight, brush2);
36981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
37081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an active QGraphicsWebView.
37181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::HighlightedText, brush2);
37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an inactive QGraphicsWebView.
37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::Highlight, brush2);
37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an inactive QGraphicsWebView.
37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush2);
37881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
37981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setHtml(html);
38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.resize(webView2.page()->viewportSize());
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.setPalette(palette2);
38381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.show();
38481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view2);
38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
38881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
38981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
39181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
39381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view2.activateWindow();
39481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view2;
39581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
39881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.page()->triggerAction(QWebPage::SelectAll);
40081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img2(webView2.page()->viewportSize(), QImage::Format_ARGB32);
40281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter2(&img2);
40381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    webView2.page()->currentFrame()->render(&painter2);
40481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter2.end();
40581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.close();
40781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
40881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(img1 != img2);
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
41121939df44de1705786c545cd1bf519d47250322dBen Murdoch
412231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve BlockQTEST_MAIN(tst_QGraphicsWebView)
413231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
414231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#include "tst_qgraphicswebview.moc"
415