summaryrefslogtreecommitdiffstats
path: root/tests/auto/core
diff options
context:
space:
mode:
authorTamas Zakor <ztamas@inf.u-szeged.hu>2020-05-08 07:49:35 +0200
committerTamas Zakor <ztamas@inf.u-szeged.hu>2020-05-26 00:39:16 +0200
commitf3b0a9b8563e2ff6298db219b782992a52d6f9ab (patch)
treea04d0a438192de7fd4aa31acd5569596eddc69fb /tests/auto/core
parent5b8465749963fcb109ab0093c254b476dbe72e66 (diff)
Add test for first party urls of service worker
Change-Id: Ic26d982ef9695705a9f7c757b7d983824b31a070 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'tests/auto/core')
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.html16
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.js3
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp88
-rw-r--r--tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.qrc2
4 files changed, 109 insertions, 0 deletions
diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.html b/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.html
new file mode 100644
index 000000000..af44b45a2
--- /dev/null
+++ b/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<html>
+ <body>
+ <script>
+ if ('serviceWorker' in navigator) {
+ window.addEventListener('load', function() {
+ navigator.serviceWorker.register('/sw.js').then(function(registration) {
+ console.log('ServiceWorker registration successful with scope: ', registration.scope);
+ }, function(err) {
+ console.error('ServiceWorker registration failed: ', err);
+ });
+ });
+ }
+ </script>
+ </body>
+</html>
diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.js b/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.js
new file mode 100644
index 000000000..2216e2a07
--- /dev/null
+++ b/tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.js
@@ -0,0 +1,3 @@
+self.addEventListener('install', function(event) {
+ console.log('ServiceWorker installed');
+});
diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
index b8ecce635..350c15174 100644
--- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
+++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp
@@ -74,6 +74,8 @@ private Q_SLOTS:
void passRefererHeader();
void initiator_data();
void initiator();
+ void jsServiceWorker_data();
+ void jsServiceWorker();
};
tst_QWebEngineUrlRequestInterceptor::tst_QWebEngineUrlRequestInterceptor()
@@ -186,6 +188,58 @@ public:
}
};
+class TestServer : public HttpServer
+{
+public:
+ TestServer()
+ {
+ connect(this, &HttpServer::newRequest, this, &TestServer::onNewRequest);
+ }
+
+private:
+ void onNewRequest(HttpReqRep *rr)
+ {
+ const QDir resourceDir(TESTS_SOURCE_DIR "qwebengineurlrequestinterceptor/resources");
+ QString path = rr->requestPath();
+ path.remove(0, 1);
+
+ if (rr->requestMethod() != "GET" || !resourceDir.exists(path))
+ {
+ rr->setResponseStatus(404);
+ rr->sendResponse();
+ return;
+ }
+
+ QFile file(resourceDir.filePath(path));
+ file.open(QIODevice::ReadOnly);
+ QByteArray data = file.readAll();
+ rr->setResponseBody(data);
+ QMimeDatabase db;
+ QMimeType mime = db.mimeTypeForFileNameAndData(file.fileName(), data);
+ rr->setResponseHeader(QByteArrayLiteral("content-type"), mime.name().toUtf8());
+ rr->sendResponse();
+ }
+};
+
+class ConsolePage : public QWebEnginePage {
+ Q_OBJECT
+public:
+ ConsolePage(QWebEngineProfile* profile) : QWebEnginePage(profile) {}
+
+ virtual void javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level, const QString& message, int lineNumber, const QString& sourceID)
+ {
+ levels.append(level);
+ messages.append(message);
+ lineNumbers.append(lineNumber);
+ sourceIDs.append(sourceID);
+ }
+
+ QList<int> levels;
+ QStringList messages;
+ QList<int> lineNumbers;
+ QStringList sourceIDs;
+};
+
void tst_QWebEngineUrlRequestInterceptor::interceptRequest_data()
{
QTest::addColumn<InterceptorSetter>("setter");
@@ -699,5 +753,39 @@ void tst_QWebEngineUrlRequestInterceptor::initiator()
QVERIFY(interceptor.requestInitiatorUrls[info.requestUrl].contains(info.initiator));
}
+void tst_QWebEngineUrlRequestInterceptor::jsServiceWorker_data()
+{
+ interceptRequest_data();
+}
+
+void tst_QWebEngineUrlRequestInterceptor::jsServiceWorker()
+{
+ QFETCH(InterceptorSetter, setter);
+
+ TestServer server;
+ QVERIFY(server.start());
+
+ QWebEngineProfile profile(QStringLiteral("Test"));
+ std::unique_ptr<ConsolePage> page;
+ page.reset(new ConsolePage(&profile));
+ TestRequestInterceptor interceptor(/* intercept */ false);
+ (profile.*setter)(&interceptor);
+ QVERIFY(loadSync(page.get(), server.url("/sw.html")));
+
+ // We expect only one message here, because logging of services workers is not exposed in our API.
+ QTRY_COMPARE(page->messages.count(), 1);
+ QCOMPARE(page->levels.at(0), QWebEnginePage::InfoMessageLevel);
+
+ QUrl firstPartyUrl = QUrl(server.url().toString() + "sw.js");
+ QList<RequestInfo> infos;
+ // Service Worker
+ QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeServiceWorker));
+ infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeServiceWorker);
+ foreach (auto info, infos)
+ QCOMPARE(info.firstPartyUrl, firstPartyUrl);
+
+ QVERIFY(server.stop());
+}
+
QTEST_MAIN(tst_QWebEngineUrlRequestInterceptor)
#include "tst_qwebengineurlrequestinterceptor.moc"
diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.qrc b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.qrc
index 13dbb134e..6a34635f7 100644
--- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.qrc
+++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.qrc
@@ -17,6 +17,8 @@
<file>resources/resource_in_iframe.html</file>
<file>resources/script.js</file>
<file>resources/style.css</file>
+ <file>resources/sw.html</file>
+ <file>resources/sw.js</file>
<file>resources/icons/favicon.png</file>
</qresource>
</RCC>