From b29b245fcb9db741d14180ea7e8dcb3ad2d4f49a Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 14 Apr 2021 13:35:19 +0200 Subject: Report server directs in navigation type A server redirect might not have been reflected in the navigation type at this point, so also check the is_redirect value. Pick-to: 5.15.4 Fixes: QTBUG-92819 Change-Id: I711ef041de69552bc3485c9cf3db68c9e6033d6a Reviewed-by: Allan Sandfeld Jensen Reviewed-by: Kirill Burtsev --- src/core/content_browser_client_qt.cpp | 8 +++++- .../widgets/qwebenginepage/resources/redirect.html | 8 ++++++ .../widgets/qwebenginepage/tst_qwebenginepage.cpp | 33 ++++++++++++++++++++++ .../widgets/qwebenginepage/tst_qwebenginepage.qrc | 1 + 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 tests/auto/widgets/qwebenginepage/resources/redirect.html diff --git a/src/core/content_browser_client_qt.cpp b/src/core/content_browser_client_qt.cpp index da1ea8dde..76f94c61f 100644 --- a/src/core/content_browser_client_qt.cpp +++ b/src/core/content_browser_client_qt.cpp @@ -1005,7 +1005,13 @@ static bool navigationThrottleCallback(content::WebContents *source, WebContentsViewQt::from(static_cast(source)->GetView())->client(); if (!client) return false; - client->navigationRequested(pageTransitionToNavigationType(params.transition_type()), + + // Redirects might not be reflected in transition_type at this point (see also chrome/.../web_navigation_api_helpers.cc) + auto transition_type = params.transition_type(); + if (params.is_redirect()) + transition_type = ui::PageTransitionFromInt(transition_type | ui::PAGE_TRANSITION_SERVER_REDIRECT); + + client->navigationRequested(pageTransitionToNavigationType(transition_type), toQt(params.url()), navigationRequestAction, params.is_main_frame()); diff --git a/tests/auto/widgets/qwebenginepage/resources/redirect.html b/tests/auto/widgets/qwebenginepage/resources/redirect.html new file mode 100644 index 000000000..db06d73a7 --- /dev/null +++ b/tests/auto/widgets/qwebenginepage/resources/redirect.html @@ -0,0 +1,8 @@ + + + + + diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 7e92ad8cc..e5975edcd 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -596,6 +596,39 @@ void tst_QWebEnginePage::acceptNavigationRequestNavigationType() << QWebEnginePage::NavigationTypeReload << QWebEnginePage::NavigationTypeTyped << QWebEnginePage::NavigationTypeRedirect; + + // client side redirect + page.load(QUrl("qrc:///resources/redirect.html")); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 8, 20000); + QTRY_COMPARE(page.navigations.count(), 8); + expectedList += { QWebEnginePage::NavigationTypeTyped, QWebEnginePage::NavigationTypeRedirect }; + + // server side redirect + HttpServer server; + server.setResourceDirs({ ":/resources" }); + connect(&server, &HttpServer::newRequest, &server, [&] (HttpReqRep *r) { + if (r->requestMethod() == "GET") { + if (r->requestPath() == "/redirect1.html") { + r->setResponseHeader("Location", server.url("/redirect2.html").toEncoded()); + r->setResponseBody("Redirect1"); + r->sendResponse(307); // Internal server redirect + } else if (r->requestPath() == "/redirect2.html") { + r->setResponseHeader("Location", server.url("/content.html").toEncoded()); + r->setResponseBody("Redirect2"); + r->sendResponse(301); // Moved permanently + } + } + }); + QVERIFY(server.start()); + page.load(QUrl(server.url("/redirect1.html"))); + QTRY_COMPARE_WITH_TIMEOUT(loadSpy.count(), 9, 20000); + QTRY_COMPARE(page.navigations.count(), 11); + expectedList += { + QWebEnginePage::NavigationTypeTyped, + QWebEnginePage::NavigationTypeRedirect, + QWebEnginePage::NavigationTypeRedirect + }; + QVERIFY(expectedList.count() == page.navigations.count()); for (int i = 0; i < expectedList.count(); ++i) { QCOMPARE(page.navigations[i].type, expectedList[i]); diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc index 013a307de..3480341e8 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.qrc @@ -14,6 +14,7 @@ resources/user.css resources/image.png resources/pasteimage.html + resources/redirect.html resources/reload.html resources/style.css resources/test1.html -- cgit v1.2.3