summaryrefslogtreecommitdiffstats
path: root/tests/auto/core/qwebengineurlrequestjob/tst_qwebengineurlrequestjob.cpp
blob: 5f679e9122ef187956fa66f7bbba8c0e1c162e05 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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 <QtTest/QtTest>
#include <QtWebEngineCore/qwebengineurlschemehandler.h>
#include <QtWebEngineCore/qwebengineurlscheme.h>
#include <QtWebEngineCore/qwebengineurlrequestjob.h>
#include <QtWebEngineCore/qwebengineprofile.h>
#include <QtWebEngineCore/qwebenginepage.h>
#include <QtWebEngineCore/qwebenginehttprequest.h>
#include <QtWebEngineCore/qwebenginesettings.h>

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<QByteArray, QByteArray> 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<bool>("withHeaders");
        QTest::addColumn<QString>("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"