diff options
author | Tamas Zakor <ztamas@inf.u-szeged.hu> | 2019-06-05 09:05:09 +0200 |
---|---|---|
committer | Tamas Zakor <ztamas@inf.u-szeged.hu> | 2019-06-05 15:07:34 +0200 |
commit | a1d3562d5115f5b06f9cb515df570e36c89ba187 (patch) | |
tree | ddc7d496f0a1dd9b870177c698e8feb641bc524b | |
parent | 366aef14779c28b12807be960eb494b534a859c9 (diff) |
Add QWebEngineUrlRequestInfo::initiator()
Returns the origin url of the document which initiated
the navigation when a frame navigates another frame.
Task-number: QTBUG-75759
Change-Id: Ia2884b5a3027cceea45f0e659652b02036faaacb
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
-rw-r--r-- | src/core/api/qwebengineurlrequestinfo.cpp | 13 | ||||
-rw-r--r-- | src/core/api/qwebengineurlrequestinfo.h | 1 | ||||
-rw-r--r-- | src/core/api/qwebengineurlrequestinfo_p.h | 3 | ||||
-rw-r--r-- | src/core/net/network_delegate_qt.cpp | 3 | ||||
-rw-r--r-- | tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp | 69 |
5 files changed, 87 insertions, 2 deletions
diff --git a/src/core/api/qwebengineurlrequestinfo.cpp b/src/core/api/qwebengineurlrequestinfo.cpp index 5377bf0e0..4e92bedcf 100644 --- a/src/core/api/qwebengineurlrequestinfo.cpp +++ b/src/core/api/qwebengineurlrequestinfo.cpp @@ -129,12 +129,13 @@ ASSERT_ENUMS_MATCH(QtWebEngineCore::WebContentsAdapterClient::RedirectNavigation QWebEngineUrlRequestInfoPrivate::QWebEngineUrlRequestInfoPrivate(QWebEngineUrlRequestInfo::ResourceType resource, QWebEngineUrlRequestInfo::NavigationType navigation, - const QUrl &u, const QUrl &fpu, const QByteArray &m) + const QUrl &u, const QUrl &fpu, const QUrl &i, const QByteArray &m) : resourceType(resource) , navigationType(navigation) , shouldBlockRequest(false) , url(u) , firstPartyUrl(fpu) + , initiator(i) , method(m) , changed(false) {} @@ -246,6 +247,16 @@ QUrl QWebEngineUrlRequestInfo::firstPartyUrl() const } /*! + Returns the origin url of the document which initiated + the navigation when a frame navigates another frame. + */ + +QUrl QWebEngineUrlRequestInfo::initiator() const +{ + return d_ptr->initiator; +} + +/*! Returns the HTTP method of the request (for example, GET or POST). */ diff --git a/src/core/api/qwebengineurlrequestinfo.h b/src/core/api/qwebengineurlrequestinfo.h index 09b74bd60..4637ff788 100644 --- a/src/core/api/qwebengineurlrequestinfo.h +++ b/src/core/api/qwebengineurlrequestinfo.h @@ -97,6 +97,7 @@ public: QUrl requestUrl() const; QUrl firstPartyUrl() const; + QUrl initiator() const; QByteArray requestMethod() const; bool changed() const; diff --git a/src/core/api/qwebengineurlrequestinfo_p.h b/src/core/api/qwebengineurlrequestinfo_p.h index 9d795b2b5..35b5610be 100644 --- a/src/core/api/qwebengineurlrequestinfo_p.h +++ b/src/core/api/qwebengineurlrequestinfo_p.h @@ -70,7 +70,7 @@ class QWebEngineUrlRequestInfoPrivate { public: QWebEngineUrlRequestInfoPrivate(QWebEngineUrlRequestInfo::ResourceType resource, QWebEngineUrlRequestInfo::NavigationType navigation, const QUrl &u, const QUrl &fpu, - const QByteArray &m); + const QUrl &i, const QByteArray &m); QWebEngineUrlRequestInfo::ResourceType resourceType; QWebEngineUrlRequestInfo::NavigationType navigationType; @@ -78,6 +78,7 @@ public: QUrl url; QUrl firstPartyUrl; + QUrl initiator; const QByteArray method; bool changed; QHash<QByteArray, QByteArray> extraHeaders; diff --git a/src/core/net/network_delegate_qt.cpp b/src/core/net/network_delegate_qt.cpp index f283df1d1..c0e936cd7 100644 --- a/src/core/net/network_delegate_qt.cpp +++ b/src/core/net/network_delegate_qt.cpp @@ -127,10 +127,13 @@ int NetworkDelegateQt::OnBeforeURLRequest(net::URLRequest *request, net::Complet else firstPartyUrl = toQt(request->site_for_cookies()); + const QUrl initiator = request->initiator().has_value() ? toQt(request->initiator()->GetURL()) : QUrl(); + QWebEngineUrlRequestInfoPrivate *infoPrivate = new QWebEngineUrlRequestInfoPrivate(toQt(resourceType), toQt(navigationType), qUrl, firstPartyUrl, + initiator, QByteArray::fromStdString(request->method())); QWebEngineUrlRequestInfo requestInfo(infoPrivate); diff --git a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp index 7d3ad1440..c0762aa14 100644 --- a/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp +++ b/tests/auto/core/qwebengineurlrequestinterceptor/tst_qwebengineurlrequestinterceptor.cpp @@ -65,6 +65,7 @@ private Q_SLOTS: void requestInterceptorByResourceType(); void firstPartyUrlHttp(); void passRefererHeader(); + void initiator(); }; tst_QWebEngineUrlRequestInterceptor::tst_QWebEngineUrlRequestInterceptor() @@ -95,11 +96,13 @@ struct RequestInfo { RequestInfo(QWebEngineUrlRequestInfo &info) : requestUrl(info.requestUrl()) , firstPartyUrl(info.firstPartyUrl()) + , initiator(info.initiator()) , resourceType(info.resourceType()) {} QUrl requestUrl; QUrl firstPartyUrl; + QUrl initiator; int resourceType; }; @@ -111,6 +114,7 @@ class TestRequestInterceptor : public QWebEngineUrlRequestInterceptor public: QList<RequestInfo> requestInfos; bool shouldIntercept; + QMap<QUrl, QUrl> requestInitiatorUrls; void interceptRequest(QWebEngineUrlRequestInfo &info) override { @@ -125,6 +129,7 @@ public: // Set referrer header info.setHttpHeader(kHttpHeaderRefererName, kHttpHeaderReferrerValue); + requestInitiatorUrls.insert(info.requestUrl(), info.initiator()); requestInfos.append(info); } @@ -553,5 +558,69 @@ void tst_QWebEngineUrlRequestInterceptor::passRefererHeader() QVERIFY(succeeded); } +void tst_QWebEngineUrlRequestInterceptor::initiator() +{ + QWebEngineProfile profile; + TestRequestInterceptor interceptor(/* intercept */ false); + profile.setUrlRequestInterceptor(&interceptor); + + QWebEnginePage page(&profile); + QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool))); + QUrl url = QUrl("https://www.w3schools.com/tags/tryit.asp?filename=tryhtml5_video"); + page.setUrl(QUrl(url)); + if (!loadSpy.wait(15000) || !loadSpy.at(0).at(0).toBool()) + QSKIP("Couldn't load page from network, skipping test."); + + QList<RequestInfo> infos; + + // SubFrame + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeSubFrame)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeSubFrame); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // Stylesheet + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeStylesheet)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeStylesheet); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // Script + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeScript)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeScript); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // Image + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeImage)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeImage); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // FontResource + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFontResource)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFontResource); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // Media + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeMedia)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeMedia); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // Favicon + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFavicon)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeFavicon); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); + + // XMLHttpRequest + QTRY_VERIFY(interceptor.hasUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeXhr)); + infos = interceptor.getUrlRequestForType(QWebEngineUrlRequestInfo::ResourceTypeXhr); + foreach (auto info, infos) + QCOMPARE(info.initiator, interceptor.requestInitiatorUrls[info.requestUrl]); +} + QTEST_MAIN(tst_QWebEngineUrlRequestInterceptor) #include "tst_qwebengineurlrequestinterceptor.moc" |