Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: ios/web/web_state/ui/crw_wk_web_view_web_controller.mm

Issue 1409033004: Improve page transition type heuristic in WebController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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_wk_web_view_web_controller.h" 5 #import "ios/web/web_state/ui/crw_wk_web_view_web_controller.h"
6 6
7 #import <WebKit/WebKit.h> 7 #import <WebKit/WebKit.h>
8 8
9 #include "base/ios/ios_util.h" 9 #include "base/ios/ios_util.h"
10 #include "base/ios/weak_nsobject.h" 10 #include "base/ios/weak_nsobject.h"
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 // bad SSL cert, presenting SSL interstitials and determining SSL status for 137 // bad SSL cert, presenting SSL interstitials and determining SSL status for
138 // Navigation Items. 138 // Navigation Items.
139 base::scoped_nsobject<CRWCertVerificationController> 139 base::scoped_nsobject<CRWCertVerificationController>
140 _certVerificationController; 140 _certVerificationController;
141 141
142 // Whether the pending navigation has been directly cancelled in 142 // Whether the pending navigation has been directly cancelled in
143 // |decidePolicyForNavigationAction| or |decidePolicyForNavigationResponse|. 143 // |decidePolicyForNavigationAction| or |decidePolicyForNavigationResponse|.
144 // Cancelled navigations should be simply discarded without handling any 144 // Cancelled navigations should be simply discarded without handling any
145 // specific error. 145 // specific error.
146 BOOL _pendingNavigationCancelled; 146 BOOL _pendingNavigationCancelled;
147
148 // YES if the user has touched the content area since the last URL change.
149 BOOL _touchedSinceLastURLChange;
147 } 150 }
148 151
149 // Response's MIME type of the last known navigation. 152 // Response's MIME type of the last known navigation.
150 @property(nonatomic, copy) NSString* documentMIMEType; 153 @property(nonatomic, copy) NSString* documentMIMEType;
151 154
152 // Dictionary where keys are the names of WKWebView properties and values are 155 // Dictionary where keys are the names of WKWebView properties and values are
153 // selector names which should be called when a corresponding property has 156 // selector names which should be called when a corresponding property has
154 // changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that 157 // changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that
155 // -[self webViewURLDidChange] must be called every time when WKWebView.URL is 158 // -[self webViewURLDidChange] must be called every time when WKWebView.URL is
156 // changed. 159 // changed.
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 // TODO(eugenebut): implement dialogs/windows suppression using 364 // TODO(eugenebut): implement dialogs/windows suppression using
362 // WKNavigationDelegate methods where possible. 365 // WKNavigationDelegate methods where possible.
363 [super setPageDialogOpenPolicy:policy]; 366 [super setPageDialogOpenPolicy:policy];
364 } 367 }
365 368
366 - (void)close { 369 - (void)close {
367 [_certVerificationController shutDown]; 370 [_certVerificationController shutDown];
368 [super close]; 371 [super close];
369 } 372 }
370 373
374 - (void)touched:(BOOL)touched {
375 [super touched:touched];
376 if (touched)
377 _touchedSinceLastURLChange = YES;
378 }
379
371 #pragma mark - 380 #pragma mark -
372 #pragma mark Testing-Only Methods 381 #pragma mark Testing-Only Methods
373 382
374 - (void)injectWebViewContentView:(CRWWebViewContentView*)webViewContentView { 383 - (void)injectWebViewContentView:(CRWWebViewContentView*)webViewContentView {
375 [super injectWebViewContentView:webViewContentView]; 384 [super injectWebViewContentView:webViewContentView];
376 [self setWebView:static_cast<WKWebView*>(webViewContentView.webView)]; 385 [self setWebView:static_cast<WKWebView*>(webViewContentView.webView)];
377 } 386 }
378 387
379 #pragma mark - Protected property implementations 388 #pragma mark - Protected property implementations
380 389
(...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after
1007 } 1016 }
1008 1017
1009 if (!previousSSLStatus.Equals(item->GetSSL())) { 1018 if (!previousSSLStatus.Equals(item->GetSSL())) {
1010 [self didUpdateSSLStatusForCurrentNavigationItem]; 1019 [self didUpdateSSLStatusForCurrentNavigationItem];
1011 } 1020 }
1012 } 1021 }
1013 1022
1014 #endif // !defined(ENABLE_CHROME_NET_STACK_FOR_WKWEBVIEW) 1023 #endif // !defined(ENABLE_CHROME_NET_STACK_FOR_WKWEBVIEW)
1015 1024
1016 - (void)registerLoadRequest:(const GURL&)url { 1025 - (void)registerLoadRequest:(const GURL&)url {
1017 // If load request is registered via WKWebViewWebController, assume transition 1026 // Get the navigation type from the last main frame load request, and try to
1018 // is link or client redirect as other transitions will already be registered 1027 // map that to a PageTransition.
1019 // by web controller or delegates. 1028 WKNavigationType navigationType = _pendingNavigationTypeForMainFrame
1020 // TODO(stuartmorgan): Remove guesswork and replace with information from 1029 ? *_pendingNavigationTypeForMainFrame
1021 // decidePolicyForNavigationAction:. 1030 : WKNavigationTypeOther;
1022 ui::PageTransition transition = self.userInteractionRegistered 1031 ui::PageTransition transition = ui::PAGE_TRANSITION_CLIENT_REDIRECT;
1023 ? ui::PAGE_TRANSITION_LINK 1032 switch (navigationType) {
1024 : ui::PAGE_TRANSITION_CLIENT_REDIRECT; 1033 case WKNavigationTypeLinkActivated:
1034 transition = ui::PAGE_TRANSITION_LINK;
1035 break;
1036 case WKNavigationTypeFormSubmitted:
1037 case WKNavigationTypeFormResubmitted:
1038 transition = ui::PAGE_TRANSITION_FORM_SUBMIT;
1039 break;
1040 case WKNavigationTypeBackForward:
1041 transition = ui::PAGE_TRANSITION_FORWARD_BACK;
1042 break;
1043 case WKNavigationTypeReload:
1044 transition = ui::PAGE_TRANSITION_RELOAD;
1045 break;
1046 case WKNavigationTypeOther:
1047 // The "Other" type covers a variety of very different cases, which may
1048 // or may not be the result of user actions. For now, guess based on
1049 // whether there's been a touch since the last URL change.
1050 // TODO(crbug.com/549301): See if this heuristic can be improved.
1051 transition = _touchedSinceLastURLChange
1052 ? ui::PAGE_TRANSITION_LINK
1053 : ui::PAGE_TRANSITION_CLIENT_REDIRECT;
1054 break;
1055 }
1025 // The referrer is not known yet, and will be updated later. 1056 // The referrer is not known yet, and will be updated later.
1026 const web::Referrer emptyReferrer; 1057 const web::Referrer emptyReferrer;
1027 [self registerLoadRequest:url referrer:emptyReferrer transition:transition]; 1058 [self registerLoadRequest:url referrer:emptyReferrer transition:transition];
1028 } 1059 }
1029 1060
1030 - (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL { 1061 - (void)URLDidChangeWithoutDocumentChange:(const GURL&)newURL {
1031 DCHECK(newURL == net::GURLWithNSURL([_wkWebView URL])); 1062 DCHECK(newURL == net::GURLWithNSURL([_wkWebView URL]));
1032 DCHECK_EQ(_documentURL.host(), newURL.host()); 1063 DCHECK_EQ(_documentURL.host(), newURL.host());
1033 _documentURL = newURL; 1064 _documentURL = newURL;
1034 // If called during window.history.pushState or window.history.replaceState 1065 // If called during window.history.pushState or window.history.replaceState
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 } 1250 }
1220 1251
1221 - (void)webViewURLDidChange { 1252 - (void)webViewURLDidChange {
1222 // TODO(stuartmorgan): Determine if there are any cases where this still 1253 // TODO(stuartmorgan): Determine if there are any cases where this still
1223 // happens, and if so whether anything should be done when it does. 1254 // happens, and if so whether anything should be done when it does.
1224 if (![_wkWebView URL]) { 1255 if (![_wkWebView URL]) {
1225 DVLOG(1) << "Received nil URL callback"; 1256 DVLOG(1) << "Received nil URL callback";
1226 return; 1257 return;
1227 } 1258 }
1228 GURL url(net::GURLWithNSURL([_wkWebView URL])); 1259 GURL url(net::GURLWithNSURL([_wkWebView URL]));
1260 if (url != _documentURL)
1261 _touchedSinceLastURLChange = NO;
Eugene But (OOO till 7-30) 2015/10/30 15:10:47 This is not the only place where _documentURL is c
stuartmorgan 2015/10/30 16:00:01 Originally I didn't do that because of the async c
1229 // URL changes happen at three points: 1262 // URL changes happen at three points:
1230 // 1) When a load starts; at this point, the load is provisional, and 1263 // 1) When a load starts; at this point, the load is provisional, and
1231 // it should be ignored until it's committed, since the document/window 1264 // it should be ignored until it's committed, since the document/window
1232 // objects haven't changed yet. 1265 // objects haven't changed yet.
1233 // 2) When a non-document-changing URL change happens (hash change, 1266 // 2) When a non-document-changing URL change happens (hash change,
1234 // history.pushState, etc.). This URL change happens instantly, so should 1267 // history.pushState, etc.). This URL change happens instantly, so should
1235 // be reported. 1268 // be reported.
1236 // 3) When a navigation error occurs after provisional navigation starts, 1269 // 3) When a navigation error occurs after provisional navigation starts,
1237 // the URL reverts to the previous URL without triggering a new navigation. 1270 // the URL reverts to the previous URL without triggering a new navigation.
1238 // 1271 //
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
1590 placeholderText:defaultText 1623 placeholderText:defaultText
1591 requestURL: 1624 requestURL:
1592 net::GURLWithNSURL(frame.request.URL) 1625 net::GURLWithNSURL(frame.request.URL)
1593 completionHandler:completionHandler]; 1626 completionHandler:completionHandler];
1594 } else if (completionHandler) { 1627 } else if (completionHandler) {
1595 completionHandler(nil); 1628 completionHandler(nil);
1596 } 1629 }
1597 } 1630 }
1598 1631
1599 @end 1632 @end
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698