Chromium Code Reviews| Index: ios/web/web_state/ui/crw_web_controller.mm |
| diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm |
| index 4d87b2c3da8df85af85d482cbd6a74a833044682..e90658afbe79f6af60186778fa8f9b5b3279a1b6 100644 |
| --- a/ios/web/web_state/ui/crw_web_controller.mm |
| +++ b/ios/web/web_state/ui/crw_web_controller.mm |
| @@ -459,8 +459,10 @@ @interface CRWWebController ()<CRWContextMenuDelegate, |
| // Returns YES if the user interacted with the page recently. |
| @property(nonatomic, readonly) BOOL userClickedRecently; |
| -// Whether or not desktop user agent is used for the currentItem. |
| -@property(nonatomic, readonly) BOOL usesDesktopUserAgent; |
| +// User agent type of the transient item if any, the pending item if a |
| +// navigation is in progress or the last committed item otherwise. |
| +// Returns MOBILE, the default type, if navigation manager is nullptr or empty. |
| +@property(nonatomic, readonly) web::UserAgentType userAgentType; |
| // Facade for Mojo API. |
| @property(nonatomic, readonly) web::MojoFacade* mojoFacade; |
| @@ -477,10 +479,18 @@ @interface CRWWebController ()<CRWContextMenuDelegate, |
| // unless the request was a POST. |
| @property(nonatomic, readonly) NSDictionary* currentHTTPHeaders; |
| -// Requires page reconstruction if |item| has a non-NONE UserAgentType and it |
| -// differs from that of |fromItem|. |
| -- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item |
| - previousUserAgentType:(web::UserAgentType)userAgentType; |
| +// Updates the user agent used to make HTTP request when navigating from |
| +// |fromItem| to |toItem|. |toItem| must not be nullptr. |
| +- (void)updateWebViewUserAgentFromItem:(web::NavigationItem*)fromItem |
| + toItem:(web::NavigationItem*)toItem; |
| + |
| +// Requires that the next load rebuild the UIWebView. This is expensive, and |
|
kkhorimoto
2017/04/12 19:42:28
s/UIWebView/WKWebView.
liaoyuke
2017/04/12 22:45:33
maybe web view?
|
| +// should be used only in the case where something has changed that UIWebView |
| +// only checks on creation, such that the whole object needs to be rebuilt. |
| +// TODO(stuartmorgan): Merge this and reinitializeWebViewAndReload:. They are |
| +// currently subtly different in terms of implementation, but are for |
| +// fundamentally the same purpose. |
| +- (void)requirePageReconstruction; |
| // Removes the container view from the hierarchy and resets the ivar. |
| - (void)resetContainerView; |
| @@ -1616,6 +1626,10 @@ - (void)loadCurrentURLInWebView { |
| [self ensureWebViewCreated]; |
| + NSString* userAgent = base::SysUTF8ToNSString( |
|
kkhorimoto
2017/04/12 19:42:27
Can we check whether the current NavigationItem ha
liaoyuke
2017/04/12 22:45:33
How about we directly compare web view's current c
|
| + web::GetWebClient()->GetUserAgent(self.userAgentType)); |
| + [_webView setCustomUserAgent:userAgent]; |
| + |
| [self loadRequestForCurrentNavigationItem]; |
| } |
| @@ -2026,15 +2040,11 @@ - (void)goToItemAtIndex:(int)index { |
| // Update the user agent before attempting the navigation. |
| web::NavigationItem* toItem = items[index].get(); |
| - web::NavigationItem* previousItem = sessionController.currentItem; |
| - web::UserAgentType previousUserAgentType = |
| - previousItem ? previousItem->GetUserAgentType() |
| - : web::UserAgentType::NONE; |
| - [self updateDesktopUserAgentForItem:toItem |
| - previousUserAgentType:previousUserAgentType]; |
| + web::NavigationItem* fromItem = sessionController.currentItem; |
| + [self updateWebViewUserAgentFromItem:fromItem toItem:toItem]; |
| BOOL sameDocumentNavigation = |
| - [sessionController isSameDocumentNavigationBetweenItem:previousItem |
| + [sessionController isSameDocumentNavigationBetweenItem:fromItem |
| andItem:toItem]; |
| if (sameDocumentNavigation) { |
| [sessionController goToItemAtIndex:index]; |
| @@ -2189,9 +2199,9 @@ - (BOOL)shouldClosePageOnNativeApplicationLoad { |
| return rendererInitiatedWithoutInteraction || noNavigationItems; |
| } |
| -- (BOOL)usesDesktopUserAgent { |
| +- (web::UserAgentType)userAgentType { |
| web::NavigationItem* item = self.currentNavItem; |
| - return item && item->GetUserAgentType() == web::UserAgentType::DESKTOP; |
| + return item ? item->GetUserAgentType() : web::UserAgentType::MOBILE; |
| } |
| - (web::MojoFacade*)mojoFacade { |
| @@ -2230,15 +2240,19 @@ - (CRWPassKitDownloader*)passKitDownloader { |
| return _passKitDownloader.get(); |
| } |
| -- (void)updateDesktopUserAgentForItem:(web::NavigationItem*)item |
| - previousUserAgentType:(web::UserAgentType)userAgentType { |
| - if (!item) |
| - return; |
| - web::UserAgentType itemUserAgentType = item->GetUserAgentType(); |
| - if (itemUserAgentType == web::UserAgentType::NONE) |
| +- (void)updateWebViewUserAgentFromItem:(web::NavigationItem*)fromItem |
| + toItem:(web::NavigationItem*)toItem { |
| + DCHECK(toItem); |
| + |
| + web::UserAgentType toUserAgentType = toItem->GetUserAgentType(); |
| + if (toUserAgentType == web::UserAgentType::NONE) |
| return; |
| - if (itemUserAgentType != userAgentType) |
| - [self requirePageReconstruction]; |
| + |
| + if (!fromItem || fromItem->GetUserAgentType() != toUserAgentType) { |
| + NSString* toUserAgent = base::SysUTF8ToNSString( |
| + web::GetWebClient()->GetUserAgent(toUserAgentType)); |
| + [_webView setCustomUserAgent:toUserAgent]; |
| + } |
| } |
| #pragma mark - |
| @@ -4040,7 +4054,7 @@ - (WKWebView*)webViewWithConfiguration:(WKWebViewConfiguration*)config { |
| // delegate must be specified. |
| return web::BuildWKWebView(CGRectZero, config, |
| self.webStateImpl->GetBrowserState(), |
| - self.usesDesktopUserAgent); |
| + self.userAgentType); |
| } |
| - (void)setWebView:(WKWebView*)webView { |