| Index: ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
|
| diff --git a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
|
| index ba4a08bfaaa3747c2bd7c7f92010e773b0db0099..316540191ce5f095d54a359263a7846cd5977a30 100644
|
| --- a/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
|
| +++ b/ios/web/web_state/ui/crw_wk_web_view_web_controller.mm
|
| @@ -114,9 +114,9 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| base::scoped_nsobject<CRWWKWebViewCrashDetector> _crashDetector;
|
|
|
| // The actual URL of the document object (i.e., the last committed URL).
|
| - // TODO(stuartmorgan): Remove this in favor of just updating the session
|
| - // controller and treating that as authoritative. For now, this allows sharing
|
| - // the flow that's currently in the superclass.
|
| + // TODO(crbug.com/549616): Remove this in favor of just updating the
|
| + // navigation manager and treating that as authoritative. For now, this allows
|
| + // sharing the flow that's currently in the superclass.
|
| GURL _documentURL;
|
|
|
| // A set of script managers whose scripts have been injected into the current
|
| @@ -174,6 +174,9 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| // cert status from |didReceiveAuthenticationChallenge:| to
|
| // |didFailProvisionalNavigation:| delegate method.
|
| scoped_ptr<CertVerificationErrorsCacheType> _certVerificationErrors;
|
| +
|
| + // YES if the user has touched the content area since the last URL change.
|
| + BOOL _touchedSinceLastURLChange;
|
| }
|
|
|
| // Response's MIME type of the last known navigation.
|
| @@ -214,6 +217,9 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| // Returns whether the given navigation is triggered by a user link click.
|
| - (BOOL)isLinkNavigation:(WKNavigationType)navigationType;
|
|
|
| +// Sets _documentURL to newURL, and updates any relevant state information.
|
| +- (void)setDocumentURL:(const GURL&)newURL;
|
| +
|
| // Sets value of the pendingReferrerString property.
|
| - (void)setPendingReferrerString:(NSString*)referrer;
|
|
|
| @@ -408,6 +414,12 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| [super close];
|
| }
|
|
|
| +- (void)touched:(BOOL)touched {
|
| + [super touched:touched];
|
| + if (touched)
|
| + _touchedSinceLastURLChange = YES;
|
| +}
|
| +
|
| #pragma mark -
|
| #pragma mark Testing-Only Methods
|
|
|
| @@ -753,7 +765,7 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| }
|
| _injectedScriptManagers.reset([[NSMutableSet alloc] init]);
|
| _crashDetector.reset([self newCrashDetectorWithWebView:_wkWebView]);
|
| - _documentURL = [self defaultURL];
|
| + [self setDocumentURL:[self defaultURL]];
|
| }
|
|
|
| - (BOOL)isLinkNavigation:(WKNavigationType)navigationType {
|
| @@ -767,6 +779,13 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| }
|
| }
|
|
|
| +- (void)setDocumentURL:(const GURL&)newURL {
|
| + if (newURL != _documentURL) {
|
| + _documentURL = newURL;
|
| + _touchedSinceLastURLChange = NO;
|
| + }
|
| +}
|
| +
|
| - (void)setPendingReferrerString:(NSString*)referrer {
|
| _pendingReferrerString.reset([referrer copy]);
|
| }
|
| @@ -1134,14 +1153,36 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| }
|
|
|
| - (void)registerLoadRequest:(const GURL&)url {
|
| - // If load request is registered via WKWebViewWebController, assume transition
|
| - // is link or client redirect as other transitions will already be registered
|
| - // by web controller or delegates.
|
| - // TODO(stuartmorgan): Remove guesswork and replace with information from
|
| - // decidePolicyForNavigationAction:.
|
| - ui::PageTransition transition = self.userInteractionRegistered
|
| - ? ui::PAGE_TRANSITION_LINK
|
| - : ui::PAGE_TRANSITION_CLIENT_REDIRECT;
|
| + // Get the navigation type from the last main frame load request, and try to
|
| + // map that to a PageTransition.
|
| + WKNavigationType navigationType = _pendingNavigationTypeForMainFrame
|
| + ? *_pendingNavigationTypeForMainFrame
|
| + : WKNavigationTypeOther;
|
| + ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT;
|
| + switch (navigationType) {
|
| + case WKNavigationTypeLinkActivated:
|
| + transition = ui::PAGE_TRANSITION_LINK;
|
| + break;
|
| + case WKNavigationTypeFormSubmitted:
|
| + case WKNavigationTypeFormResubmitted:
|
| + transition = ui::PAGE_TRANSITION_FORM_SUBMIT;
|
| + break;
|
| + case WKNavigationTypeBackForward:
|
| + transition = ui::PAGE_TRANSITION_FORWARD_BACK;
|
| + break;
|
| + case WKNavigationTypeReload:
|
| + transition = ui::PAGE_TRANSITION_RELOAD;
|
| + break;
|
| + case WKNavigationTypeOther:
|
| + // The "Other" type covers a variety of very different cases, which may
|
| + // or may not be the result of user actions. For now, guess based on
|
| + // whether there's been a touch since the last URL change.
|
| + // TODO(crbug.com/549301): See if this heuristic can be improved.
|
| + transition = _touchedSinceLastURLChange
|
| + ? ui::PAGE_TRANSITION_LINK
|
| + : ui::PAGE_TRANSITION_CLIENT_REDIRECT;
|
| + break;
|
| + }
|
| // The referrer is not known yet, and will be updated later.
|
| const web::Referrer emptyReferrer;
|
| [self registerLoadRequest:url referrer:emptyReferrer transition:transition];
|
| @@ -1150,7 +1191,7 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| - (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL {
|
| DCHECK(newURL == net::GURLWithNSURL([_wkWebView URL]));
|
| DCHECK_EQ(_documentURL.host(), newURL.host());
|
| - _documentURL = newURL;
|
| + [self setDocumentURL:newURL];
|
| // If called during window.history.pushState or window.history.replaceState
|
| // JavaScript evaluation, only update the document URL. This callback does not
|
| // have any information about the state object and cannot create (or edit) the
|
| @@ -1561,7 +1602,7 @@ WKWebViewErrorSource WKWebViewErrorSourceFromError(NSError* error) {
|
| [self commitPendingReferrerString];
|
|
|
| // This is the point where the document's URL has actually changed.
|
| - _documentURL = net::GURLWithNSURL([_wkWebView URL]);
|
| + [self setDocumentURL:net::GURLWithNSURL([_wkWebView URL])];
|
| DCHECK(_documentURL == self.lastRegisteredRequestURL);
|
| [self webPageChanged];
|
|
|
|
|