| Index: ios/chrome/browser/tabs/tab.mm
|
| diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
|
| index 3b94a7e5f17d072ce6a37b4b3b194c18548b963c..29e6c97cf7639d70992406f2fda3314575ef1aa7 100644
|
| --- a/ios/chrome/browser/tabs/tab.mm
|
| +++ b/ios/chrome/browser/tabs/tab.mm
|
| @@ -198,6 +198,15 @@ bool IsApplicationStateNotActive(UIApplicationState state) {
|
| state == UIApplicationStateInactive);
|
| }
|
|
|
| +// Returns true if |item| is the result of a HTTP redirect.
|
| +// Returns false if |item| is nullptr;
|
| +bool IsItemRedirectItem(web::NavigationItem* item) {
|
| + if (!item)
|
| + return false;
|
| +
|
| + return (ui::PageTransition::PAGE_TRANSITION_IS_REDIRECT_MASK &
|
| + item->GetTransitionType()) == 0;
|
| +}
|
| } // namespace
|
|
|
| @interface Tab ()<CRWWebStateObserver,
|
| @@ -1358,7 +1367,7 @@ - (BOOL)usesDesktopUserAgent {
|
| visibleItem->GetUserAgentType() == web::UserAgentType::DESKTOP;
|
| }
|
|
|
| -- (void)reloadForDesktopUserAgent {
|
| +- (void)reloadWithUserAgentType:(web::UserAgentType)userAgentType {
|
| // This removes the web view, which will be recreated at the end of this.
|
| [self.webController requirePageReconstruction];
|
|
|
| @@ -1367,25 +1376,41 @@ - (void)reloadForDesktopUserAgent {
|
| // navigation from new navigations.
|
| web::NavigationManager* navigationManager = [self navigationManager];
|
| DCHECK(navigationManager);
|
| - web::NavigationItem* lastNonRedirectedItem =
|
| - GetLastCommittedNonRedirectedItem(navigationManager);
|
| - if (!lastNonRedirectedItem)
|
| +
|
| + web::NavigationItem* lastNonRedirectItem =
|
| + navigationManager->GetTransientItem();
|
| + if (!lastNonRedirectItem || IsItemRedirectItem(lastNonRedirectItem))
|
| + lastNonRedirectItem = navigationManager->GetVisibleItem();
|
| + if (!lastNonRedirectItem || IsItemRedirectItem(lastNonRedirectItem))
|
| + lastNonRedirectItem = GetLastCommittedNonRedirectedItem(navigationManager);
|
| +
|
| + if (!lastNonRedirectItem)
|
| return;
|
|
|
| // |reloadURL| will be empty if a page was open by DOM.
|
| - GURL reloadURL(lastNonRedirectedItem->GetOriginalRequestURL());
|
| + GURL reloadURL(lastNonRedirectItem->GetOriginalRequestURL());
|
| if (reloadURL.is_empty()) {
|
| DCHECK(self.webState && self.webState->HasOpener());
|
| - reloadURL = lastNonRedirectedItem->GetVirtualURL();
|
| + reloadURL = lastNonRedirectItem->GetVirtualURL();
|
| }
|
|
|
| web::NavigationManager::WebLoadParams params(reloadURL);
|
| - params.referrer = lastNonRedirectedItem->GetReferrer();
|
| - // A new navigation is needed here for reloading with desktop User-Agent.
|
| - params.user_agent_override_option =
|
| - web::NavigationManager::UserAgentOverrideOption::DESKTOP;
|
| - params.transition_type =
|
| - ui::PageTransitionFromInt(ui::PAGE_TRANSITION_FORM_SUBMIT);
|
| + params.referrer = lastNonRedirectItem->GetReferrer();
|
| + params.transition_type = ui::PAGE_TRANSITION_RELOAD;
|
| +
|
| + switch (userAgentType) {
|
| + case web::UserAgentType::DESKTOP:
|
| + params.user_agent_override_option =
|
| + web::NavigationManager::UserAgentOverrideOption::DESKTOP;
|
| + break;
|
| + case web::UserAgentType::MOBILE:
|
| + params.user_agent_override_option =
|
| + web::NavigationManager::UserAgentOverrideOption::MOBILE;
|
| + break;
|
| + case web::UserAgentType::NONE:
|
| + NOTREACHED();
|
| + }
|
| +
|
| navigationManager->LoadURLWithParams(params);
|
| }
|
|
|
|
|