diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-02-04 13:50:57 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-02-04 14:13:39 +0100 |
commit | 6722bbbf4ea2ddcdd9194f26a883029ec3afc39a (patch) | |
tree | c3290b82fac21c4990be8472ae6cb4ca043205cf /tests/auto | |
parent | 41d69eb0fa2375f0da6ba9b35136f5598be4b3a4 (diff) | |
parent | 82f4d13a13b40d9cb7710f6dd4190175a272a394 (diff) |
Merge branch '5.6' into dev
Change-Id: I0bb971f01ee1e02da768f336680c8ec0254ab2b0
Diffstat (limited to 'tests/auto')
4 files changed, 171 insertions, 9 deletions
diff --git a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp index cb566c254..a1900a77d 100644 --- a/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp +++ b/tests/auto/quick/qquickwebengineview/tst_qquickwebengineview.cpp @@ -21,10 +21,13 @@ #include "util.h" #include <QScopedPointer> +#include <QtCore/qelapsedtimer.h> #include <QtQml/QQmlEngine> #include <QtTest/QtTest> #include <private/qquickwebengineview_p.h> +#include <functional> + class tst_QQuickWebEngineView : public QObject { Q_OBJECT public: @@ -313,6 +316,21 @@ void tst_QQuickWebEngineView::multipleWebEngineViews() QTest::qWait(200); } +QImage tryToGrabWindowUntil(QQuickWindow *window, std::function<bool(const QImage &)> checkImage, + int timeout = 5000) +{ + QImage grabbed; + QElapsedTimer t; + t.start(); + do { + QTest::qWait(200); + grabbed = window->grabWindow(); + if (checkImage(grabbed)) + break; + } while (!t.hasExpired(timeout)); + return grabbed; +} + void tst_QQuickWebEngineView::basicRenderingSanity() { showWebEngineView(); @@ -322,9 +340,12 @@ void tst_QQuickWebEngineView::basicRenderingSanity() // This should not crash. webEngineView()->setVisible(true); - QTest::qWait(200); - QImage grabbedWindow = m_window->grabWindow(); + QRgb testColor = qRgba(0, 0xff, 0, 0xff); + const QImage grabbedWindow = tryToGrabWindowUntil(m_window.data(), + [testColor] (const QImage &image) { + return image.pixel(10, 10) == testColor; + }); QVERIFY(grabbedWindow.pixel(10, 10) == testColor); QVERIFY(grabbedWindow.pixel(100, 10) == testColor); QVERIFY(grabbedWindow.pixel(10, 100) == testColor); @@ -370,12 +391,11 @@ void tst_QQuickWebEngineView::transparentWebEngineViews() webEngineView2->setSize(QSizeF(300, 400)); webEngineView2->setUrl(urlFromTestPath("/html/basic_page.html")); QVERIFY(waitForLoadSucceeded(webEngineView2.data())); - webEngineView2->setVisible(true); - - QTest::qWait(200); // Result image: black text on red background. - QImage grabbedWindow = m_window->grabWindow(); + const QImage grabbedWindow = tryToGrabWindowUntil(m_window.data(), [] (const QImage &image) { + return image.pixelColor(0, 0) == QColor(Qt::red); + }); QSet<int> redComponents; for (int i = 0, width = grabbedWindow.width(); i < width; i++) { diff --git a/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp b/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp index 2e85ab802..cd1d1ac44 100644 --- a/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp +++ b/tests/auto/quick/qquickwebengineviewgraphics/tst_qquickwebengineviewgraphics.cpp @@ -178,13 +178,14 @@ void tst_QQuickWebEngineViewGraphics::reparentToOtherWindow() void tst_QQuickWebEngineViewGraphics::setHtml(const QString &html) { QString htmlData = QUrl::toPercentEncoding(html); - QString qmlData = QUrl::toPercentEncoding(QStringLiteral("import QtQuick 2.0; import QtWebEngine 1.2; WebEngineView { width: 150; height: 150; url: loadUrl }")); - m_view->rootContext()->setContextProperty("loadUrl", QUrl(QStringLiteral("data:text/html,%1").arg(htmlData))); + QString qmlData = QUrl::toPercentEncoding(QStringLiteral("import QtQuick 2.0; import QtWebEngine 1.2; WebEngineView { width: 150; height: 150 }")); m_view->setSource(QUrl(QStringLiteral("data:text/plain,%1").arg(qmlData))); m_view->create(); QQuickWebEngineView *webEngineView = static_cast<QQuickWebEngineView *>(m_view->rootObject()); - QVERIFY(waitForSignal(reinterpret_cast<QObject *>(webEngineView->experimental()), SIGNAL(loadVisuallyCommitted()))); + QSignalSpy spy(reinterpret_cast<QObject *>(webEngineView->experimental()), SIGNAL(loadVisuallyCommitted())); + webEngineView->setProperty("url", QUrl(QStringLiteral("data:text/html,%1").arg(htmlData))); + QVERIFY(!spy.isEmpty() || spy.wait()); QCOMPARE(m_view->rootObject()->property("loading"), QVariant(false)); } diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 8fd71c701..690cf70e4 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -33,6 +33,7 @@ #include <QStyle> #include <QtTest/QtTest> #include <QTextCharFormat> +#include <QWebChannel> #include <private/qinputmethod_p.h> #include <qnetworkcookiejar.h> #include <qnetworkreply.h> @@ -42,6 +43,8 @@ #include <qwebenginehistory.h> #include <qwebenginepage.h> #include <qwebengineprofile.h> +#include <qwebenginescript.h> +#include <qwebenginescriptcollection.h> #include <qwebenginesettings.h> #include <qwebengineview.h> #include <qimagewriter.h> @@ -237,6 +240,8 @@ private Q_SLOTS: void loadInSignalHandlers_data(); void loadInSignalHandlers(); + void restoreHistory(); + private: QWebEngineView* m_view; QWebEnginePage* m_page; @@ -5079,5 +5084,36 @@ void tst_QWebEnginePage::loadInSignalHandlers() QCOMPARE(m_page->url(), urlForSetter); } +void tst_QWebEnginePage::restoreHistory() +{ + QWebChannel *channel = new QWebChannel; + QWebEnginePage *page = new QWebEnginePage; + page->setWebChannel(channel); + + QWebEngineScript script; + script.setName(QStringLiteral("script")); + page->scripts().insert(script); + + QSignalSpy spy(page, SIGNAL(loadFinished(bool))); + page->load(QUrl(QStringLiteral("qrc:/resources/test1.html"))); + QTRY_COMPARE(spy.count(), 1); + + QCOMPARE(page->webChannel(), channel); + QVERIFY(page->scripts().contains(script)); + + QByteArray data; + QDataStream out(&data, QIODevice::ReadWrite); + out << *page->history(); + QDataStream in(&data, QIODevice::ReadOnly); + in >> *page->history(); + QTRY_COMPARE(spy.count(), 2); + + QCOMPARE(page->webChannel(), channel); + QVERIFY(page->scripts().contains(script)); + + delete page; + delete channel; +} + QTEST_MAIN(tst_QWebEnginePage) #include "tst_qwebenginepage.moc" diff --git a/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp b/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp index dfc1d39df..8c23af7ee 100644 --- a/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp +++ b/tests/auto/widgets/qwebengineprofile/tst_qwebengineprofile.cpp @@ -27,7 +27,11 @@ ****************************************************************************/ #include "../util.h" +#include <QtCore/qbuffer.h> #include <QtTest/QtTest> +#include <QtWebEngineCore/qwebengineurlrequestjob.h> +#include <QtWebEngineCore/qwebengineurlschemehandler.h> +#include <QtWebEngineWidgets/qwebengineview.h> #include <qwebengineprofile.h> #include <qwebenginepage.h> @@ -40,6 +44,8 @@ private Q_SLOTS: void profileConstructors(); void clearDataFromCache(); void disableCache(); + void urlSchemeHandlers(); + void urlSchemeHandlerFailRequest(); }; void tst_QWebEngineProfile::defaultProfile() @@ -137,5 +143,104 @@ void tst_QWebEngineProfile::disableCache() cacheDir.removeRecursively(); } +class RedirectingUrlSchemeHandler : public QWebEngineUrlSchemeHandler +{ +public: + void requestStarted(QWebEngineUrlRequestJob *job) + { + job->redirect(QUrl(QStringLiteral("data:text/plain;charset=utf-8,") + + job->requestUrl().fileName())); + } +}; + +class ReplyingUrlSchemeHandler : public QWebEngineUrlSchemeHandler +{ + QBuffer m_buffer; + QByteArray m_bufferData; +public: + ReplyingUrlSchemeHandler(QObject *parent = nullptr) + : QWebEngineUrlSchemeHandler(parent) + { + m_buffer.setBuffer(&m_bufferData); + } + + void requestStarted(QWebEngineUrlRequestJob *job) + { + m_bufferData = job->requestUrl().toString().toUtf8(); + job->reply("text/plain;charset=utf-8", &m_buffer); + } +}; + +void tst_QWebEngineProfile::urlSchemeHandlers() +{ + RedirectingUrlSchemeHandler mailtoHandler; + QWebEngineProfile profile(QStringLiteral("urlSchemeHandlers")); + profile.installUrlSchemeHandler("mailto", &mailtoHandler); + QWebEngineView view; + QSignalSpy loadFinishedSpy(&view, SIGNAL(loadFinished(bool))); + view.setPage(new QWebEnginePage(&profile, &view)); + QString emailAddress = QStringLiteral("egon@olsen-banden.dk"); + view.load(QUrl(QStringLiteral("mailto:") + emailAddress)); + QVERIFY(loadFinishedSpy.wait()); + QCOMPARE(toPlainTextSync(view.page()), emailAddress); + + // Install a gopher handler after the view has been fully initialized. + ReplyingUrlSchemeHandler gopherHandler; + profile.installUrlSchemeHandler("gopher", &gopherHandler); + QUrl url = QUrl(QStringLiteral("gopher://olsen-banden.dk/benny")); + view.load(url); + QVERIFY(loadFinishedSpy.wait()); + QCOMPARE(toPlainTextSync(view.page()), url.toString()); + + // Remove the mailto scheme, and check whether it is not handled anymore. + profile.removeUrlScheme("mailto"); + emailAddress = QStringLiteral("kjeld@olsen-banden.dk"); + view.load(QUrl(QStringLiteral("mailto:") + emailAddress)); + QVERIFY(loadFinishedSpy.wait()); + QVERIFY(toPlainTextSync(view.page()) != emailAddress); + + // Check if gopher is still working after removing mailto. + url = QUrl(QStringLiteral("gopher://olsen-banden.dk/yvonne")); + view.load(url); + QVERIFY(loadFinishedSpy.wait()); + QCOMPARE(toPlainTextSync(view.page()), url.toString()); + + // Does removeAll work? + profile.removeAllUrlSchemeHandlers(); + url = QUrl(QStringLiteral("gopher://olsen-banden.dk/harry")); + view.load(url); + QVERIFY(loadFinishedSpy.wait()); + QVERIFY(toPlainTextSync(view.page()) != url.toString()); + + // Install a handler that is owned by the view. Make sure this doesn't crash on shutdown. + profile.installUrlSchemeHandler("aviancarrier", new ReplyingUrlSchemeHandler(&view)); + url = QUrl(QStringLiteral("aviancarrier:inspector.mortensen@politistyrke.dk")); + view.load(url); + QVERIFY(loadFinishedSpy.wait()); + QCOMPARE(toPlainTextSync(view.page()), url.toString()); +} + +class FailingUrlSchemeHandler : public QWebEngineUrlSchemeHandler +{ +public: + void requestStarted(QWebEngineUrlRequestJob *job) override + { + job->fail(QWebEngineUrlRequestJob::RequestFailed); + } +}; + +void tst_QWebEngineProfile::urlSchemeHandlerFailRequest() +{ + FailingUrlSchemeHandler handler; + QWebEngineProfile profile; + profile.installUrlSchemeHandler("foo", &handler); + QWebEngineView view; + QSignalSpy loadFinishedSpy(&view, SIGNAL(loadFinished(bool))); + view.setPage(new QWebEnginePage(&profile, &view)); + view.load(QUrl(QStringLiteral("foo://bar"))); + QVERIFY(loadFinishedSpy.wait()); + QVERIFY(toPlainTextSync(view.page()).isEmpty()); +} + QTEST_MAIN(tst_QWebEngineProfile) #include "tst_qwebengineprofile.moc" |