diff options
author | Szabolcs David <davidsz@inf.u-szeged.hu> | 2023-10-18 01:05:23 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2023-11-02 20:35:13 +0000 |
commit | c72382818f7114a3593d036e076b4f614ad13a4c (patch) | |
tree | 207cb883a6b6834652444302a3c068f7f76a31e4 | |
parent | cfd600f6bbec585be623550f8a26e49346246252 (diff) |
Reinstall URLRequestInterceptors during new view adoptation
The pointer to the page interceptor is stored in WebContentsAdapter
and we lose it when recreating the adapter. Prevent this and add
auto test.
Fixes: QTBUG-117867
Change-Id: I5e79cdcc5996bdf2bb53c3016d4133f978ccfb39
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
(cherry picked from commit d2f119a94d27a98fd58a0c60bacfc8f91e028a34)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/core/api/qwebenginepage.cpp | 2 | ||||
-rw-r--r-- | tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp | 49 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/core/api/qwebenginepage.cpp b/src/core/api/qwebenginepage.cpp index bce5f1e89..13f2f387e 100644 --- a/src/core/api/qwebenginepage.cpp +++ b/src/core/api/qwebenginepage.cpp @@ -456,6 +456,8 @@ bool QWebEnginePagePrivate::adoptWebContents(WebContentsAdapter *webContents) m_isBeingAdopted = true; + webContents->setRequestInterceptor(adapter->requestInterceptor()); + // This throws away the WebContentsAdapter that has been used until now. // All its states, particularly the loading URL, are replaced by the adopted WebContentsAdapter. WebContentsAdapterOwner *adapterOwner = new WebContentsAdapterOwner(adapter->sharedFromThis()); diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 5e540babe..538195854 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -65,6 +65,7 @@ #include <qwebenginescript.h> #include <qwebenginescriptcollection.h> #include <qwebenginesettings.h> +#include <qwebengineurlrequestinterceptor.h> #include <qwebengineurlrequestjob.h> #include <qwebengineurlscheme.h> #include <qwebengineurlschemehandler.h> @@ -271,6 +272,7 @@ private Q_SLOTS: void childFrameInput(); void openLinkInNewPageWithWebWindowType_data(); void openLinkInNewPageWithWebWindowType(); + void keepInterceptorAfterNewWindowRequested(); private: static bool isFalseJavaScriptResult(QWebEnginePage *page, const QString &javaScript); @@ -5328,6 +5330,53 @@ void tst_QWebEnginePage::openLinkInNewPageWithWebWindowType() QCOMPARE(page.windowType, webWindowType); } +class DoNothingInterceptor : public QWebEngineUrlRequestInterceptor +{ +public: + DoNothingInterceptor() { } + + void interceptRequest(QWebEngineUrlRequestInfo &) override + { + ran = true; + } + bool ran = false; +}; + +void tst_QWebEnginePage::keepInterceptorAfterNewWindowRequested() +{ + DoNothingInterceptor interceptor; + QWebEnginePage page; + page.setUrlRequestInterceptor(&interceptor); + connect(&page, &QWebEnginePage::newWindowRequested, [&](QWebEngineNewWindowRequest &request) { + request.openIn(&page); + }); + QSignalSpy loadFinishedSpy(&page, SIGNAL(loadFinished(bool))); + + QWebEngineView view; + view.resize(500, 500); + view.setPage(&page); + view.show(); + QVERIFY(QTest::qWaitForWindowExposed(&view)); + + page.setHtml("<html><body>" + "<a id='link' href='hello' target='_blank'>link</a>" + "</body></html>"); + QTRY_COMPARE(loadFinishedSpy.size(), 1); + QVERIFY(loadFinishedSpy.takeFirst().value(0).toBool()); + QVERIFY(interceptor.ran); + interceptor.ran = false; + + QTest::mouseClick(view.focusProxy(), Qt::LeftButton, {}, elementCenter(&page, "link")); + QTRY_COMPARE(loadFinishedSpy.size(), 1); + QVERIFY(loadFinishedSpy.takeFirst().value(0).toBool()); + QVERIFY(!interceptor.ran); + + page.setHtml("<html><body></body></html>"); + QTRY_COMPARE(loadFinishedSpy.size(), 1); + QVERIFY(loadFinishedSpy.takeFirst().value(0).toBool()); + QVERIFY(interceptor.ran); +} + static QByteArrayList params = {QByteArrayLiteral("--use-fake-device-for-media-stream")}; W_QTEST_MAIN(tst_QWebEnginePage, params) |