10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
30bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Copyright (C) 2009 Torch Mobile Inc.
4cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    Copyright (C) 2009 Girish Ramakrishnan <girish@forwardbias.in>
50bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is free software; you can redistribute it and/or
70bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    modify it under the terms of the GNU Library General Public
80bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    License as published by the Free Software Foundation; either
90bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    version 2 of the License, or (at your option) any later version.
100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    This library is distributed in the hope that it will be useful,
120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    but WITHOUT ANY WARRANTY; without even the implied warranty of
130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Library General Public License for more details.
150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    You should have received a copy of the GNU Library General Public License
170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    along with this library; see the file COPYING.LIB.  If not, write to
180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Boston, MA 02110-1301, USA.
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch*/
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qtest.h>
23643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#include "../util.h"
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qpainter.h>
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qwebview.h>
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qwebpage.h>
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qnetworkrequest.h>
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qdiriterator.h>
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qwebkitversion.h>
315ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include <qwebelement.h>
32cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#include <qwebframe.h>
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#ifdef Q_OS_SYMBIAN
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define VERIFY_INPUTMETHOD_HINTS(actual, expect) \
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(actual & Qt::ImhNoAutoUppercase); \
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(actual & Qt::ImhNoPredictiveText); \
382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(actual & expect);
392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define VERIFY_INPUTMETHOD_HINTS(actual, expect) \
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(actual == expect);
422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass tst_QWebView : public QObject
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Q_OBJECT
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic slots:
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void initTestCase();
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void cleanupTestCase();
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void init();
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void cleanup();
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate slots:
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    void renderingAfterMaxAndBack();
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void renderHints();
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void getWebKitVersion();
58cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
59cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void reusePage_data();
60cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void reusePage();
6121939df44de1705786c545cd1bf519d47250322dBen Murdoch    void microFocusCoordinates();
62545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    void focusInputTypes();
63643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
64643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void crashTests();
6581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette_data();
6781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    void setPalette();
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will be called before the first test function is executed.
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// It is only called once.
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::initTestCase()
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will be called after the last test function is executed.
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// It is only called once.
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::cleanupTestCase()
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will be called before each test function is executed.
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::init()
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch// This will be called after every test function.
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::cleanup()
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::renderHints()
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebView webView;
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
96f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    // default is only text antialiasing + smooth pixmap transform
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView.setRenderHint(QPainter::Antialiasing, true);
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::Antialiasing);
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
105f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView.setRenderHint(QPainter::Antialiasing, false);
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
111f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
1120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
1130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView.setRenderHint(QPainter::SmoothPixmapTransform, true);
1150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::Antialiasing));
1160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
1170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::SmoothPixmapTransform);
1180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
1190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    webView.setRenderHint(QPainter::SmoothPixmapTransform, false);
1210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(webView.renderHints() & QPainter::TextAntialiasing);
1220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::SmoothPixmapTransform));
1230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(!(webView.renderHints() & QPainter::HighQualityAntialiasing));
1240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_QWebView::getWebKitVersion()
1270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
1280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QVERIFY(qWebKitVersion().toDouble() > 0);
1290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
131cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid tst_QWebView::reusePage_data()
132cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
133cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QTest::addColumn<QString>("html");
134cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QTest::newRow("WithoutPlugin") << "<html><body id='b'>text</body></html>";
135cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QTest::newRow("WindowedPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf'></embed></body></html>");
136cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QTest::newRow("WindowlessPlugin") << QString("<html><body id='b'>text<embed src='resources/test.swf' wmode=\"transparent\"></embed></body></html>");
137cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
138cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
139cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Blockvoid tst_QWebView::reusePage()
140cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block{
141d0825bca7fe65beaee391d30da42e937db621564Steve Block    if (!QDir(TESTS_SOURCE_DIR).exists())
142d0825bca7fe65beaee391d30da42e937db621564Steve Block        QSKIP(QString("This test requires access to resources found in '%1'").arg(TESTS_SOURCE_DIR).toLatin1().constData(), SkipAll);
143d0825bca7fe65beaee391d30da42e937db621564Steve Block
144d0825bca7fe65beaee391d30da42e937db621564Steve Block    QDir::setCurrent(TESTS_SOURCE_DIR);
145cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
146cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QFETCH(QString, html);
147cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebView* view1 = new QWebView;
148cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QPointer<QWebPage> page = new QWebPage;
149cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view1->setPage(page);
150cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    page->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
151cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebFrame* mainFrame = page->mainFrame();
152d0825bca7fe65beaee391d30da42e937db621564Steve Block    mainFrame->setHtml(html, QUrl::fromLocalFile(TESTS_SOURCE_DIR));
153cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    if (html.contains("</embed>")) {
154cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        // some reasonable time for the PluginStream to feed test.swf to flash and start painting
155643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        waitForSignal(view1, SIGNAL(loadFinished(bool)), 2000);
156cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    }
157cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
158cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view1->show();
159643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QTest::qWaitForWindowShown(view1);
160cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    delete view1;
161cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QVERIFY(page != 0); // deleting view must not have deleted the page, since it's not a child of view
162cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
163cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QWebView *view2 = new QWebView;
164cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view2->setPage(page);
165cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    view2->show(); // in Windowless mode, you should still be able to see the plugin here
166643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QTest::qWaitForWindowShown(view2);
167cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    delete view2;
168cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
169cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    delete page; // must not crash
170cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
171cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    QDir::setCurrent(QApplication::applicationDirPath());
172cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block}
173cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
174643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Class used in crashTests
175643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockclass WebViewCrashTest : public QObject {
176643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Q_OBJECT
177643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QWebView* m_view;
178643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockpublic:
179643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    bool m_executed;
180643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
181643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
182643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebViewCrashTest(QWebView* view)
183643ca7872b450ea4efacab6188849e5aac2ba161Steve Block      : m_view(view)
184643ca7872b450ea4efacab6188849e5aac2ba161Steve Block      , m_executed(false)
185643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
186643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        view->connect(view, SIGNAL(loadProgress(int)), this, SLOT(loading(int)));
187643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
188643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
189643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockprivate slots:
190643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    void loading(int progress)
191643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    {
192643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        if (progress >= 20 && progress < 90) {
193643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            QVERIFY(!m_executed);
194643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_view->stop();
195643ca7872b450ea4efacab6188849e5aac2ba161Steve Block            m_executed = true;
196643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        }
197643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    }
198643ca7872b450ea4efacab6188849e5aac2ba161Steve Block};
199643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
200643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
201643ca7872b450ea4efacab6188849e5aac2ba161Steve Block// Should not crash.
202643ca7872b450ea4efacab6188849e5aac2ba161Steve Blockvoid tst_QWebView::crashTests()
203643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
204643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Test if loading can be stopped in loadProgress handler without crash.
205643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    // Test page should have frames.
206643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QWebView view;
207643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    WebViewCrashTest tester(&view);
208d0825bca7fe65beaee391d30da42e937db621564Steve Block    QUrl url("qrc:///resources/index.html");
209643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    view.load(url);
210643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    QTRY_VERIFY(tester.m_executed); // If fail it means that the test wasn't executed.
211643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
212643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
21321939df44de1705786c545cd1bf519d47250322dBen Murdochvoid tst_QWebView::microFocusCoordinates()
21421939df44de1705786c545cd1bf519d47250322dBen Murdoch{
21521939df44de1705786c545cd1bf519d47250322dBen Murdoch    QWebPage* page = new QWebPage;
21621939df44de1705786c545cd1bf519d47250322dBen Murdoch    QWebView* webView = new QWebView;
21721939df44de1705786c545cd1bf519d47250322dBen Murdoch    webView->setPage( page );
21821939df44de1705786c545cd1bf519d47250322dBen Murdoch
21921939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setHtml("<html><body>" \
22021939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='text' id='input1' style='font--family: serif' value='' maxlength='20'/><br>" \
2212bde8e466a4451c7319e3a072d118917957d6554Steve Block        "<canvas id='canvas1' width='500' height='500'></canvas>" \
22221939df44de1705786c545cd1bf519d47250322dBen Murdoch        "<input type='password'/><br>" \
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block        "<canvas id='canvas2' width='500' height='500'></canvas>" \
22421939df44de1705786c545cd1bf519d47250322dBen Murdoch        "</body></html>");
22521939df44de1705786c545cd1bf519d47250322dBen Murdoch
22621939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->setFocus();
22721939df44de1705786c545cd1bf519d47250322dBen Murdoch
22821939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant initialMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
22921939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(initialMicroFocus.isValid());
23021939df44de1705786c545cd1bf519d47250322dBen Murdoch
23121939df44de1705786c545cd1bf519d47250322dBen Murdoch    page->mainFrame()->scroll(0,50);
23221939df44de1705786c545cd1bf519d47250322dBen Murdoch
23321939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVariant currentMicroFocus = page->inputMethodQuery(Qt::ImMicroFocus);
23421939df44de1705786c545cd1bf519d47250322dBen Murdoch    QVERIFY(currentMicroFocus.isValid());
23521939df44de1705786c545cd1bf519d47250322dBen Murdoch
23621939df44de1705786c545cd1bf519d47250322dBen Murdoch    QCOMPARE(initialMicroFocus.toRect().translated(QPoint(0,-50)), currentMicroFocus.toRect());
23721939df44de1705786c545cd1bf519d47250322dBen Murdoch}
238643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
239545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochvoid tst_QWebView::focusInputTypes()
240545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch{
2415ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QWebView webView;
2425ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    webView.show();
2435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::qWaitForWindowShown(&webView);
244545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
245545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    QUrl url("qrc:///resources/input_types.html");
2465ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QWebFrame* const mainFrame = webView.page()->mainFrame();
2475ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    mainFrame->load(url);
2485ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    mainFrame->setFocus();
249545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
2505ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(waitForSignal(&webView, SIGNAL(loadFinished(bool))));
251545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
252545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'text' type
2535ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QWebElement inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=text]"));
2545ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
255545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
2565ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() & Qt::ImhNoAutoUppercase);
2575ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() & Qt::ImhNoPredictiveText);
258545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#else
2595ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() == Qt::ImhNone);
260545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#endif
2615ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
262545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
263545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'password' field
2645ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=password]"));
2655ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhHiddenText);
2675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
268545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
269545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'tel' field
2705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=tel]"));
2715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhDialableCharactersOnly);
2735ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
274545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
275545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'number' field
2765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=number]"));
2775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhDigitsOnly);
2795ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
280545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
281545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'email' field
2825ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=email]"));
2835ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhEmailCharactersOnly);
2855ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
286545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
287545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch    // 'url' field
2885ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=url]"));
2895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhUrlCharactersOnly);
2915ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
2920617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2930617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // 'password' field
2945ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=password]"));
2955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhHiddenText);
2975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
2980617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen
2990617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen    // 'text' type
3005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=text]"));
3015ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
3020617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if defined(Q_WS_MAEMO_5) || defined(Q_WS_MAEMO_6) || defined(Q_OS_SYMBIAN)
3035ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() & Qt::ImhNoAutoUppercase);
3045ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() & Qt::ImhNoPredictiveText);
3050617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#else
3065ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() == Qt::ImhNone);
3070617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#endif
3085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
309dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
310dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // 'password' field
3115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("input[type=password]"));
3125ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    VERIFY_INPUTMETHOD_HINTS(webView.inputMethodHints(), Qt::ImhHiddenText);
3145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
315dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
316dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    // 'text area' field
3175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    inputElement = mainFrame->documentElement().findFirst(QLatin1String("textarea"));
3185ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QTest::mouseClick(&webView, Qt::LeftButton, 0, inputElement.geometry().center());
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if defined(Q_OS_SYMBIAN)
3202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(webView.inputMethodHints() & Qt::ImhNoAutoUppercase);
3212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    QVERIFY(webView.inputMethodHints() & Qt::ImhNoPredictiveText);
3222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
3235ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.inputMethodHints() == Qt::ImhNone);
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
3255ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    QVERIFY(webView.testAttribute(Qt::WA_InputMethodEnabled));
326545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch}
327545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch
32881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QWebView::setPalette_data()
32981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
33081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("active");
33181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::addColumn<bool>("background");
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeBG") << true << true;
33381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("activeFG") << true << false;
33481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveBG") << false << true;
33581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::newRow("inactiveFG") << false << false;
33681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
33781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
33881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// Render a QWebView to a QImage twice, each time with a different palette set,
33981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// verify that images rendered are not the same, confirming WebCore usage of
34081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch// custom palette on selections.
34181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid tst_QWebView::setPalette()
34281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
34381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QString html = "<html><head></head>"
34481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "<body>"
34581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "Some text here"
34681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</body>"
34781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch                   "</html>";
34881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
34981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, active);
35081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QFETCH(bool, background);
35181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWidget* activeView = 0;
35381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Use controlView to manage active/inactive state of test views by raising
35581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // or lowering their position in the window stack.
35681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWebView controlView;
35781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.setHtml(html);
35881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
35981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWebView view1;
36081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
36181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette1;
36281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush1(Qt::red);
36381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush1.setStyle(Qt::SolidPattern);
36481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
36581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an active QWebView.
36681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::Highlight, brush1);
36781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
36881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an active QWebView.
36981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Active, QPalette::HighlightedText, brush1);
37081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
37181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red background on an inactive QWebView.
37281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::Highlight, brush1);
37381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
37481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have red foreground on an inactive QWebView.
37581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette1.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush1);
37681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
37781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
37881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.setPalette(palette1);
37981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.setHtml(html);
38081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.page()->setViewportSize(view1.page()->currentFrame()->contentsSize());
38181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.show();
38281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view1);
38481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
38581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
38781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
38881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
38981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
39081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
39181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view1.activateWindow();
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view1;
39381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
39481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
39681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.page()->triggerAction(QWebPage::SelectAll);
39881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
39981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img1(view1.page()->viewportSize(), QImage::Format_ARGB32);
40081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter1(&img1);
40181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.page()->currentFrame()->render(&painter1);
40281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter1.end();
40381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view1.close();
40481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
40581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QWebView view2;
40781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
40881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPalette palette2;
40981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QBrush brush2(Qt::blue);
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    brush2.setStyle(Qt::SolidPattern);
41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (active && background) {
41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an active QWebView.
41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::Highlight, brush2);
41481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (active && !background) {
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an active QWebView.
41681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Active, QPalette::HighlightedText, brush2);
41781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && background) {
41881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue background on an inactive QWebView.
41981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::Highlight, brush2);
42081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else if (!active && !background) {
42181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // Rendered image must have blue foreground on an inactive QWebView.
42281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        palette2.setBrush(QPalette::Inactive, QPalette::HighlightedText, brush2);
42381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
42481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
42581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.setPalette(palette2);
42681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.setHtml(html);
42781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.page()->setViewportSize(view2.page()->currentFrame()->contentsSize());
42881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.show();
42981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
43081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTest::qWaitForWindowShown(&view2);
43181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
43281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!active) {
43381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.show();
43481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        QTest::qWaitForWindowShown(&controlView);
43581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &controlView;
43681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        controlView.activateWindow();
43781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    } else {
43881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        view2.activateWindow();
43981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        activeView = &view2;
44081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
44181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QTRY_COMPARE(QApplication::activeWindow(), activeView);
44381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.page()->triggerAction(QWebPage::SelectAll);
44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QImage img2(view2.page()->viewportSize(), QImage::Format_ARGB32);
44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QPainter painter2(&img2);
44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.page()->currentFrame()->render(&painter2);
44981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    painter2.end();
45081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
45181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    view2.close();
45281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    controlView.close();
45381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
45481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    QVERIFY(img1 != img2);
45581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
45681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4572bde8e466a4451c7319e3a072d118917957d6554Steve Blockvoid tst_QWebView::renderingAfterMaxAndBack()
4582bde8e466a4451c7319e3a072d118917957d6554Steve Block{
4592bde8e466a4451c7319e3a072d118917957d6554Steve Block    QUrl url = QUrl("data:text/html,<html><head></head>"
4602bde8e466a4451c7319e3a072d118917957d6554Steve Block                   "<body width=1024 height=768 bgcolor=red>"
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block                   "</body>"
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block                   "</html>");
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block
4642bde8e466a4451c7319e3a072d118917957d6554Steve Block    QWebView view;
4652bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->mainFrame()->load(url);
4662bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(waitForSignal(&view, SIGNAL(loadFinished(bool))));
4672bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.show();
4682bde8e466a4451c7319e3a072d118917957d6554Steve Block
4692bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->settings()->setMaximumPagesInCache(3);
4702bde8e466a4451c7319e3a072d118917957d6554Steve Block
4712bde8e466a4451c7319e3a072d118917957d6554Steve Block    QTest::qWaitForWindowShown(&view);
4722bde8e466a4451c7319e3a072d118917957d6554Steve Block
4732bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap reference(view.page()->viewportSize());
4742bde8e466a4451c7319e3a072d118917957d6554Steve Block    reference.fill(Qt::red);
4752bde8e466a4451c7319e3a072d118917957d6554Steve Block
4762bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap image(view.page()->viewportSize());
4772bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPainter painter(&image);
4782bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->currentFrame()->render(&painter);
4792bde8e466a4451c7319e3a072d118917957d6554Steve Block
4802bde8e466a4451c7319e3a072d118917957d6554Steve Block    QCOMPARE(image, reference);
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block
4822bde8e466a4451c7319e3a072d118917957d6554Steve Block    QUrl url2 = QUrl("data:text/html,<html><head></head>"
4832bde8e466a4451c7319e3a072d118917957d6554Steve Block                     "<body width=1024 height=768 bgcolor=blue>"
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block                     "</body>"
4852bde8e466a4451c7319e3a072d118917957d6554Steve Block                     "</html>");
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->mainFrame()->load(url2);
4872bde8e466a4451c7319e3a072d118917957d6554Steve Block
4882bde8e466a4451c7319e3a072d118917957d6554Steve Block    QVERIFY(waitForSignal(&view, SIGNAL(loadFinished(bool))));
4892bde8e466a4451c7319e3a072d118917957d6554Steve Block
4902bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.showMaximized();
4912bde8e466a4451c7319e3a072d118917957d6554Steve Block
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block    QTest::qWaitForWindowShown(&view);
4932bde8e466a4451c7319e3a072d118917957d6554Steve Block
4942bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap reference2(view.page()->viewportSize());
4952bde8e466a4451c7319e3a072d118917957d6554Steve Block    reference2.fill(Qt::blue);
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block
4972bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap image2(view.page()->viewportSize());
4982bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPainter painter2(&image2);
4992bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->currentFrame()->render(&painter2);
5002bde8e466a4451c7319e3a072d118917957d6554Steve Block
5012bde8e466a4451c7319e3a072d118917957d6554Steve Block    QCOMPARE(image2, reference2);
5022bde8e466a4451c7319e3a072d118917957d6554Steve Block
5032bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.back();
5042bde8e466a4451c7319e3a072d118917957d6554Steve Block
5052bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap reference3(view.page()->viewportSize());
5062bde8e466a4451c7319e3a072d118917957d6554Steve Block    reference3.fill(Qt::red);
5072bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPixmap image3(view.page()->viewportSize());
5082bde8e466a4451c7319e3a072d118917957d6554Steve Block    QPainter painter3(&image3);
5092bde8e466a4451c7319e3a072d118917957d6554Steve Block    view.page()->currentFrame()->render(&painter3);
5102bde8e466a4451c7319e3a072d118917957d6554Steve Block
5112bde8e466a4451c7319e3a072d118917957d6554Steve Block    QCOMPARE(image3, reference3);
5122bde8e466a4451c7319e3a072d118917957d6554Steve Block}
5132bde8e466a4451c7319e3a072d118917957d6554Steve Block
5140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQTEST_MAIN(tst_QWebView)
5150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "tst_qwebview.moc"
5160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
517