Commit 49a51546 authored by Gauthier Ambard's avatar Gauthier Ambard Committed by Commit Bot

[iOS] Update UserAgent when reloading the page

When the page is reloaded, if the User Agent type used to reload the
page is different from the one used during the original load, the item
should be updated to take it into account.

Fixed: 1101774
Change-Id: I45e3812992adee067acfc348f1de745b664c81f1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2283753
Commit-Queue: Gauthier Ambard <gambard@chromium.org>
Reviewed-by: default avatarAli Juma <ajuma@chromium.org>
Cr-Commit-Position: refs/heads/master@{#792589}
parent 3ecb0597
...@@ -558,6 +558,7 @@ test("ios_web_inttests") { ...@@ -558,6 +558,7 @@ test("ios_web_inttests") {
"browser_state_web_view_partition_inttest.mm", "browser_state_web_view_partition_inttest.mm",
"cookie_blocking_inttest.mm", "cookie_blocking_inttest.mm",
"find_in_page/find_in_page_manager_inttest.mm", "find_in_page/find_in_page_manager_inttest.mm",
"navigation/crw_wk_navigation_handler_inttest.mm",
"navigation/error_page_helper_inttest.mm", "navigation/error_page_helper_inttest.mm",
"navigation/history_state_operations_inttest.mm", "navigation/history_state_operations_inttest.mm",
"navigation/meta_tag_inttest.mm", "navigation/meta_tag_inttest.mm",
......
...@@ -154,6 +154,19 @@ void ReportOutOfSyncURLInDidStartProvisionalNavigation( ...@@ -154,6 +154,19 @@ void ReportOutOfSyncURLInDidStartProvisionalNavigation(
self.webStateImpl->SetUserAgent(userAgentType); self.webStateImpl->SetUserAgent(userAgentType);
} }
if (navigationAction.navigationType == WKNavigationTypeReload &&
userAgentType != web::UserAgentType::NONE &&
web::wk_navigation_util::URLNeedsUserAgentType(
net::GURLWithNSURL(navigationAction.request.URL))) {
// When reloading the page, the UserAgent will be updated to the one for the
// new page.
web::NavigationItem* item = [[CRWNavigationItemHolder
holderForBackForwardListItem:webView.backForwardList.currentItem]
navigationItem];
if (item)
item->SetUserAgentType(userAgentType);
}
if (userAgentType != web::UserAgentType::NONE) { if (userAgentType != web::UserAgentType::NONE) {
NSString* userAgentString = base::SysUTF8ToNSString( NSString* userAgentString = base::SysUTF8ToNSString(
web::GetWebClient()->GetUserAgent(userAgentType)); web::GetWebClient()->GetUserAgent(userAgentType));
...@@ -197,6 +210,19 @@ void ReportOutOfSyncURLInDidStartProvisionalNavigation( ...@@ -197,6 +210,19 @@ void ReportOutOfSyncURLInDidStartProvisionalNavigation(
self.webStateImpl->SetUserAgent(userAgentType); self.webStateImpl->SetUserAgent(userAgentType);
} }
if (action.navigationType == WKNavigationTypeReload &&
userAgentType != web::UserAgentType::NONE &&
web::wk_navigation_util::URLNeedsUserAgentType(
net::GURLWithNSURL(action.request.URL))) {
// When reloading the page, the UserAgent will be updated to the one for
// the new page.
web::NavigationItem* item = [[CRWNavigationItemHolder
holderForBackForwardListItem:webView.backForwardList.currentItem]
navigationItem];
if (item)
item->SetUserAgentType(userAgentType);
}
if (userAgentType != web::UserAgentType::NONE) { if (userAgentType != web::UserAgentType::NONE) {
NSString* userAgentString = base::SysUTF8ToNSString( NSString* userAgentString = base::SysUTF8ToNSString(
web::GetWebClient()->GetUserAgent(userAgentType)); web::GetWebClient()->GetUserAgent(userAgentType));
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#import "ios/web/navigation/crw_wk_navigation_handler.h"
#import "base/test/ios/wait_util.h"
#include "base/test/scoped_feature_list.h"
#include "ios/web/common/features.h"
#import "ios/web/public/navigation/navigation_item.h"
#import "ios/web/public/test/fakes/test_web_client.h"
#import "ios/web/test/web_int_test.h"
#include "net/test/embedded_test_server/default_handlers.h"
#include "net/test/embedded_test_server/embedded_test_server.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
namespace {} // namespace
namespace web {
class CRWKNavigationHandlerIntTest : public WebIntTest {
protected:
CRWKNavigationHandlerIntTest() {
net::test_server::RegisterDefaultHandlers(&server_);
}
void SetUp() override {
scoped_feature_list_.InitWithFeatures(
{features::kUseDefaultUserAgentInWebClient}, {});
WebIntTest::SetUp();
}
TestWebClient* GetWebClient() override {
return static_cast<TestWebClient*>(WebIntTest::GetWebClient());
}
base::test::ScopedFeatureList scoped_feature_list_;
net::test_server::EmbeddedTestServer server_;
};
// Tests that reloading a page with a different default User Agent updates the
// item.
TEST_F(CRWKNavigationHandlerIntTest, ReloadWithDifferentUserAgent) {
if (@available(iOS 13, *)) {
} else {
return;
}
TestWebClient* web_client = GetWebClient();
web_client->SetDefaultUserAgent(UserAgentType::MOBILE);
ASSERT_TRUE(server_.Start());
GURL url(server_.GetURL("/echo"));
ASSERT_TRUE(LoadUrl(url));
NavigationItem* item = web_state()->GetNavigationManager()->GetVisibleItem();
EXPECT_EQ(UserAgentType::MOBILE, item->GetUserAgentType());
web_client->SetDefaultUserAgent(UserAgentType::DESKTOP);
web_state()->GetNavigationManager()->Reload(ReloadType::NORMAL,
/* check_for_repost = */ true);
EXPECT_TRUE(base::test::ios::WaitUntilConditionOrTimeout(
base::test::ios::kWaitForPageLoadTimeout, ^{
NavigationItem* item_after_reload =
web_state()->GetNavigationManager()->GetVisibleItem();
return item_after_reload->GetUserAgentType() == UserAgentType::DESKTOP;
}));
}
} // namespace web
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment