10bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/*
20bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Holger Hans Peter Freyther
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
200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <QtTest/QtTest>
210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include <qwebelement.h>
230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qwebframe.h>
240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qwebview.h>
250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include <qpainter.h>
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch/**
280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Starts an event loop that runs until the given signal is received.
290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Optionally the event loop
300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * can return earlier on a timeout.
310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *
320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * \return \p true if the requested signal was received
330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch *         \p false on timeout
340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch */
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic bool waitForSignal(QObject* obj, const char* signal, int timeout = 0)
360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QEventLoop loop;
380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QObject::connect(obj, signal, &loop, SLOT(quit()));
390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QTimer timer;
400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QSignalSpy timeoutSpy(&timer, SIGNAL(timeout()));
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if (timeout > 0) {
420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QObject::connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit()));
430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        timer.setSingleShot(true);
440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        timer.start(timeout);
450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    loop.exec();
470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return timeoutSpy.isEmpty();
480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass tst_Painting : public QObject
510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    Q_OBJECT
530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic:
550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochpublic Q_SLOTS:
570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void init();
580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void cleanup();
590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate Q_SLOTS:
610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void paint_data();
620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void paint();
63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void textAreas();
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochprivate:
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebView* m_view;
670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebPage* m_page;
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch};
690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_Painting::init()
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_view = new QWebView;
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_page = m_view->page();
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QSize viewportSize(1024, 768);
760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_view->setFixedSize(viewportSize);
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_page->setViewportSize(viewportSize);
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_Painting::cleanup()
810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    delete m_view;
830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_Painting::paint_data()
860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QTest::addColumn<QUrl>("url");
880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QTest::newRow("amazon") << QUrl("http://www.amazon.com");
890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid tst_Painting::paint()
920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{
930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QFETCH(QUrl, url);
940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    m_view->load(url);
960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    ::waitForSignal(m_view, SIGNAL(loadFinished(bool)));
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    /* force a layout */
990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QWebFrame* mainFrame = m_page->mainFrame();
1000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    mainFrame->toPlainText();
1010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
1020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QPixmap pixmap(m_page->viewportSize());
1030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    QBENCHMARK {
1040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        QPainter painter(&pixmap);
1050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        mainFrame->render(&painter, QRect(QPoint(0, 0), m_page->viewportSize()));
1060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        painter.end();
1070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    }
1080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch}
1090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
110dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid tst_Painting::textAreas()
111dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{
112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    m_view->load(QUrl("data:text/html;<html><body></body></html>"));
113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    ::waitForSignal(m_view, SIGNAL(loadFinished(bool)));
114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QWebElement bodyElement = m_page->mainFrame()->findFirstElement("body");
116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    int count = 100;
118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    while (count--) {
119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QString markup("<textarea cols='1' rows='1'></textarea>");
120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        bodyElement.appendInside(markup);
121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
122dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    /* force a layout */
124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QWebFrame* mainFrame = m_page->mainFrame();
125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    mainFrame->toPlainText();
126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QPixmap pixmap(mainFrame->contentsSize());
128dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    QBENCHMARK {
129dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        QPainter painter(&pixmap);
130dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        mainFrame->render(&painter, QRect(QPoint(0, 0), mainFrame->contentsSize()));
131dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        painter.end();
132dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    }
133dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block}
134dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
1350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochQTEST_MAIN(tst_Painting)
1360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "tst_painting.moc"
137