From dc7a726e431bdeb11449093a002a2b6daea0f67b Mon Sep 17 00:00:00 2001 From: Yigit Akcay Date: Sun, 8 Jan 2023 01:41:00 +0100 Subject: QWebEngineUrlRequestJob: Add function to set additional reponse headers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add additional response headers field to URLRequestCustomJobDelegate. Those fields can be set via QWebEngineUrlRequestJob::setAdditionalResponseHeaders( const QMap & ). They are added to URLRequestCustomJobProxy::m_client when URLRequestCustomJobProxy::reply(std::string, QIODevice) is called, and added to the response headers within CustomURLLoaderFactory::notifyHeadersComplete(). Fixes: QTBUG-106578 Change-Id: Ie0f0af07a5381c6f24ec0a1ee1b5bcb0e8c4fa5f Reviewed-by: Michael BrĂ¼ning --- tests/auto/core/CMakeLists.txt | 1 + .../core/qwebengineurlrequestjob/CMakeLists.txt | 21 ++++ .../additionalResponseHeadersScript.html | 12 +++ .../tst_qwebengineurlrequestjob.cpp | 119 +++++++++++++++++++++ 4 files changed, 153 insertions(+) create mode 100644 tests/auto/core/qwebengineurlrequestjob/CMakeLists.txt create mode 100644 tests/auto/core/qwebengineurlrequestjob/additionalResponseHeadersScript.html create mode 100644 tests/auto/core/qwebengineurlrequestjob/tst_qwebengineurlrequestjob.cpp (limited to 'tests') diff --git a/tests/auto/core/CMakeLists.txt b/tests/auto/core/CMakeLists.txt index 5615d6b2d..3f10e8303 100644 --- a/tests/auto/core/CMakeLists.txt +++ b/tests/auto/core/CMakeLists.txt @@ -4,6 +4,7 @@ add_subdirectory(qwebenginecookiestore) add_subdirectory(qwebenginesettings) add_subdirectory(qwebengineurlrequestinterceptor) +add_subdirectory(qwebengineurlrequestjob) add_subdirectory(origins) add_subdirectory(devtools) diff --git a/tests/auto/core/qwebengineurlrequestjob/CMakeLists.txt b/tests/auto/core/qwebengineurlrequestjob/CMakeLists.txt new file mode 100644 index 000000000..0a7699083 --- /dev/null +++ b/tests/auto/core/qwebengineurlrequestjob/CMakeLists.txt @@ -0,0 +1,21 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_test(tst_qwebengineurlrequestjob + SOURCES + tst_qwebengineurlrequestjob.cpp + LIBRARIES + Qt::WebEngineCore +) + +# Resources: +set(tst_qwebengineurlrequestjob_resource_files + "additionalResponseHeadersScript.html" +) + +qt_add_resources(tst_qwebengineurlrequestjob "tst_qwebengineurlrequestjob" + PREFIX + "/" + FILES + ${tst_qwebengineurlrequestjob_resource_files} +) diff --git a/tests/auto/core/qwebengineurlrequestjob/additionalResponseHeadersScript.html b/tests/auto/core/qwebengineurlrequestjob/additionalResponseHeadersScript.html new file mode 100644 index 000000000..a1b8a92d3 --- /dev/null +++ b/tests/auto/core/qwebengineurlrequestjob/additionalResponseHeadersScript.html @@ -0,0 +1,12 @@ + + + + + + diff --git a/tests/auto/core/qwebengineurlrequestjob/tst_qwebengineurlrequestjob.cpp b/tests/auto/core/qwebengineurlrequestjob/tst_qwebengineurlrequestjob.cpp new file mode 100644 index 000000000..5f679e912 --- /dev/null +++ b/tests/auto/core/qwebengineurlrequestjob/tst_qwebengineurlrequestjob.cpp @@ -0,0 +1,119 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 + +#include +#include +#include +#include +#include +#include +#include +#include + +class AdditionalResponseHeadersHandler : public QWebEngineUrlSchemeHandler +{ + Q_OBJECT +public: + AdditionalResponseHeadersHandler(bool addAdditionalResponseHeaders, QObject *parent = nullptr) + : QWebEngineUrlSchemeHandler(parent) + , m_addAdditionalResponseHeaders(addAdditionalResponseHeaders) + { + } + + void requestStarted(QWebEngineUrlRequestJob *job) override + { + QCOMPARE(job->requestUrl(), QUrl(schemeName + ":about")); + + QMap additionalResponseHeaders; + if (m_addAdditionalResponseHeaders) { + additionalResponseHeaders.insert(QByteArray::fromStdString("test1"), + QByteArray::fromStdString("test1VALUE")); + additionalResponseHeaders.insert(QByteArray::fromStdString("test2"), + QByteArray::fromStdString("test2VALUE")); + } + job->setAdditionalResponseHeaders(additionalResponseHeaders); + + QFile *file = new QFile(QStringLiteral(":additionalResponseHeadersScript.html"), job); + file->open(QIODevice::ReadOnly); + + job->reply(QByteArrayLiteral("text/html"), file); + } + + static void registerUrlScheme() + { + QWebEngineUrlScheme webUiScheme(schemeName); + webUiScheme.setFlags(QWebEngineUrlScheme::CorsEnabled); + QWebEngineUrlScheme::registerScheme(webUiScheme); + } + + const static inline QByteArray schemeName = + QByteArrayLiteral("additionalresponseheadershandler"); + +private: + bool m_addAdditionalResponseHeaders; +}; + +class AdditionalResponseHeadersPage : public QWebEnginePage +{ + Q_OBJECT + +public: + AdditionalResponseHeadersPage(QWebEngineProfile *profile, QString compareString, + QObject *parent = nullptr) + : QWebEnginePage(profile, parent), m_compareString(compareString) + { + } + +protected: + void javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level, + const QString &message, int lineNumber, + const QString &sourceID) override + { + auto splitMessage = message.split(";"); + if (splitMessage[0] == QString("TST_ADDITIONALRESPONSEHEADERS")) + QCOMPARE(splitMessage[1], m_compareString); + } + +private: + QString m_compareString; +}; + +class tst_QWebEngineUrlRequestJob : public QObject +{ + Q_OBJECT + +public: + tst_QWebEngineUrlRequestJob() { } + +private Q_SLOTS: + void initTestCase() { AdditionalResponseHeadersHandler::registerUrlScheme(); } + + void withAdditionalResponseHeaders_data() + { + QTest::addColumn("withHeaders"); + QTest::addColumn("expectedHeaders"); + QTest::newRow("headers enabled") + << true << "content-type: text/html\r\ntest1: test1value\r\ntest2: test2value\r\n"; + QTest::newRow("headers disabled") << false << "content-type: text/html\r\n"; + } + + void withAdditionalResponseHeaders() + { + QFETCH(bool, withHeaders); + QFETCH(QString, expectedHeaders); + + QWebEngineProfile profile; + + AdditionalResponseHeadersHandler handler(withHeaders); + profile.installUrlSchemeHandler(AdditionalResponseHeadersHandler::schemeName, &handler); + + AdditionalResponseHeadersPage page(&profile, expectedHeaders); + QSignalSpy spy(&page, SIGNAL(loadFinished(bool))); + + page.load(QUrl("qrc:///additionalResponseHeadersScript.html")); + QVERIFY(spy.wait()); + } +}; + +QTEST_MAIN(tst_QWebEngineUrlRequestJob) +#include "tst_qwebengineurlrequestjob.moc" -- cgit v1.2.3