Revision control
+ // Copyright (C) 2026 The Qt Company Ltd.
+ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+ #include <QSignalSpy>
+ #include <QtTest/QtTest>
+ #include <QtWebView/qwebview.h>
+ #include <QtWebView/qwebviewloadinginfo.h>
+ #include <QtWebView/private/qwebviewfactory_p.h>
+
+ using namespace Qt::StringLiterals;
+
+ class TestWebView : public QWebView {
+ public:
+ QSignalSpy urlSpy = QSignalSpy(this, SIGNAL(urlChanged(QUrl)));
+ QSignalSpy loadingSpy = QSignalSpy(this, SIGNAL(loadingChanged(QWebViewLoadingInfo)));
+ };
+
+ class tst_WebViewQrc : public QObject
+ {
+ Q_OBJECT
+ private slots:
+ void initTestCase();
+
+ void loadQrc();
+ void urlWithPrefix();
+ void followRelativeLink();
+ void followAbsoluteLink();
+ void javaScriptNavigation();
+ void iframe();
+ };
+
+ void tst_WebViewQrc::initTestCase()
+ {
+ if (QWebViewFactory::loadedPluginHasKey("native"))
+ QSKIP("qrc support not available for this backend.");
+ }
+
+ void tst_WebViewQrc::loadQrc()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/success.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ QCOMPARE(webView.title(), "Success"_L1);
+ }
+
+ void tst_WebViewQrc::urlWithPrefix()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/prefix/success.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ QCOMPARE(webView.title(), "Success!!!!"_L1);
+ }
+
+ void tst_WebViewQrc::followRelativeLink()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/link.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ webView.runJavaScript("document.getElementById('relative').click();");
+ QTRY_COMPARE(webView.loadingSpy.size(), 4);
+ QCOMPARE(webView.title(), "Success!!!!"_L1);
+ }
+
+ void tst_WebViewQrc::followAbsoluteLink()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/link.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ webView.runJavaScript("document.getElementById('absolute').click();");
+ QTRY_COMPARE(webView.loadingSpy.size(), 4);
+ QCOMPARE(webView.title(), "Success"_L1);
+ }
+
+ void tst_WebViewQrc::javaScriptNavigation()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/link.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ webView.runJavaScript("window.location = 'success.html';");
+ QTRY_COMPARE(webView.loadingSpy.size(), 4);
+ QCOMPARE(webView.title(), "Success"_L1);
+ webView.runJavaScript("window.location.replace('qrc://html/prefix/success.html');");
+ QTRY_COMPARE(webView.loadingSpy.size(), 6);
+ QCOMPARE(webView.title(), "Success!!!!"_L1);
+ }
+
+ void tst_WebViewQrc::iframe()
+ {
+ TestWebView webView;
+ webView.setUrl(QUrl("qrc://html/iframe.html"_L1));
+
+ QTRY_COMPARE(webView.loadingSpy.size(), 2);
+ bool finished = false;
+ webView.runJavaScript("document.getElementById('frame').contentDocument.title", [&](QVariant result) {
+ QCOMPARE(result.toString(), "Success");
+ finished = true;
+ });
+
+ QTRY_VERIFY(finished);
+ }
+
+ QTEST_MAIN(tst_WebViewQrc)
+
+ #include "tst_webviewqrc.moc"