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 700 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
711 // TODO(stuartmorgan): Move the pushState/replaceState logic into | 711 // TODO(stuartmorgan): Move the pushState/replaceState logic into |
712 // NavigationManager. | 712 // NavigationManager. |
713 - (void)pushStateWithPageURL:(const GURL&)pageURL | 713 - (void)pushStateWithPageURL:(const GURL&)pageURL |
714 stateObject:(NSString*)stateObject | 714 stateObject:(NSString*)stateObject |
715 transition:(ui::PageTransition)transition; | 715 transition:(ui::PageTransition)transition; |
716 // Assigns the given URL and state object to the current CRWSessionEntry. | 716 // Assigns the given URL and state object to the current CRWSessionEntry. |
717 - (void)replaceStateWithPageURL:(const GURL&)pageUrl | 717 - (void)replaceStateWithPageURL:(const GURL&)pageUrl |
718 stateObject:(NSString*)stateObject; | 718 stateObject:(NSString*)stateObject; |
719 // Sets _documentURL to newURL, and updates any relevant state information. | 719 // Sets _documentURL to newURL, and updates any relevant state information. |
720 - (void)setDocumentURL:(const GURL&)newURL; | 720 - (void)setDocumentURL:(const GURL&)newURL; |
| 721 // Sets WKWebView's title to the last committed navigation item. |
| 722 - (void)updateNavigationItemTitle; |
721 // Returns YES if the current navigation item corresponds to a web page | 723 // Returns YES if the current navigation item corresponds to a web page |
722 // loaded by a POST request. | 724 // loaded by a POST request. |
723 - (BOOL)isCurrentNavigationItemPOST; | 725 - (BOOL)isCurrentNavigationItemPOST; |
724 // Returns YES if current navigation item is WKNavigationTypeBackForward. | 726 // Returns YES if current navigation item is WKNavigationTypeBackForward. |
725 - (BOOL)isCurrentNavigationBackForward; | 727 - (BOOL)isCurrentNavigationBackForward; |
726 // Returns whether the given navigation is triggered by a user link click. | 728 // Returns whether the given navigation is triggered by a user link click. |
727 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType; | 729 - (BOOL)isLinkNavigation:(WKNavigationType)navigationType; |
728 | 730 |
729 // Inject windowID if not yet injected. | 731 // Inject windowID if not yet injected. |
730 - (void)injectWindowID; | 732 - (void)injectWindowID; |
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1372 [self didUpdateHistoryStateWithPageURL:pageUrl]; | 1374 [self didUpdateHistoryStateWithPageURL:pageUrl]; |
1373 } | 1375 } |
1374 | 1376 |
1375 - (void)setDocumentURL:(const GURL&)newURL { | 1377 - (void)setDocumentURL:(const GURL&)newURL { |
1376 if (newURL != _documentURL && newURL.is_valid()) { | 1378 if (newURL != _documentURL && newURL.is_valid()) { |
1377 _documentURL = newURL; | 1379 _documentURL = newURL; |
1378 _interactionRegisteredSinceLastURLChange = NO; | 1380 _interactionRegisteredSinceLastURLChange = NO; |
1379 } | 1381 } |
1380 } | 1382 } |
1381 | 1383 |
| 1384 - (void)updateNavigationItemTitle { |
| 1385 NSString* webViewTitle = [_webView title]; |
| 1386 DCHECK(webViewTitle); |
| 1387 auto& navigationManager = _webStateImpl->GetNavigationManagerImpl(); |
| 1388 web::NavigationItem* item = navigationManager.GetLastCommittedItem(); |
| 1389 if (!item) |
| 1390 return; |
| 1391 |
| 1392 base::string16 newTitle = base::SysNSStringToUTF16(webViewTitle); |
| 1393 if (item->GetTitle() == newTitle) |
| 1394 return; |
| 1395 |
| 1396 item->SetTitle(newTitle); |
| 1397 // TODO(crbug.com/546218): See if this can be removed; it's not clear that |
| 1398 // other platforms send this (tab sync triggers need to be compared against |
| 1399 // upstream). |
| 1400 navigationManager.OnNavigationItemChanged(); |
| 1401 |
| 1402 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) { |
| 1403 [_delegate webController:self titleDidChange:webViewTitle]; |
| 1404 } |
| 1405 } |
| 1406 |
1382 - (BOOL)isCurrentNavigationItemPOST { | 1407 - (BOOL)isCurrentNavigationItemPOST { |
1383 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods | 1408 // |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods |
1384 // were not called. | 1409 // were not called. |
1385 NSString* HTTPMethod = | 1410 NSString* HTTPMethod = |
1386 _pendingNavigationInfo | 1411 _pendingNavigationInfo |
1387 ? [_pendingNavigationInfo HTTPMethod] | 1412 ? [_pendingNavigationInfo HTTPMethod] |
1388 : [self currentBackForwardListItemHolder]->http_method(); | 1413 : [self currentBackForwardListItemHolder]->http_method(); |
1389 return [HTTPMethod isEqual:@"POST"]; | 1414 return [HTTPMethod isEqual:@"POST"]; |
1390 } | 1415 } |
1391 | 1416 |
(...skipping 3355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4747 } | 4772 } |
4748 | 4773 |
4749 - (void)webView:(WKWebView*)webView | 4774 - (void)webView:(WKWebView*)webView |
4750 didCommitNavigation:(WKNavigation*)navigation { | 4775 didCommitNavigation:(WKNavigation*)navigation { |
4751 [_navigationStates setState:web::WKNavigationState::COMMITTED | 4776 [_navigationStates setState:web::WKNavigationState::COMMITTED |
4752 forNavigation:navigation]; | 4777 forNavigation:navigation]; |
4753 | 4778 |
4754 DCHECK_EQ(_webView, webView); | 4779 DCHECK_EQ(_webView, webView); |
4755 _certVerificationErrors->Clear(); | 4780 _certVerificationErrors->Clear(); |
4756 | 4781 |
4757 // This is the point where the document's URL has actually changed, and | 4782 // This is the point where the document's URL and title have actually changed, |
4758 // pending navigation information should be applied to state information. | 4783 // and pending navigation information should be applied to state information. |
4759 [self setDocumentURL:net::GURLWithNSURL([_webView URL])]; | 4784 [self setDocumentURL:net::GURLWithNSURL([_webView URL])]; |
| 4785 [self updateNavigationItemTitle]; |
4760 | 4786 |
4761 if (!_lastRegisteredRequestURL.is_valid() && | 4787 if (!_lastRegisteredRequestURL.is_valid() && |
4762 _documentURL != _lastRegisteredRequestURL) { | 4788 _documentURL != _lastRegisteredRequestURL) { |
4763 // if |_lastRegisteredRequestURL| is an invalid URL, then |_documentURL| | 4789 // if |_lastRegisteredRequestURL| is an invalid URL, then |_documentURL| |
4764 // will be "about:blank". | 4790 // will be "about:blank". |
4765 [[self sessionController] updatePendingItem:_documentURL]; | 4791 [[self sessionController] updatePendingItem:_documentURL]; |
4766 } | 4792 } |
4767 DCHECK(_documentURL == _lastRegisteredRequestURL || | 4793 DCHECK(_documentURL == _lastRegisteredRequestURL || |
4768 (!_lastRegisteredRequestURL.is_valid() && | 4794 (!_lastRegisteredRequestURL.is_valid() && |
4769 _documentURL.spec() == url::kAboutBlankURL)); | 4795 _documentURL.spec() == url::kAboutBlankURL)); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4987 } | 5013 } |
4988 | 5014 |
4989 - (void)webViewTitleDidChange { | 5015 - (void)webViewTitleDidChange { |
4990 // WKWebView's title becomes empty when the web process dies; ignore that | 5016 // WKWebView's title becomes empty when the web process dies; ignore that |
4991 // update. | 5017 // update. |
4992 if (_webProcessIsDead) { | 5018 if (_webProcessIsDead) { |
4993 DCHECK_EQ([_webView title].length, 0U); | 5019 DCHECK_EQ([_webView title].length, 0U); |
4994 return; | 5020 return; |
4995 } | 5021 } |
4996 | 5022 |
4997 if ([self.delegate | 5023 bool hasPendingNavigation = web::WKNavigationState::COMMITTED <= |
4998 respondsToSelector:@selector(webController:titleDidChange:)]) { | 5024 [_navigationStates lastAddedNavigationState]; |
4999 DCHECK([_webView title]); | 5025 if (hasPendingNavigation) { |
5000 [self.delegate webController:self titleDidChange:[_webView title]]; | 5026 // Do not update the title if there is a navigation in progress because |
| 5027 // there is no way to tell if KVO change fired for new or previous page. |
| 5028 [self updateNavigationItemTitle]; |
5001 } | 5029 } |
5002 } | 5030 } |
5003 | 5031 |
5004 - (void)webViewURLDidChange { | 5032 - (void)webViewURLDidChange { |
5005 // TODO(stuartmorgan): Determine if there are any cases where this still | 5033 // TODO(stuartmorgan): Determine if there are any cases where this still |
5006 // happens, and if so whether anything should be done when it does. | 5034 // happens, and if so whether anything should be done when it does. |
5007 if (![_webView URL]) { | 5035 if (![_webView URL]) { |
5008 DVLOG(1) << "Received nil URL callback"; | 5036 DVLOG(1) << "Received nil URL callback"; |
5009 return; | 5037 return; |
5010 } | 5038 } |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5323 } | 5351 } |
5324 | 5352 |
5325 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 5353 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
5326 } | 5354 } |
5327 | 5355 |
5328 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { | 5356 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { |
5329 return [action.request valueForHTTPHeaderField:@"Referer"]; | 5357 return [action.request valueForHTTPHeaderField:@"Referer"]; |
5330 } | 5358 } |
5331 | 5359 |
5332 @end | 5360 @end |
OLD | NEW |