Chromium Code Reviews| 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..a22855645e1d3ca90afd4586ea30adb5957d7102 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->GetPendingItem(); |
|
Eugene But (OOO till 7-30)
2017/04/11 02:11:56
Should this be GetVisibleItem instead? Pending url
liaoyuke
2017/04/11 18:27:20
Good catch!
|
| + 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); |
| } |