| OLD | NEW |
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ios/web/web_state/ui/crw_web_controller.h" | 5 #import "ios/web/web_state/ui/crw_web_controller.h" |
| 6 | 6 |
| 7 #import <WebKit/WebKit.h> | 7 #import <WebKit/WebKit.h> |
| 8 | 8 |
| 9 #import <objc/runtime.h> | 9 #import <objc/runtime.h> |
| 10 #include <stddef.h> | 10 #include <stddef.h> |
| (...skipping 721 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 // TODO(stuartmorgan): Move the pushState/replaceState logic into | 732 // TODO(stuartmorgan): Move the pushState/replaceState logic into |
| 733 // NavigationManager. | 733 // NavigationManager. |
| 734 - (void)pushStateWithPageURL:(const GURL&)pageURL | 734 - (void)pushStateWithPageURL:(const GURL&)pageURL |
| 735 stateObject:(NSString*)stateObject | 735 stateObject:(NSString*)stateObject |
| 736 transition:(ui::PageTransition)transition; | 736 transition:(ui::PageTransition)transition; |
| 737 // Assigns the given URL and state object to the current CRWSessionEntry. | 737 // Assigns the given URL and state object to the current CRWSessionEntry. |
| 738 - (void)replaceStateWithPageURL:(const GURL&)pageUrl | 738 - (void)replaceStateWithPageURL:(const GURL&)pageUrl |
| 739 stateObject:(NSString*)stateObject; | 739 stateObject:(NSString*)stateObject; |
| 740 // Sets _documentURL to newURL, and updates any relevant state information. | 740 // Sets _documentURL to newURL, and updates any relevant state information. |
| 741 - (void)setDocumentURL:(const GURL&)newURL; | 741 - (void)setDocumentURL:(const GURL&)newURL; |
| 742 // Sets WKWebView's title to the last committed navigation item. | 742 // Sets last committed NavigationItem's title to the given |title|, which can |
| 743 - (void)updateNavigationItemTitle; | 743 // not be nil. |
| 744 - (void)setNavigationItemTitle:(NSString*)title; |
| 744 // Returns YES if the current navigation item corresponds to a web page | 745 // Returns YES if the current navigation item corresponds to a web page |
| 745 // loaded by a POST request. | 746 // loaded by a POST request. |
| 746 - (BOOL)isCurrentNavigationItemPOST; | 747 - (BOOL)isCurrentNavigationItemPOST; |
| 747 // Returns YES if current navigation item is WKNavigationTypeBackForward. | 748 // Returns YES if current navigation item is WKNavigationTypeBackForward. |
| 748 - (BOOL)isCurrentNavigationBackForward; | 749 - (BOOL)isCurrentNavigationBackForward; |
| 749 // Returns whether the given navigation is triggered by a user link click. | 750 // Returns whether the given navigation is triggered by a user link click. |
| 750 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType; | 751 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType; |
| 751 | 752 |
| 752 // Inject windowID if not yet injected. | 753 // Inject windowID if not yet injected. |
| 753 - (void)injectWindowID; | 754 - (void)injectWindowID; |
| (...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1416 [self didUpdateHistoryStateWithPageURL:pageUrl]; | 1417 [self didUpdateHistoryStateWithPageURL:pageUrl]; |
| 1417 } | 1418 } |
| 1418 | 1419 |
| 1419 - (void)setDocumentURL:(const GURL&)newURL { | 1420 - (void)setDocumentURL:(const GURL&)newURL { |
| 1420 if (newURL != _documentURL && newURL.is_valid()) { | 1421 if (newURL != _documentURL && newURL.is_valid()) { |
| 1421 _documentURL = newURL; | 1422 _documentURL = newURL; |
| 1422 _interactionRegisteredSinceLastURLChange = NO; | 1423 _interactionRegisteredSinceLastURLChange = NO; |
| 1423 } | 1424 } |
| 1424 } | 1425 } |
| 1425 | 1426 |
| 1426 - (void)updateNavigationItemTitle { | 1427 - (void)setNavigationItemTitle:(NSString*)title { |
| 1427 NSString* webViewTitle = [_webView title]; | 1428 DCHECK(title); |
| 1428 DCHECK(webViewTitle); | |
| 1429 auto& navigationManager = _webStateImpl->GetNavigationManagerImpl(); | 1429 auto& navigationManager = _webStateImpl->GetNavigationManagerImpl(); |
| 1430 web::NavigationItem* item = navigationManager.GetLastCommittedItem(); | 1430 web::NavigationItem* item = navigationManager.GetLastCommittedItem(); |
| 1431 if (!item) | 1431 if (!item) |
| 1432 return; | 1432 return; |
| 1433 | 1433 |
| 1434 base::string16 newTitle = base::SysNSStringToUTF16(webViewTitle); | 1434 base::string16 newTitle = base::SysNSStringToUTF16(title); |
| 1435 if (item->GetTitle() == newTitle) | 1435 if (item->GetTitle() == newTitle) |
| 1436 return; | 1436 return; |
| 1437 | 1437 |
| 1438 item->SetTitle(newTitle); | 1438 item->SetTitle(newTitle); |
| 1439 // TODO(crbug.com/546218): See if this can be removed; it's not clear that | 1439 // TODO(crbug.com/546218): See if this can be removed; it's not clear that |
| 1440 // other platforms send this (tab sync triggers need to be compared against | 1440 // other platforms send this (tab sync triggers need to be compared against |
| 1441 // upstream). | 1441 // upstream). |
| 1442 navigationManager.OnNavigationItemChanged(); | 1442 navigationManager.OnNavigationItemChanged(); |
| 1443 | 1443 |
| 1444 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { | 1444 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { |
| 1445 [_delegate webController:self titleDidChange:webViewTitle]; | 1445 [_delegate webController:self titleDidChange:title]; |
| 1446 } | 1446 } |
| 1447 } | 1447 } |
| 1448 | 1448 |
| 1449 - (BOOL)isCurrentNavigationItemPOST { | 1449 - (BOOL)isCurrentNavigationItemPOST { |
| 1450 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods | 1450 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods |
| 1451 // were not called. | 1451 // were not called. |
| 1452 NSString* HTTPMethod = | 1452 NSString* HTTPMethod = |
| 1453 _pendingNavigationInfo | 1453 _pendingNavigationInfo |
| 1454 ? [_pendingNavigationInfo HTTPMethod] | 1454 ? [_pendingNavigationInfo HTTPMethod] |
| 1455 : [self currentBackForwardListItemHolder]->http_method(); | 1455 : [self currentBackForwardListItemHolder]->http_method(); |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1863 } | 1863 } |
| 1864 | 1864 |
| 1865 - (void)loadNativeViewWithSuccess:(BOOL)loadSuccess { | 1865 - (void)loadNativeViewWithSuccess:(BOOL)loadSuccess { |
| 1866 const GURL currentURL([self currentURL]); | 1866 const GURL currentURL([self currentURL]); |
| 1867 [self didStartLoadingURL:currentURL updateHistory:loadSuccess]; | 1867 [self didStartLoadingURL:currentURL updateHistory:loadSuccess]; |
| 1868 _loadPhase = web::PAGE_LOADED; | 1868 _loadPhase = web::PAGE_LOADED; |
| 1869 | 1869 |
| 1870 // Perform post-load-finished updates. | 1870 // Perform post-load-finished updates. |
| 1871 [self didFinishWithURL:currentURL loadSuccess:loadSuccess]; | 1871 [self didFinishWithURL:currentURL loadSuccess:loadSuccess]; |
| 1872 | 1872 |
| 1873 // Inform the embedder the title changed. | 1873 NSString* title = [self.nativeController title]; |
| 1874 if (title) |
| 1875 [self setNavigationItemTitle:title]; |
| 1876 |
| 1877 // If the controller handles title change notification, route those to the |
| 1878 // delegate. |
| 1874 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { | 1879 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { |
| 1875 NSString* title = [self.nativeController title]; | |
| 1876 // If a title is present, notify the delegate. | |
| 1877 if (title) | |
| 1878 [_delegate webController:self titleDidChange:title]; | |
| 1879 // If the controller handles title change notification, route those to the | |
| 1880 // delegate. | |
| 1881 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { | 1880 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { |
| 1882 [self.nativeController setDelegate:self]; | 1881 [self.nativeController setDelegate:self]; |
| 1883 } | 1882 } |
| 1884 } | 1883 } |
| 1885 } | 1884 } |
| 1886 | 1885 |
| 1887 - (void)loadErrorInNativeView:(NSError*)error { | 1886 - (void)loadErrorInNativeView:(NSError*)error { |
| 1888 [self removeWebViewAllowingCachedReconstruction:NO]; | 1887 [self removeWebViewAllowingCachedReconstruction:NO]; |
| 1889 web::NavigationItem* item = [self currentNavItem]; | 1888 web::NavigationItem* item = [self currentNavItem]; |
| 1890 const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); | 1889 const GURL currentURL = item ? item->GetVirtualURL() : GURL::EmptyGURL(); |
| (...skipping 3084 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4975 didCommitNavigation:(WKNavigation*)navigation { | 4974 didCommitNavigation:(WKNavigation*)navigation { |
| 4976 [_navigationStates setState:web::WKNavigationState::COMMITTED | 4975 [_navigationStates setState:web::WKNavigationState::COMMITTED |
| 4977 forNavigation:navigation]; | 4976 forNavigation:navigation]; |
| 4978 | 4977 |
| 4979 DCHECK_EQ(_webView, webView); | 4978 DCHECK_EQ(_webView, webView); |
| 4980 _certVerificationErrors->Clear(); | 4979 _certVerificationErrors->Clear(); |
| 4981 | 4980 |
| 4982 // This is the point where the document's URL and title have actually changed, | 4981 // This is the point where the document's URL and title have actually changed, |
| 4983 // and pending navigation information should be applied to state information. | 4982 // and pending navigation information should be applied to state information. |
| 4984 [self setDocumentURL:net::GURLWithNSURL([_webView URL])]; | 4983 [self setDocumentURL:net::GURLWithNSURL([_webView URL])]; |
| 4985 [self updateNavigationItemTitle]; | |
| 4986 | 4984 |
| 4987 if (!_lastRegisteredRequestURL.is_valid() && | 4985 if (!_lastRegisteredRequestURL.is_valid() && |
| 4988 _documentURL != _lastRegisteredRequestURL) { | 4986 _documentURL != _lastRegisteredRequestURL) { |
| 4989 // if |_lastRegisteredRequestURL| is an invalid URL, then |_documentURL| | 4987 // if |_lastRegisteredRequestURL| is an invalid URL, then |_documentURL| |
| 4990 // will be "about:blank". | 4988 // will be "about:blank". |
| 4991 [[self sessionController] updatePendingEntry:_documentURL]; | 4989 [[self sessionController] updatePendingEntry:_documentURL]; |
| 4992 } | 4990 } |
| 4993 DCHECK(_documentURL == _lastRegisteredRequestURL || | 4991 DCHECK(_documentURL == _lastRegisteredRequestURL || |
| 4994 (!_lastRegisteredRequestURL.is_valid() && | 4992 (!_lastRegisteredRequestURL.is_valid() && |
| 4995 _documentURL.spec() == url::kAboutBlankURL)); | 4993 _documentURL.spec() == url::kAboutBlankURL)); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 5018 [self injectWindowID]; | 5016 [self injectWindowID]; |
| 5019 } | 5017 } |
| 5020 | 5018 |
| 5021 [self webPageChanged]; | 5019 [self webPageChanged]; |
| 5022 | 5020 |
| 5023 [self updateSSLStatusForCurrentNavigationItem]; | 5021 [self updateSSLStatusForCurrentNavigationItem]; |
| 5024 | 5022 |
| 5025 // Attempt to update the HTML5 history state. | 5023 // Attempt to update the HTML5 history state. |
| 5026 [self updateHTML5HistoryState]; | 5024 [self updateHTML5HistoryState]; |
| 5027 | 5025 |
| 5026 // This is the point where pending entry has been committed, and navigation |
| 5027 // item title should be updated. |
| 5028 [self setNavigationItemTitle:[_webView title]]; |
| 5029 |
| 5028 // Report cases where SSL cert is missing for a secure connection. | 5030 // Report cases where SSL cert is missing for a secure connection. |
| 5029 if (_documentURL.SchemeIsCryptographic()) { | 5031 if (_documentURL.SchemeIsCryptographic()) { |
| 5030 scoped_refptr<net::X509Certificate> cert = | 5032 scoped_refptr<net::X509Certificate> cert = |
| 5031 web::CreateCertFromChain([_webView certificateChain]); | 5033 web::CreateCertFromChain([_webView certificateChain]); |
| 5032 UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection", | 5034 UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection", |
| 5033 static_cast<bool>(cert)); | 5035 static_cast<bool>(cert)); |
| 5034 } | 5036 } |
| 5035 } | 5037 } |
| 5036 | 5038 |
| 5037 - (void)webView:(WKWebView*)webView | 5039 - (void)webView:(WKWebView*)webView |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5218 if (_webProcessIsDead) { | 5220 if (_webProcessIsDead) { |
| 5219 DCHECK_EQ([_webView title].length, 0U); | 5221 DCHECK_EQ([_webView title].length, 0U); |
| 5220 return; | 5222 return; |
| 5221 } | 5223 } |
| 5222 | 5224 |
| 5223 bool hasPendingNavigation = web::WKNavigationState::COMMITTED <= | 5225 bool hasPendingNavigation = web::WKNavigationState::COMMITTED <= |
| 5224 [_navigationStates lastAddedNavigationState]; | 5226 [_navigationStates lastAddedNavigationState]; |
| 5225 if (hasPendingNavigation) { | 5227 if (hasPendingNavigation) { |
| 5226 // Do not update the title if there is a navigation in progress because | 5228 // Do not update the title if there is a navigation in progress because |
| 5227 // there is no way to tell if KVO change fired for new or previous page. | 5229 // there is no way to tell if KVO change fired for new or previous page. |
| 5228 [self updateNavigationItemTitle]; | 5230 [self setNavigationItemTitle:[_webView title]]; |
| 5229 } | 5231 } |
| 5230 } | 5232 } |
| 5231 | 5233 |
| 5232 - (void)webViewURLDidChange { | 5234 - (void)webViewURLDidChange { |
| 5233 // TODO(stuartmorgan): Determine if there are any cases where this still | 5235 // TODO(stuartmorgan): Determine if there are any cases where this still |
| 5234 // happens, and if so whether anything should be done when it does. | 5236 // happens, and if so whether anything should be done when it does. |
| 5235 if (![_webView URL]) { | 5237 if (![_webView URL]) { |
| 5236 DVLOG(1) << "Received nil URL callback"; | 5238 DVLOG(1) << "Received nil URL callback"; |
| 5237 return; | 5239 return; |
| 5238 } | 5240 } |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5555 } | 5557 } |
| 5556 | 5558 |
| 5557 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 5559 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
| 5558 } | 5560 } |
| 5559 | 5561 |
| 5560 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { | 5562 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { |
| 5561 return [action.request valueForHTTPHeaderField:@"Referer"]; | 5563 return [action.request valueForHTTPHeaderField:@"Referer"]; |
| 5562 } | 5564 } |
| 5563 | 5565 |
| 5564 @end | 5566 @end |
| OLD | NEW |