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