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 11e7ec84f516155a4b10ffe4551765fae167d400..b32aa7e50b29a09dbff18855ef8f388d555525ae 100644 |
--- a/ios/web/web_state/ui/crw_web_controller.mm |
+++ b/ios/web/web_state/ui/crw_web_controller.mm |
@@ -269,6 +269,13 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
// YES if a user interaction has been registered at any time once the page has |
// loaded. |
BOOL _userInteractionRegistered; |
+ // YES if the user has interacted with the content area since the last URL |
+ // change. |
+ BOOL _interactionRegisteredSinceLastURLChange; |
+ // The actual URL of the document object (i.e., the last committed URL). |
+ // TODO(crbug.com/549616): Remove this in favor of just updating the |
+ // navigation manager and treating that as authoritative. |
+ GURL _documentURL; |
// Last URL change reported to webWill/DidStartLoadingURL. Used to detect page |
// location changes (client redirects) in practice. |
GURL _lastRegisteredRequestURL; |
@@ -467,6 +474,9 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
// controller's BrowserState. |
- (web::WKWebViewConfigurationProvider&)webViewConfigurationProvider; |
+// Returns the current URL of the web view, and sets |trustLevel| accordingly |
+// based on the confidence in the verification. |
+- (GURL)webURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel; |
// Returns |YES| if |url| should be loaded in a native view. |
- (BOOL)shouldLoadURLInNativeView:(const GURL&)url; |
// Loads the HTML into the page at the given URL. |
@@ -577,6 +587,8 @@ typedef void (^ViewportStateCompletion)(const web::PageViewportState*); |
// Assigns the given URL and state object to the current CRWSessionEntry. |
- (void)replaceStateWithPageURL:(const GURL&)pageUrl |
stateObject:(NSString*)stateObject; |
+// Sets _documentURL to newURL, and updates any relevant state information. |
+- (void)setDocumentURL:(const GURL&)newURL; |
// Returns YES if the current navigation item corresponds to a web page |
// loaded by a POST request. |
- (BOOL)isCurrentNavigationItemPOST; |
@@ -1365,6 +1377,13 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
[self didUpdateHistoryStateWithPageURL:pageUrl]; |
} |
+- (void)setDocumentURL:(const GURL&)newURL { |
+ if (newURL != _documentURL) { |
+ _documentURL = newURL; |
+ _interactionRegisteredSinceLastURLChange = NO; |
+ } |
+} |
+ |
- (BOOL)isCurrentNavigationItemPOST { |
// |_pendingNavigationInfo| will be nil if the decidePolicy* delegate methods |
// were not called. |
@@ -1572,7 +1591,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// or may not be the result of user actions. For now, guess based on |
// whether there's been an interaction since the last URL change. |
// TODO(crbug.com/549301): See if this heuristic can be improved. |
- transition = self.interactionRegisteredSinceLastURLChange |
+ transition = _interactionRegisteredSinceLastURLChange |
? ui::PAGE_TRANSITION_LINK |
: ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
break; |
@@ -1947,6 +1966,12 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
_expectedReconstructionURL = GURL(); |
} |
+- (GURL)webURLWithTrustLevel:(web::URLVerificationTrustLevel*)trustLevel { |
+ DCHECK(trustLevel); |
+ *trustLevel = web::URLVerificationTrustLevel::kAbsolute; |
+ return _documentURL; |
+} |
+ |
- (BOOL)shouldLoadURLInNativeView:(const GURL&)url { |
// App-specific URLs that don't require WebUI are loaded in native views. |
return web::GetWebClient()->IsAppSpecificURL(url) && |
@@ -3160,6 +3185,8 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (void)setUserInteractionRegistered:(BOOL)flag { |
_userInteractionRegistered = flag; |
+ if (flag) |
+ _interactionRegisteredSinceLastURLChange = YES; |
} |
- (BOOL)userInteractionRegistered { |
@@ -4376,7 +4403,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
certGroupID:self.certGroupID]); |
[_SSLStatusUpdater setDelegate:self]; |
} |
- NSString* host = base::SysUTF8ToNSString(self.documentURL.host()); |
+ NSString* host = base::SysUTF8ToNSString(_documentURL.host()); |
NSArray* certChain = [self.webView certificateChain]; |
BOOL hasOnlySecureContent = [self.webView hasOnlySecureContent]; |
[_SSLStatusUpdater updateSSLStatusForNavigationItem:currentNavItem |
@@ -4882,8 +4909,8 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// This is the point where the document's URL has actually changed, and |
// pending navigation information should be applied to state information. |
[self setDocumentURL:net::GURLWithNSURL([self.webView URL])]; |
- DCHECK(self.documentURL == self.lastRegisteredRequestURL); |
- self.webStateImpl->OnNavigationCommitted(self.documentURL); |
+ DCHECK(_documentURL == self.lastRegisteredRequestURL); |
+ self.webStateImpl->OnNavigationCommitted(_documentURL); |
[self commitPendingNavigationInfo]; |
if ([self currentBackForwardListItemHolder]->navigation_type() == |
WKNavigationTypeBackForward) { |
@@ -4901,7 +4928,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
[self updateSSLStatusForCurrentNavigationItem]; |
// Report cases where SSL cert is missing for a secure connection. |
- if (self.documentURL.SchemeIsCryptographic()) { |
+ if (_documentURL.SchemeIsCryptographic()) { |
scoped_refptr<net::X509Certificate> cert = |
web::CreateCertFromChain([self.webView certificateChain]); |
UMA_HISTOGRAM_BOOLEAN("WebController.WKWebViewHasCertForSecureConnection", |
@@ -5097,7 +5124,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// window.location.href will match the previous URL at this stage, not the web |
// view's current URL. |
if (![self.webView isLoading]) { |
- if (self.documentURL == URL) |
+ if (_documentURL == URL) |
return; |
[self URLDidChangeWithoutDocumentChange:URL]; |
} else if ([self isKVOChangePotentialSameDocumentNavigationToURL:URL]) { |
@@ -5118,7 +5145,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// Re-check origin in case navigaton has occured since |
// start of JavaScript evaluation. |
BOOL newURLOriginMatchesDocumentURLOrigin = |
- self.documentURL.GetOrigin() == URL.GetOrigin(); |
+ _documentURL.GetOrigin() == URL.GetOrigin(); |
// Check that the web view URL still matches the new URL. |
// TODO(crbug.com/563568): webViewURLMatchesNewURL check |
// may drop same document URL changes if pending URL |
@@ -5128,7 +5155,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
net::GURLWithNSURL([self.webView URL]) == URL; |
// Check that the new URL is different from the current |
// document URL. If not, URL change should not be reported. |
- BOOL URLDidChangeFromDocumentURL = URL != self.documentURL; |
+ BOOL URLDidChangeFromDocumentURL = URL != _documentURL; |
if (windowLocationMatchesNewURL && |
newURLOriginMatchesDocumentURLOrigin && |
webViewURLMatchesNewURL && URLDidChangeFromDocumentURL) { |
@@ -5141,8 +5168,8 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (BOOL)isKVOChangePotentialSameDocumentNavigationToURL:(const GURL&)newURL { |
DCHECK([self.webView isLoading]); |
// If the origin changes, it can't be same-document. |
- if (self.documentURL.GetOrigin().is_empty() || |
- self.documentURL.GetOrigin() != newURL.GetOrigin()) { |
+ if (_documentURL.GetOrigin().is_empty() || |
+ _documentURL.GetOrigin() != newURL.GetOrigin()) { |
return NO; |
} |
if (self.loadPhase == web::LOAD_REQUESTED) { |
@@ -5150,7 +5177,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// navigation, but it can also happen during a fast-back navigation across |
// a hash change, so that case is potentially a same-document navigation. |
return web::GURLByRemovingRefFromGURL(newURL) == |
- web::GURLByRemovingRefFromGURL(self.documentURL); |
+ web::GURLByRemovingRefFromGURL(_documentURL); |
} |
// If it passes all the checks above, it might be (but there's no guarantee |
// that it is). |
@@ -5159,8 +5186,8 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL { |
DCHECK(newURL == net::GURLWithNSURL([self.webView URL])); |
- DCHECK_EQ(self.documentURL.host(), newURL.host()); |
- DCHECK(self.documentURL != newURL); |
+ DCHECK_EQ(_documentURL.host(), newURL.host()); |
+ DCHECK(_documentURL != newURL); |
// If called during window.history.pushState or window.history.replaceState |
// JavaScript evaluation, only update the document URL. This callback does not |
@@ -5186,7 +5213,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
[self setDocumentURL:newURL]; |
if (!self.changingHistoryState) { |
- [self didStartLoadingURL:self.documentURL updateHistory:YES]; |
+ [self didStartLoadingURL:_documentURL updateHistory:YES]; |
[self updateSSLStatusForCurrentNavigationItem]; |
[self didFinishNavigation]; |
} |