From b6039e76c2ecfd6b95359d6ac1bc7ecbd6c1d9c5 Mon Sep 17 00:00:00 2001 From: Jocelyn Turcotte Date: Wed, 13 Nov 2013 11:08:06 +0100 Subject: Add some QQuickWebView graphics stack tests. This does basic sanity testing of the graphics stack for both the hardware accelerated and software codepaths. This also adds a required signal to report the CompositingSurface later on if the QWindow wasn't available yet when Chromium asked for it. Change-Id: I402ec5ade9114c78bea7960c5f0de989f54110e3 Reviewed-by: Zeno Albisser --- .../qquickwebviewgraphics.pro | 2 + .../qquickwebviewgraphics_software.pro | 6 + .../tst_qquickwebviewgraphics.cpp | 200 +++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics.pro create mode 100644 tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics_software.pro create mode 100644 tests/auto/quick/qquickwebviewgraphics/tst_qquickwebviewgraphics.cpp (limited to 'tests/auto/quick/qquickwebviewgraphics') diff --git a/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics.pro b/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics.pro new file mode 100644 index 000000000..ff6c49628 --- /dev/null +++ b/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics.pro @@ -0,0 +1,2 @@ +include(../tests.pri) +exists($${TARGET}.qrc):RESOURCES += $${TARGET}.qrc diff --git a/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics_software.pro b/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics_software.pro new file mode 100644 index 000000000..07ef8be5b --- /dev/null +++ b/tests/auto/quick/qquickwebviewgraphics/qquickwebviewgraphics_software.pro @@ -0,0 +1,6 @@ +TARGET = qquickwebviewgraphics +include(../tests.pri) +TARGET = $${TARGET}_software +OBJECTS_DIR = $${OBJECTS_DIR}_software + +DEFINES += TST_QQUICKWEBVIEWGRAPHICS_SOFTWARE=1 \ No newline at end of file diff --git a/tests/auto/quick/qquickwebviewgraphics/tst_qquickwebviewgraphics.cpp b/tests/auto/quick/qquickwebviewgraphics/tst_qquickwebviewgraphics.cpp new file mode 100644 index 000000000..a88389c58 --- /dev/null +++ b/tests/auto/quick/qquickwebviewgraphics/tst_qquickwebviewgraphics.cpp @@ -0,0 +1,200 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtWebEngine module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include +#include +#include +#include +#include + +class TestView : public QQuickView { + Q_OBJECT +public: + virtual void exposeEvent(QExposeEvent *e) Q_DECL_OVERRIDE { + QQuickView::exposeEvent(e); + emit exposeChanged(); + } + +Q_SIGNALS: + void exposeChanged(); +}; + +class tst_QQuickWebViewGraphics : public QObject +{ + Q_OBJECT +public: + tst_QQuickWebViewGraphics(); + virtual ~tst_QQuickWebViewGraphics(); + +public Q_SLOTS: + void initTestCase(); + void init(); + void cleanup(); + +private Q_SLOTS: + void simpleGraphics(); + void renderAfterNodeCleanup(); + void showHideShow(); + void simpleAcceleratedLayer(); + void reparentToOtherWindow(); + +private: + void setHtml(const QString &html); + QScopedPointer m_view; +}; + +static const QString greenSquare("
"); +static const QString acLayerGreenSquare("
"); + +static QImage get150x150GreenReferenceImage() +{ + static QImage reference; + if (reference.isNull()) { + reference = QImage(150, 150, QImage::Format_RGB32); + reference.fill(Qt::white); + QPainter painter(&reference); + painter.fillRect(50, 50, 50, 50, QColor("#00ff00")); + } + return reference; +} + +tst_QQuickWebViewGraphics::tst_QQuickWebViewGraphics() +{ +} + +tst_QQuickWebViewGraphics::~tst_QQuickWebViewGraphics() +{ +} + +// This will be called before the first test function is executed. +// It is only called once. +void tst_QQuickWebViewGraphics::initTestCase() +{ +#if defined(TST_QQUICKWEBVIEWGRAPHICS_SOFTWARE) + qApp->setProperty("QQuickWebEngineView_DisableHardwareAcceleration", QVariant(true)); +#else + // This is currently needed by all QtWebEngine application using the HW accelerated QQuickWebView. + // It enables sharing between the QOpenGLContext of all QQuickWindows of the application. + // We have to do so until we expose a public API for it, or chose enable it by default in Qt 5.3.0. + QOpenGLContext *shareContext = new QOpenGLContext; + shareContext->create(); + QSGContext::setSharedOpenGLContext(shareContext); +#endif +} + +void tst_QQuickWebViewGraphics::init() +{ + m_view.reset(new TestView); +} + +void tst_QQuickWebViewGraphics::cleanup() +{ +} + +void tst_QQuickWebViewGraphics::simpleGraphics() +{ + setHtml(greenSquare); + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); +} + +void tst_QQuickWebViewGraphics::renderAfterNodeCleanup() +{ + setHtml(greenSquare); + + // Do it twice in a row, if the window isn't visible, the scene graph is going to be trashed by QQuickWindow::grabWindow after the first render. + QVERIFY(!m_view->isVisible()); + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); + +#if !defined(TST_QQUICKWEBVIEWGRAPHICS_SOFTWARE) + QEXPECT_FAIL("", "FIXME: This isn't working properly yet, QQuickWindow::grab() destroys the DelegatedFrameNode after it's done." + " There might be a way to trigger a repaint in Chromium, or we might have to prevent the destruction of our node tree.", Continue); +#endif + + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); +} + +void tst_QQuickWebViewGraphics::showHideShow() +{ + setHtml(greenSquare); + QSignalSpy exposeSpy(m_view.data(), SIGNAL(exposeChanged())); + m_view->show(); + QVERIFY(exposeSpy.wait(500)); + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); + + m_view->hide(); + QVERIFY(exposeSpy.wait(500)); + m_view->show(); + QVERIFY(exposeSpy.wait(500)); + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); +} + +void tst_QQuickWebViewGraphics::simpleAcceleratedLayer() +{ + setHtml(acLayerGreenSquare); + QCOMPARE(m_view->grabWindow(), get150x150GreenReferenceImage()); +} + +void tst_QQuickWebViewGraphics::reparentToOtherWindow() +{ + setHtml(greenSquare); + QQuickWindow window; + window.resize(m_view->size()); + window.create(); + + m_view->rootObject()->setParentItem(window.contentItem()); + QCOMPARE(window.grabWindow(), get150x150GreenReferenceImage()); +} + +void tst_QQuickWebViewGraphics::setHtml(const QString &html) +{ + QString htmlData = QUrl::toPercentEncoding(html); + QString qmlData = QUrl::toPercentEncoding(QStringLiteral("import QtQuick 2.0; import QtWebEngine 1.0; WebEngineView { width: 150; height: 150; url: loadUrl }")); + m_view->rootContext()->setContextProperty("loadUrl", QUrl(QStringLiteral("data:text/html,%1").arg(htmlData))); + m_view->setSource(QUrl(QStringLiteral("data:text/plain,%1").arg(qmlData))); + m_view->create(); + + // FIXME: Replace with a proper initialLayout signal. + QTest::qWait(200); + QCOMPARE(m_view->rootObject()->property("loading"), QVariant(false)); +} + +QTEST_MAIN(tst_QQuickWebViewGraphics) +#include "tst_qquickwebviewgraphics.moc" -- cgit v1.2.3