From f3b0a9b8563e2ff6298db219b782992a52d6f9ab Mon Sep 17 00:00:00 2001 From: Tamas Zakor Date: Fri, 8 May 2020 07:49:35 +0200 Subject: Add test for first party urls of service worker Change-Id: Ic26d982ef9695705a9f7c757b7d983824b31a070 Reviewed-by: Allan Sandfeld Jensen --- .../resources/sw.html | 16 ++++ .../resources/sw.js | 3 + .../tst_qwebengineurlrequestinterceptor.cpp | 88 ++++++++++++++++++++++ .../tst_qwebengineurlrequestinterceptor.qrc | 2 + 4 files changed, 109 insertions(+) create mode 100644 tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.html create mode 100644 tests/auto/core/qwebengineurlrequestinterceptor/resources/sw.js (limited to 'tests/auto') 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 @@ + + + + + + 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 levels; + QStringList messages; + QList lineNumbers; + QStringList sourceIDs; +}; + void tst_QWebEngineUrlRequestInterceptor::interceptRequest_data() { QTest::addColumn("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 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 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 @@ resources/resource_in_iframe.html resources/script.js resources/style.css + resources/sw.html + resources/sw.js resources/icons/favicon.png -- cgit v1.2.3