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> |
11 | 11 |
12 #include <cmath> | 12 #include <cmath> |
13 #include <memory> | 13 #include <memory> |
14 #include <utility> | 14 #include <utility> |
15 | 15 |
16 #include "base/callback.h" | 16 #include "base/callback.h" |
17 #include "base/containers/mru_cache.h" | 17 #include "base/containers/mru_cache.h" |
18 #include "base/ios/block_types.h" | 18 #include "base/ios/block_types.h" |
19 #include "base/ios/ios_util.h" | 19 #include "base/ios/ios_util.h" |
20 #import "base/ios/ns_error_util.h" | 20 #import "base/ios/ns_error_util.h" |
21 #include "base/ios/weak_nsobject.h" | |
22 #include "base/json/json_reader.h" | 21 #include "base/json/json_reader.h" |
23 #include "base/json/string_escape.h" | 22 #include "base/json/string_escape.h" |
24 #include "base/logging.h" | 23 #include "base/logging.h" |
25 #include "base/mac/bind_objc_block.h" | 24 #include "base/mac/bind_objc_block.h" |
26 #include "base/mac/bundle_locations.h" | 25 #include "base/mac/bundle_locations.h" |
27 #include "base/mac/foundation_util.h" | 26 #include "base/mac/foundation_util.h" |
28 #include "base/mac/objc_property_releaser.h" | |
29 #include "base/mac/scoped_cftyperef.h" | 27 #include "base/mac/scoped_cftyperef.h" |
30 #include "base/mac/scoped_nsobject.h" | 28 #include "base/mac/scoped_nsobject.h" |
31 #include "base/metrics/histogram.h" | 29 #include "base/metrics/histogram.h" |
32 #include "base/metrics/user_metrics.h" | 30 #include "base/metrics/user_metrics.h" |
33 #include "base/metrics/user_metrics_action.h" | 31 #include "base/metrics/user_metrics_action.h" |
34 #include "base/strings/string_util.h" | 32 #include "base/strings/string_util.h" |
35 #include "base/strings/sys_string_conversions.h" | 33 #include "base/strings/sys_string_conversions.h" |
36 #include "base/strings/utf_string_conversions.h" | 34 #include "base/strings/utf_string_conversions.h" |
37 #include "base/time/time.h" | 35 #include "base/time/time.h" |
38 #include "base/values.h" | 36 #include "base/values.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
100 #import "ios/web/web_state/wk_web_view_security_util.h" | 98 #import "ios/web/web_state/wk_web_view_security_util.h" |
101 #import "ios/web/webui/crw_web_ui_manager.h" | 99 #import "ios/web/webui/crw_web_ui_manager.h" |
102 #import "ios/web/webui/mojo_facade.h" | 100 #import "ios/web/webui/mojo_facade.h" |
103 #import "net/base/mac/url_conversions.h" | 101 #import "net/base/mac/url_conversions.h" |
104 #include "net/base/net_errors.h" | 102 #include "net/base/net_errors.h" |
105 #include "services/shell/public/cpp/interface_registry.h" | 103 #include "services/shell/public/cpp/interface_registry.h" |
106 #include "ui/base/page_transition_types.h" | 104 #include "ui/base/page_transition_types.h" |
107 #include "url/gurl.h" | 105 #include "url/gurl.h" |
108 #include "url/url_constants.h" | 106 #include "url/url_constants.h" |
109 | 107 |
| 108 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 109 #error "This file requires ARC support." |
| 110 #endif |
| 111 |
110 using base::UserMetricsAction; | 112 using base::UserMetricsAction; |
111 using web::NavigationManager; | 113 using web::NavigationManager; |
112 using web::NavigationManagerImpl; | 114 using web::NavigationManagerImpl; |
113 using web::WebState; | 115 using web::WebState; |
114 using web::WebStateImpl; | 116 using web::WebStateImpl; |
115 | 117 |
116 namespace web { | 118 namespace web { |
117 NSString* const kContainerViewID = @"Container View"; | 119 NSString* const kContainerViewID = @"Container View"; |
118 const char* kWindowNameSeparator = "#"; | 120 const char* kWindowNameSeparator = "#"; |
119 NSString* const kUserIsInteractingKey = @"userIsInteracting"; | 121 NSString* const kUserIsInteractingKey = @"userIsInteracting"; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
244 return | 246 return |
245 [NSError errorWithDomain:error.domain code:error.code userInfo:userInfo]; | 247 [NSError errorWithDomain:error.domain code:error.code userInfo:userInfo]; |
246 } | 248 } |
247 } // namespace | 249 } // namespace |
248 | 250 |
249 #pragma mark - | 251 #pragma mark - |
250 | 252 |
251 // A container object for any navigation information that is only available | 253 // A container object for any navigation information that is only available |
252 // during pre-commit delegate callbacks, and thus must be held until the | 254 // during pre-commit delegate callbacks, and thus must be held until the |
253 // navigation commits and the informatino can be used. | 255 // navigation commits and the informatino can be used. |
254 @interface CRWWebControllerPendingNavigationInfo : NSObject { | 256 @interface CRWWebControllerPendingNavigationInfo : NSObject |
255 base::mac::ObjCPropertyReleaser | |
256 _propertyReleaser_CRWWebControllerPendingNavigationInfo; | |
257 } | |
258 // The referrer for the page. | 257 // The referrer for the page. |
259 @property(nonatomic, copy) NSString* referrer; | 258 @property(nonatomic, copy) NSString* referrer; |
260 // The MIME type for the page. | 259 // The MIME type for the page. |
261 @property(nonatomic, copy) NSString* MIMEType; | 260 @property(nonatomic, copy) NSString* MIMEType; |
262 // The navigation type for the load. | 261 // The navigation type for the load. |
263 @property(nonatomic, assign) WKNavigationType navigationType; | 262 @property(nonatomic, assign) WKNavigationType navigationType; |
264 // HTTP request method for the load. | 263 // HTTP request method for the load. |
265 @property(nonatomic, copy) NSString* HTTPMethod; | 264 @property(nonatomic, copy) NSString* HTTPMethod; |
266 // Whether the pending navigation has been directly cancelled before the | 265 // Whether the pending navigation has been directly cancelled before the |
267 // navigation is committed. | 266 // navigation is committed. |
268 // Cancelled navigations should be simply discarded without handling any | 267 // Cancelled navigations should be simply discarded without handling any |
269 // specific error. | 268 // specific error. |
270 @property(nonatomic, assign) BOOL cancelled; | 269 @property(nonatomic, assign) BOOL cancelled; |
271 @end | 270 @end |
272 | 271 |
273 @implementation CRWWebControllerPendingNavigationInfo | 272 @implementation CRWWebControllerPendingNavigationInfo |
274 @synthesize referrer = _referrer; | 273 @synthesize referrer = _referrer; |
275 @synthesize MIMEType = _MIMEType; | 274 @synthesize MIMEType = _MIMEType; |
276 @synthesize navigationType = _navigationType; | 275 @synthesize navigationType = _navigationType; |
277 @synthesize HTTPMethod = _HTTPMethod; | 276 @synthesize HTTPMethod = _HTTPMethod; |
278 @synthesize cancelled = _cancelled; | 277 @synthesize cancelled = _cancelled; |
279 | 278 |
280 - (instancetype)init { | 279 - (instancetype)init { |
281 if ((self = [super init])) { | 280 if ((self = [super init])) { |
282 _propertyReleaser_CRWWebControllerPendingNavigationInfo.Init( | |
283 self, [CRWWebControllerPendingNavigationInfo class]); | |
284 _navigationType = WKNavigationTypeOther; | 281 _navigationType = WKNavigationTypeOther; |
285 } | 282 } |
286 return self; | 283 return self; |
287 } | 284 } |
288 @end | 285 @end |
289 | 286 |
290 @interface CRWWebController ()<CRWNativeContentDelegate, | 287 @interface CRWWebController ()<CRWNativeContentDelegate, |
291 CRWSSLStatusUpdaterDataSource, | 288 CRWSSLStatusUpdaterDataSource, |
292 CRWSSLStatusUpdaterDelegate, | 289 CRWSSLStatusUpdaterDelegate, |
293 CRWWebControllerContainerViewDelegate, | 290 CRWWebControllerContainerViewDelegate, |
294 CRWWebViewScrollViewProxyObserver, | 291 CRWWebViewScrollViewProxyObserver, |
295 WKNavigationDelegate, | 292 WKNavigationDelegate, |
296 WKUIDelegate> { | 293 WKUIDelegate> { |
297 base::WeakNSProtocol<id<CRWWebDelegate>> _delegate; | 294 __weak id<CRWWebDelegate> _delegate; |
298 base::WeakNSProtocol<id<CRWWebUserInterfaceDelegate>> _UIDelegate; | 295 __weak id<CRWWebUserInterfaceDelegate> _UIDelegate; |
299 base::WeakNSProtocol<id<CRWNativeContentProvider>> _nativeProvider; | 296 __weak id<CRWNativeContentProvider> _nativeProvider; |
300 base::WeakNSProtocol<id<CRWSwipeRecognizerProvider>> _swipeRecognizerProvider; | 297 __weak id<CRWSwipeRecognizerProvider> _swipeRecognizerProvider; |
301 // The WKWebView managed by this instance. | 298 // The WKWebView managed by this instance. |
302 base::scoped_nsobject<WKWebView> _webView; | 299 base::scoped_nsobject<WKWebView> _webView; |
303 // The CRWWebViewProxy is the wrapper to give components access to the | 300 // The CRWWebViewProxy is the wrapper to give components access to the |
304 // web view in a controlled and limited way. | 301 // web view in a controlled and limited way. |
305 base::scoped_nsobject<CRWWebViewProxyImpl> _webViewProxy; | 302 base::scoped_nsobject<CRWWebViewProxyImpl> _webViewProxy; |
306 // The view used to display content. Must outlive |_webViewProxy|. The | 303 // The view used to display content. Must outlive |_webViewProxy|. The |
307 // container view should be accessed through this property rather than | 304 // container view should be accessed through this property rather than |
308 // |self.view| from within this class, as |self.view| triggers creation while | 305 // |self.view| from within this class, as |self.view| triggers creation while |
309 // |self.containerView| will return nil if the view hasn't been instantiated. | 306 // |self.containerView| will return nil if the view hasn't been instantiated. |
310 base::scoped_nsobject<CRWWebControllerContainerView> _containerView; | 307 base::scoped_nsobject<CRWWebControllerContainerView> _containerView; |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
446 // |didFailProvisionalNavigation|. | 443 // |didFailProvisionalNavigation|. |
447 base::scoped_nsobject<CRWWebControllerPendingNavigationInfo> | 444 base::scoped_nsobject<CRWWebControllerPendingNavigationInfo> |
448 _pendingNavigationInfo; | 445 _pendingNavigationInfo; |
449 | 446 |
450 // The WKNavigation for the most recent load request. | 447 // The WKNavigation for the most recent load request. |
451 base::scoped_nsobject<WKNavigation> _latestWKNavigation; | 448 base::scoped_nsobject<WKNavigation> _latestWKNavigation; |
452 | 449 |
453 // The WKNavigation captured when |stopLoading| was called. Used for reporting | 450 // The WKNavigation captured when |stopLoading| was called. Used for reporting |
454 // WebController.EmptyNavigationManagerCausedByStopLoading UMA metric which | 451 // WebController.EmptyNavigationManagerCausedByStopLoading UMA metric which |
455 // helps with diagnosing a navigation related crash (crbug.com/565457). | 452 // helps with diagnosing a navigation related crash (crbug.com/565457). |
456 base::WeakNSObject<WKNavigation> _stoppedWKNavigation; | 453 __weak WKNavigation* _stoppedWKNavigation; |
457 | 454 |
458 // CRWWebUIManager object for loading WebUI pages. | 455 // CRWWebUIManager object for loading WebUI pages. |
459 base::scoped_nsobject<CRWWebUIManager> _webUIManager; | 456 base::scoped_nsobject<CRWWebUIManager> _webUIManager; |
460 | 457 |
461 // Updates SSLStatus for current navigation item. | 458 // Updates SSLStatus for current navigation item. |
462 base::scoped_nsobject<CRWSSLStatusUpdater> _SSLStatusUpdater; | 459 base::scoped_nsobject<CRWSSLStatusUpdater> _SSLStatusUpdater; |
463 | 460 |
464 // Controller used for certs verification to help with blocking requests with | 461 // Controller used for certs verification to help with blocking requests with |
465 // bad SSL cert, presenting SSL interstitials and determining SSL status for | 462 // bad SSL cert, presenting SSL interstitials and determining SSL status for |
466 // Navigation Items. | 463 // Navigation Items. |
467 base::scoped_nsobject<CRWCertVerificationController> | 464 base::scoped_nsobject<CRWCertVerificationController> |
468 _certVerificationController; | 465 _certVerificationController; |
469 | 466 |
470 // CertVerification errors which happened inside | 467 // CertVerification errors which happened inside |
471 // |webView:didReceiveAuthenticationChallenge:completionHandler:|. | 468 // |webView:didReceiveAuthenticationChallenge:completionHandler:|. |
472 // Key is leaf-cert/host pair. This storage is used to carry calculated | 469 // Key is leaf-cert/host pair. This storage is used to carry calculated |
473 // cert status from |didReceiveAuthenticationChallenge:| to | 470 // cert status from |didReceiveAuthenticationChallenge:| to |
474 // |didFailProvisionalNavigation:| delegate method. | 471 // |didFailProvisionalNavigation:| delegate method. |
475 std::unique_ptr<CertVerificationErrorsCacheType> _certVerificationErrors; | 472 std::unique_ptr<CertVerificationErrorsCacheType> _certVerificationErrors; |
476 } | 473 } |
477 | 474 |
478 // If |contentView_| contains a web view, this is the web view it contains. | 475 // If |contentView_| contains a web view, this is the web view it contains. |
479 // If not, it's nil. | 476 // If not, it's nil. |
480 @property(nonatomic, readonly) WKWebView* webView; | 477 @property(weak, nonatomic, readonly) WKWebView* webView; |
481 // The scroll view of |webView|. | 478 // The scroll view of |webView|. |
482 @property(nonatomic, readonly) UIScrollView* webScrollView; | 479 @property(weak, nonatomic, readonly) UIScrollView* webScrollView; |
483 // The current page state of the web view. Writing to this property | 480 // The current page state of the web view. Writing to this property |
484 // asynchronously applies the passed value to the current web view. | 481 // asynchronously applies the passed value to the current web view. |
485 @property(nonatomic, readwrite) web::PageDisplayState pageDisplayState; | 482 @property(nonatomic, readwrite) web::PageDisplayState pageDisplayState; |
486 // The currently displayed native controller, if any. | 483 // The currently displayed native controller, if any. |
487 @property(nonatomic, readwrite) id<CRWNativeContent> nativeController; | 484 @property(weak, nonatomic, readwrite) id<CRWNativeContent> nativeController; |
488 // Returns NavigationManager's session controller. | 485 // Returns NavigationManager's session controller. |
489 @property(nonatomic, readonly) CRWSessionController* sessionController; | 486 @property(weak, nonatomic, readonly) CRWSessionController* sessionController; |
490 // Activity indicator group ID for this web controller. | 487 // Activity indicator group ID for this web controller. |
491 @property(nonatomic, readonly) NSString* activityIndicatorGroupID; | 488 @property(weak, nonatomic, readonly) NSString* activityIndicatorGroupID; |
492 // Dictionary where keys are the names of WKWebView properties and values are | 489 // List of keypaths observed on WKWebView. All KVO-observed keypaths have to |
493 // selector names which should be called when a corresponding property has | 490 // be added to this list. |
494 // changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that | 491 @property(weak, nonatomic, readonly) NSArray* observedKeyPaths; |
495 // -[self webViewURLDidChange] must be called every time when WKWebView.URL is | |
496 // changed. | |
497 @property(nonatomic, readonly) NSDictionary* WKWebViewObservers; | |
498 // Downloader for PassKit files. Lazy initialized. | 492 // Downloader for PassKit files. Lazy initialized. |
499 @property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; | 493 @property(weak, nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; |
500 | 494 |
501 // The web view's view of the current URL. During page transitions | 495 // The web view's view of the current URL. During page transitions |
502 // this may not be the same as the session history's view of the current URL. | 496 // this may not be the same as the session history's view of the current URL. |
503 // This method can change the state of the CRWWebController, as it will display | 497 // This method can change the state of the CRWWebController, as it will display |
504 // an error if the returned URL is not reliable from a security point of view. | 498 // an error if the returned URL is not reliable from a security point of view. |
505 // Note that this method is expensive, so it should always be cached locally if | 499 // Note that this method is expensive, so it should always be cached locally if |
506 // it's needed multiple times in a method. | 500 // it's needed multiple times in a method. |
507 @property(nonatomic, readonly) GURL currentURL; | 501 @property(nonatomic, readonly) GURL currentURL; |
508 // Returns the referrer for the current page. | 502 // Returns the referrer for the current page. |
509 @property(nonatomic, readonly) web::Referrer currentReferrer; | 503 @property(nonatomic, readonly) web::Referrer currentReferrer; |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1000 const NSTimeInterval kSnapshotOverlayTransition = 0.5; | 994 const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
1001 | 995 |
1002 } // namespace | 996 } // namespace |
1003 | 997 |
1004 @implementation CRWWebController | 998 @implementation CRWWebController |
1005 | 999 |
1006 @synthesize webUsageEnabled = _webUsageEnabled; | 1000 @synthesize webUsageEnabled = _webUsageEnabled; |
1007 @synthesize usePlaceholderOverlay = _usePlaceholderOverlay; | 1001 @synthesize usePlaceholderOverlay = _usePlaceholderOverlay; |
1008 @synthesize loadPhase = _loadPhase; | 1002 @synthesize loadPhase = _loadPhase; |
1009 @synthesize shouldSuppressDialogs = _shouldSuppressDialogs; | 1003 @synthesize shouldSuppressDialogs = _shouldSuppressDialogs; |
| 1004 @synthesize nativeProvider = _nativeProvider; |
| 1005 @synthesize swipeRecognizerProvider = _swipeRecognizerProvider; |
| 1006 @synthesize UIDelegate = _UIDelegate; |
| 1007 @synthesize delegate = _delegate; |
1010 | 1008 |
1011 - (instancetype)initWithWebState:(WebStateImpl*)webState { | 1009 - (instancetype)initWithWebState:(WebStateImpl*)webState { |
1012 self = [super init]; | 1010 self = [super init]; |
1013 if (self) { | 1011 if (self) { |
1014 _webStateImpl = webState; | 1012 _webStateImpl = webState; |
1015 DCHECK(_webStateImpl); | 1013 DCHECK(_webStateImpl); |
1016 _webStateImpl->InitializeRequestTracker(self); | 1014 _webStateImpl->InitializeRequestTracker(self); |
1017 // Load phase when no WebView present is 'loaded' because this represents | 1015 // Load phase when no WebView present is 'loaded' because this represents |
1018 // the idle state. | 1016 // the idle state. |
1019 _loadPhase = web::PAGE_LOADED; | 1017 _loadPhase = web::PAGE_LOADED; |
(...skipping 14 matching lines...) Expand all Loading... |
1034 new CertVerificationErrorsCacheType(kMaxCertErrorsCount)); | 1032 new CertVerificationErrorsCacheType(kMaxCertErrorsCount)); |
1035 [[NSNotificationCenter defaultCenter] | 1033 [[NSNotificationCenter defaultCenter] |
1036 addObserver:self | 1034 addObserver:self |
1037 selector:@selector(orientationDidChange) | 1035 selector:@selector(orientationDidChange) |
1038 name:UIApplicationDidChangeStatusBarOrientationNotification | 1036 name:UIApplicationDidChangeStatusBarOrientationNotification |
1039 object:nil]; | 1037 object:nil]; |
1040 } | 1038 } |
1041 return self; | 1039 return self; |
1042 } | 1040 } |
1043 | 1041 |
1044 - (id<CRWNativeContentProvider>)nativeProvider { | |
1045 return _nativeProvider.get(); | |
1046 } | |
1047 | |
1048 - (void)setNativeProvider:(id<CRWNativeContentProvider>)nativeProvider { | |
1049 _nativeProvider.reset(nativeProvider); | |
1050 } | |
1051 | |
1052 - (id<CRWSwipeRecognizerProvider>)swipeRecognizerProvider { | |
1053 return _swipeRecognizerProvider.get(); | |
1054 } | |
1055 | |
1056 - (void)setSwipeRecognizerProvider: | |
1057 (id<CRWSwipeRecognizerProvider>)swipeRecognizerProvider { | |
1058 _swipeRecognizerProvider.reset(swipeRecognizerProvider); | |
1059 } | |
1060 | |
1061 - (WebState*)webState { | 1042 - (WebState*)webState { |
1062 return _webStateImpl; | 1043 return _webStateImpl; |
1063 } | 1044 } |
1064 | 1045 |
1065 - (WebStateImpl*)webStateImpl { | 1046 - (WebStateImpl*)webStateImpl { |
1066 return _webStateImpl; | 1047 return _webStateImpl; |
1067 } | 1048 } |
1068 | 1049 |
1069 - (void)clearTransientContentView { | 1050 - (void)clearTransientContentView { |
1070 // Early return if there is no transient content view. | 1051 // Early return if there is no transient content view. |
(...skipping 10 matching lines...) Expand all Loading... |
1081 | 1062 |
1082 - (void)showTransientContentView:(CRWContentView*)contentView { | 1063 - (void)showTransientContentView:(CRWContentView*)contentView { |
1083 DCHECK(contentView); | 1064 DCHECK(contentView); |
1084 DCHECK(contentView.scrollView); | 1065 DCHECK(contentView.scrollView); |
1085 // TODO(crbug.com/556848) Reenable DCHECK when |CRWWebControllerContainerView| | 1066 // TODO(crbug.com/556848) Reenable DCHECK when |CRWWebControllerContainerView| |
1086 // is restructured so that subviews are not added during |layoutSubviews|. | 1067 // is restructured so that subviews are not added during |layoutSubviews|. |
1087 // DCHECK([contentView.scrollView isDescendantOfView:contentView]); | 1068 // DCHECK([contentView.scrollView isDescendantOfView:contentView]); |
1088 [_containerView displayTransientContent:contentView]; | 1069 [_containerView displayTransientContent:contentView]; |
1089 } | 1070 } |
1090 | 1071 |
1091 - (id<CRWWebDelegate>)delegate { | |
1092 return _delegate.get(); | |
1093 } | |
1094 | |
1095 - (void)setDelegate:(id<CRWWebDelegate>)delegate { | 1072 - (void)setDelegate:(id<CRWWebDelegate>)delegate { |
1096 _delegate.reset(delegate); | 1073 _delegate = delegate; |
1097 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { | 1074 if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { |
1098 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) | 1075 if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) |
1099 [self.nativeController setDelegate:self]; | 1076 [self.nativeController setDelegate:self]; |
1100 else | 1077 else |
1101 [self.nativeController setDelegate:nil]; | 1078 [self.nativeController setDelegate:nil]; |
1102 } | 1079 } |
1103 } | 1080 } |
1104 | 1081 |
1105 - (id<CRWWebUserInterfaceDelegate>)UIDelegate { | |
1106 return _UIDelegate.get(); | |
1107 } | |
1108 | |
1109 - (void)setUIDelegate:(id<CRWWebUserInterfaceDelegate>)UIDelegate { | |
1110 _UIDelegate.reset(UIDelegate); | |
1111 } | |
1112 | |
1113 - (void)dealloc { | 1082 - (void)dealloc { |
1114 DCHECK([NSThread isMainThread]); | 1083 DCHECK([NSThread isMainThread]); |
1115 DCHECK(_isBeingDestroyed); // 'close' must have been called already. | 1084 DCHECK(_isBeingDestroyed); // 'close' must have been called already. |
1116 DCHECK(!_webView); | 1085 DCHECK(!_webView); |
| 1086 [_containerView.get() setDelegate:nil]; |
1117 _touchTrackingRecognizer.get().touchTrackingDelegate = nil; | 1087 _touchTrackingRecognizer.get().touchTrackingDelegate = nil; |
1118 [[_webViewProxy scrollViewProxy] removeObserver:self]; | 1088 [[_webViewProxy scrollViewProxy] removeObserver:self]; |
1119 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 1089 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
1120 [super dealloc]; | |
1121 } | 1090 } |
1122 | 1091 |
1123 - (void)dismissKeyboard { | 1092 - (void)dismissKeyboard { |
1124 [_webView endEditing:YES]; | 1093 [_webView endEditing:YES]; |
1125 if ([self.nativeController respondsToSelector:@selector(dismissKeyboard)]) | 1094 if ([self.nativeController respondsToSelector:@selector(dismissKeyboard)]) |
1126 [self.nativeController dismissKeyboard]; | 1095 [self.nativeController dismissKeyboard]; |
1127 } | 1096 } |
1128 | 1097 |
1129 - (id<CRWNativeContent>)nativeController { | 1098 - (id<CRWNativeContent>)nativeController { |
1130 return [_containerView nativeController]; | 1099 return [_containerView nativeController]; |
(...skipping 11 matching lines...) Expand all Loading... |
1142 [_containerView displayNativeContent:nativeController]; | 1111 [_containerView displayNativeContent:nativeController]; |
1143 [self setNativeControllerWebUsageEnabled:_webUsageEnabled]; | 1112 [self setNativeControllerWebUsageEnabled:_webUsageEnabled]; |
1144 } | 1113 } |
1145 | 1114 |
1146 - (NSString*)activityIndicatorGroupID { | 1115 - (NSString*)activityIndicatorGroupID { |
1147 return [NSString | 1116 return [NSString |
1148 stringWithFormat:@"WebController.NetworkActivityIndicatorKey.%@", | 1117 stringWithFormat:@"WebController.NetworkActivityIndicatorKey.%@", |
1149 self.webStateImpl->GetRequestGroupID()]; | 1118 self.webStateImpl->GetRequestGroupID()]; |
1150 } | 1119 } |
1151 | 1120 |
1152 - (NSDictionary*)WKWebViewObservers { | 1121 - (NSArray*)observedKeyPaths { |
1153 return @{ | 1122 return @[ |
1154 @"certificateChain" : @"webViewSecurityFeaturesDidChange", | 1123 @"certificateChain", @"estimatedProgress", @"hasOnlySecureContent", |
1155 @"estimatedProgress" : @"webViewEstimatedProgressDidChange", | 1124 @"loading", @"title", @"URL" |
1156 @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange", | 1125 ]; |
1157 @"loading" : @"webViewLoadingStateDidChange", | |
1158 @"title" : @"webViewTitleDidChange", | |
1159 @"URL" : @"webViewURLDidChange", | |
1160 }; | |
1161 } | 1126 } |
1162 | 1127 |
1163 // NativeControllerDelegate method, called to inform that title has changed. | 1128 // NativeControllerDelegate method, called to inform that title has changed. |
1164 - (void)nativeContent:(id)content titleDidChange:(NSString*)title { | 1129 - (void)nativeContent:(id)content titleDidChange:(NSString*)title { |
1165 // Responsiveness to delegate method was checked in setDelegate:. | 1130 // Responsiveness to delegate method was checked in setDelegate:. |
1166 [_delegate webController:self titleDidChange:title]; | 1131 [_delegate webController:self titleDidChange:title]; |
1167 } | 1132 } |
1168 | 1133 |
1169 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled { | 1134 - (void)setNativeControllerWebUsageEnabled:(BOOL)webUsageEnabled { |
1170 if ([self.nativeController | 1135 if ([self.nativeController |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1296 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer { | 1261 - (void)showContextMenu:(UIGestureRecognizer*)gestureRecognizer { |
1297 // We don't want ongoing notification that the long press is held. | 1262 // We don't want ongoing notification that the long press is held. |
1298 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan) | 1263 if ([gestureRecognizer state] != UIGestureRecognizerStateBegan) |
1299 return; | 1264 return; |
1300 | 1265 |
1301 if (![_DOMElementForLastTouch count]) | 1266 if (![_DOMElementForLastTouch count]) |
1302 return; | 1267 return; |
1303 | 1268 |
1304 web::ContextMenuParams params = | 1269 web::ContextMenuParams params = |
1305 [self contextMenuParamsForElement:_DOMElementForLastTouch.get()]; | 1270 [self contextMenuParamsForElement:_DOMElementForLastTouch.get()]; |
1306 params.view.reset([_webView retain]); | 1271 params.view.reset(_webView); |
1307 params.location = [gestureRecognizer locationInView:_webView]; | 1272 params.location = [gestureRecognizer locationInView:_webView]; |
1308 if (self.webStateImpl->HandleContextMenu(params)) { | 1273 if (self.webStateImpl->HandleContextMenu(params)) { |
1309 // Cancelling all touches has the intended side effect of suppressing the | 1274 // Cancelling all touches has the intended side effect of suppressing the |
1310 // system's context menu. | 1275 // system's context menu. |
1311 [self cancelAllTouches]; | 1276 [self cancelAllTouches]; |
1312 } | 1277 } |
1313 } | 1278 } |
1314 | 1279 |
1315 - (void)cancelAllTouches { | 1280 - (void)cancelAllTouches { |
1316 // Disable web view scrolling. | 1281 // Disable web view scrolling. |
(...skipping 22 matching lines...) Expand all Loading... |
1339 | 1304 |
1340 if (!defaultImage) { | 1305 if (!defaultImage) { |
1341 CGRect frame = CGRectMake(0, 0, 2, 2); | 1306 CGRect frame = CGRectMake(0, 0, 2, 2); |
1342 UIGraphicsBeginImageContext(frame.size); | 1307 UIGraphicsBeginImageContext(frame.size); |
1343 [[UIColor whiteColor] setFill]; | 1308 [[UIColor whiteColor] setFill]; |
1344 CGContextFillRect(UIGraphicsGetCurrentContext(), frame); | 1309 CGContextFillRect(UIGraphicsGetCurrentContext(), frame); |
1345 | 1310 |
1346 UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); | 1311 UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); |
1347 UIGraphicsEndImageContext(); | 1312 UIGraphicsEndImageContext(); |
1348 | 1313 |
1349 defaultImage = | 1314 defaultImage = [result stretchableImageWithLeftCapWidth:1 topCapHeight:1]; |
1350 [[result stretchableImageWithLeftCapWidth:1 topCapHeight:1] retain]; | |
1351 } | 1315 } |
1352 return defaultImage; | 1316 return defaultImage; |
1353 } | 1317 } |
1354 | 1318 |
1355 - (BOOL)canGoBack { | 1319 - (BOOL)canGoBack { |
1356 return _webStateImpl->GetNavigationManagerImpl().CanGoBack(); | 1320 return _webStateImpl->GetNavigationManagerImpl().CanGoBack(); |
1357 } | 1321 } |
1358 | 1322 |
1359 - (BOOL)canGoForward { | 1323 - (BOOL)canGoForward { |
1360 return _webStateImpl->GetNavigationManagerImpl().CanGoForward(); | 1324 return _webStateImpl->GetNavigationManagerImpl().CanGoForward(); |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 if (iRecognizer != recognizer) { | 1542 if (iRecognizer != recognizer) { |
1579 NSString* description = [iRecognizer description]; | 1543 NSString* description = [iRecognizer description]; |
1580 if ([description rangeOfString:fragment].length) { | 1544 if ([description rangeOfString:fragment].length) { |
1581 [iRecognizer requireGestureRecognizerToFail:recognizer]; | 1545 [iRecognizer requireGestureRecognizerToFail:recognizer]; |
1582 // requireGestureRecognizerToFail: doesn't retain the recognizer, so it | 1546 // requireGestureRecognizerToFail: doesn't retain the recognizer, so it |
1583 // is possible for |iRecognizer| to outlive |recognizer| and end up with | 1547 // is possible for |iRecognizer| to outlive |recognizer| and end up with |
1584 // a dangling pointer. Add a retaining associative reference to ensure | 1548 // a dangling pointer. Add a retaining associative reference to ensure |
1585 // that the lifetimes work out. | 1549 // that the lifetimes work out. |
1586 // Note that normally using the value as the key wouldn't make any | 1550 // Note that normally using the value as the key wouldn't make any |
1587 // sense, but here it's fine since nothing needs to look up the value. | 1551 // sense, but here it's fine since nothing needs to look up the value. |
1588 objc_setAssociatedObject(view, recognizer, recognizer, | 1552 objc_setAssociatedObject(view, (__bridge void*)recognizer, recognizer, |
1589 OBJC_ASSOCIATION_RETAIN_NONATOMIC); | 1553 OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
1590 } | 1554 } |
1591 } | 1555 } |
1592 } | 1556 } |
1593 } | 1557 } |
1594 | 1558 |
1595 - (CRWWebController*)createChildWebController { | 1559 - (CRWWebController*)createChildWebController { |
1596 CRWWebController* result = [self.delegate webPageOrderedOpen]; | 1560 CRWWebController* result = [self.delegate webPageOrderedOpen]; |
1597 DCHECK(!result || result.sessionController.openedByDOM); | 1561 DCHECK(!result || result.sessionController.openedByDOM); |
1598 return result; | 1562 return result; |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1725 NSString* replaceWebViewUrlJS = | 1689 NSString* replaceWebViewUrlJS = |
1726 [self javascriptToReplaceWebViewURL:URL stateObjectJSON:stateObject]; | 1690 [self javascriptToReplaceWebViewURL:URL stateObjectJSON:stateObject]; |
1727 std::string outState; | 1691 std::string outState; |
1728 base::EscapeJSONString(base::SysNSStringToUTF8(stateObject), true, &outState); | 1692 base::EscapeJSONString(base::SysNSStringToUTF8(stateObject), true, &outState); |
1729 NSString* popstateJS = | 1693 NSString* popstateJS = |
1730 [NSString stringWithFormat:@"__gCrWeb.dispatchPopstateEvent(%@);", | 1694 [NSString stringWithFormat:@"__gCrWeb.dispatchPopstateEvent(%@);", |
1731 base::SysUTF8ToNSString(outState)]; | 1695 base::SysUTF8ToNSString(outState)]; |
1732 NSString* combinedJS = | 1696 NSString* combinedJS = |
1733 [NSString stringWithFormat:@"%@%@", replaceWebViewUrlJS, popstateJS]; | 1697 [NSString stringWithFormat:@"%@%@", replaceWebViewUrlJS, popstateJS]; |
1734 GURL blockURL(URL); | 1698 GURL blockURL(URL); |
1735 base::WeakNSObject<CRWWebController> weakSelf(self); | 1699 __weak CRWWebController* weakSelf = self; |
1736 [self executeJavaScript:combinedJS completionHandler:^(id, NSError*) { | 1700 [self executeJavaScript:combinedJS |
1737 if (!weakSelf || weakSelf.get()->_isBeingDestroyed) | 1701 completionHandler:^(id, NSError*) { |
1738 return; | 1702 base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
1739 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); | 1703 if (!strongSelf || strongSelf.get()->_isBeingDestroyed) |
1740 strongSelf.get()->_URLOnStartLoading = blockURL; | 1704 return; |
1741 strongSelf.get()->_lastRegisteredRequestURL = blockURL; | 1705 strongSelf.get()->_URLOnStartLoading = blockURL; |
1742 }]; | 1706 strongSelf.get()->_lastRegisteredRequestURL = blockURL; |
| 1707 }]; |
1743 } | 1708 } |
1744 | 1709 |
1745 // Load the current URL in a web view, first ensuring the web view is visible. | 1710 // Load the current URL in a web view, first ensuring the web view is visible. |
1746 - (void)loadCurrentURLInWebView { | 1711 - (void)loadCurrentURLInWebView { |
1747 // Clear the set of URLs opened in external applications. | 1712 // Clear the set of URLs opened in external applications. |
1748 _openedApplicationURL.reset([[NSMutableSet alloc] init]); | 1713 _openedApplicationURL.reset([[NSMutableSet alloc] init]); |
1749 | 1714 |
1750 // Load the url. The UIWebView delegate callbacks take care of updating the | 1715 // Load the url. The UIWebView delegate callbacks take care of updating the |
1751 // session history and UI. | 1716 // session history and UI. |
1752 const GURL targetURL([self currentNavigationURL]); | 1717 const GURL targetURL([self currentNavigationURL]); |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2230 } else { | 2195 } else { |
2231 // Before changing the current session history entry, record the tab state. | 2196 // Before changing the current session history entry, record the tab state. |
2232 [self recordStateInHistory]; | 2197 [self recordStateInHistory]; |
2233 } | 2198 } |
2234 | 2199 |
2235 CRWSessionController* sessionController = | 2200 CRWSessionController* sessionController = |
2236 _webStateImpl->GetNavigationManagerImpl().GetSessionController(); | 2201 _webStateImpl->GetNavigationManagerImpl().GetSessionController(); |
2237 // fromEntry is retained because it has the potential to be released | 2202 // fromEntry is retained because it has the potential to be released |
2238 // by goDelta: if it has not been committed. | 2203 // by goDelta: if it has not been committed. |
2239 base::scoped_nsobject<CRWSessionEntry> fromEntry( | 2204 base::scoped_nsobject<CRWSessionEntry> fromEntry( |
2240 [[sessionController currentEntry] retain]); | 2205 [sessionController currentEntry]); |
2241 [sessionController goDelta:delta]; | 2206 [sessionController goDelta:delta]; |
2242 if (fromEntry) { | 2207 if (fromEntry) { |
2243 [self finishHistoryNavigationFromEntry:fromEntry]; | 2208 [self finishHistoryNavigationFromEntry:fromEntry]; |
2244 } | 2209 } |
2245 } | 2210 } |
2246 | 2211 |
2247 - (BOOL)isLoaded { | 2212 - (BOOL)isLoaded { |
2248 return _loadPhase == web::PAGE_LOADED; | 2213 return _loadPhase == web::PAGE_LOADED; |
2249 } | 2214 } |
2250 | 2215 |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2430 _webStateImpl->GetMojoInterfaceRegistry(); | 2395 _webStateImpl->GetMojoInterfaceRegistry(); |
2431 _mojoFacade.reset(new web::MojoFacade(interfaceProvider, self)); | 2396 _mojoFacade.reset(new web::MojoFacade(interfaceProvider, self)); |
2432 } | 2397 } |
2433 return _mojoFacade.get(); | 2398 return _mojoFacade.get(); |
2434 } | 2399 } |
2435 | 2400 |
2436 - (CRWPassKitDownloader*)passKitDownloader { | 2401 - (CRWPassKitDownloader*)passKitDownloader { |
2437 if (_passKitDownloader) { | 2402 if (_passKitDownloader) { |
2438 return _passKitDownloader.get(); | 2403 return _passKitDownloader.get(); |
2439 } | 2404 } |
2440 base::WeakNSObject<CRWWebController> weakSelf(self); | 2405 __weak CRWWebController* weakSelf = self; |
2441 web::PassKitCompletionHandler passKitCompletion = ^(NSData* data) { | 2406 web::PassKitCompletionHandler passKitCompletion = ^(NSData* data) { |
2442 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); | 2407 base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
2443 if (!strongSelf) { | 2408 if (!strongSelf) { |
2444 return; | 2409 return; |
2445 } | 2410 } |
2446 // Cancel load to update web state, since the PassKit download happens | 2411 // Cancel load to update web state, since the PassKit download happens |
2447 // through a separate flow. This follows the same flow as when PassKit is | 2412 // through a separate flow. This follows the same flow as when PassKit is |
2448 // downloaded through UIWebView. | 2413 // downloaded through UIWebView. |
2449 [strongSelf loadCancelled]; | 2414 [strongSelf loadCancelled]; |
2450 SEL didLoadPassKitObject = @selector(webController:didLoadPassKitObject:); | 2415 SEL didLoadPassKitObject = @selector(webController:didLoadPassKitObject:); |
2451 id<CRWWebDelegate> delegate = [strongSelf delegate]; | 2416 id<CRWWebDelegate> delegate = [strongSelf delegate]; |
2452 if ([delegate respondsToSelector:didLoadPassKitObject]) { | 2417 if ([delegate respondsToSelector:didLoadPassKitObject]) { |
(...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3037 // TODO(crbug.com/549301): Improve transition detection. | 3002 // TODO(crbug.com/549301): Improve transition detection. |
3038 ui::PageTransition transition = self.userInteractionRegistered | 3003 ui::PageTransition transition = self.userInteractionRegistered |
3039 ? ui::PAGE_TRANSITION_LINK | 3004 ? ui::PAGE_TRANSITION_LINK |
3040 : ui::PAGE_TRANSITION_CLIENT_REDIRECT; | 3005 : ui::PAGE_TRANSITION_CLIENT_REDIRECT; |
3041 [self pushStateWithPageURL:pushURL | 3006 [self pushStateWithPageURL:pushURL |
3042 stateObject:stateObject | 3007 stateObject:stateObject |
3043 transition:transition]; | 3008 transition:transition]; |
3044 | 3009 |
3045 NSString* replaceWebViewJS = | 3010 NSString* replaceWebViewJS = |
3046 [self javascriptToReplaceWebViewURL:pushURL stateObjectJSON:stateObject]; | 3011 [self javascriptToReplaceWebViewURL:pushURL stateObjectJSON:stateObject]; |
3047 base::WeakNSObject<CRWWebController> weakSelf(self); | 3012 __weak CRWWebController* weakSelf = self; |
3048 [self executeJavaScript:replaceWebViewJS completionHandler:^(id, NSError*) { | 3013 [self executeJavaScript:replaceWebViewJS |
3049 if (!weakSelf || weakSelf.get()->_isBeingDestroyed) | 3014 completionHandler:^(id, NSError*) { |
3050 return; | 3015 base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
3051 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); | 3016 if (!strongSelf || strongSelf.get()->_isBeingDestroyed) |
3052 [strongSelf optOutScrollsToTopForSubviews]; | 3017 return; |
3053 // Notify the observers. | 3018 [strongSelf optOutScrollsToTopForSubviews]; |
3054 strongSelf.get()->_webStateImpl->OnHistoryStateChanged(); | 3019 // Notify the observers. |
3055 [strongSelf didFinishNavigation]; | 3020 strongSelf.get()->_webStateImpl->OnHistoryStateChanged(); |
3056 }]; | 3021 [strongSelf didFinishNavigation]; |
| 3022 }]; |
3057 return YES; | 3023 return YES; |
3058 } | 3024 } |
3059 | 3025 |
3060 - (BOOL)handleWindowHistoryDidReplaceStateMessage: | 3026 - (BOOL)handleWindowHistoryDidReplaceStateMessage: |
3061 (base::DictionaryValue*)message | 3027 (base::DictionaryValue*)message |
3062 context:(NSDictionary*)context { | 3028 context:(NSDictionary*)context { |
3063 DCHECK(_changingHistoryState); | 3029 DCHECK(_changingHistoryState); |
3064 _changingHistoryState = NO; | 3030 _changingHistoryState = NO; |
3065 | 3031 |
3066 std::string pageURL; | 3032 std::string pageURL; |
(...skipping 29 matching lines...) Expand all Loading... |
3096 if (!message->GetString("stateObject", &stateObjectJSON)) { | 3062 if (!message->GetString("stateObject", &stateObjectJSON)) { |
3097 DLOG(WARNING) << "JS message parameter not found: stateObject"; | 3063 DLOG(WARNING) << "JS message parameter not found: stateObject"; |
3098 return NO; | 3064 return NO; |
3099 } | 3065 } |
3100 NSString* stateObject = base::SysUTF8ToNSString(stateObjectJSON); | 3066 NSString* stateObject = base::SysUTF8ToNSString(stateObjectJSON); |
3101 _URLOnStartLoading = replaceURL; | 3067 _URLOnStartLoading = replaceURL; |
3102 _lastRegisteredRequestURL = replaceURL; | 3068 _lastRegisteredRequestURL = replaceURL; |
3103 [self replaceStateWithPageURL:replaceURL stateObject:stateObject]; | 3069 [self replaceStateWithPageURL:replaceURL stateObject:stateObject]; |
3104 NSString* replaceStateJS = [self javascriptToReplaceWebViewURL:replaceURL | 3070 NSString* replaceStateJS = [self javascriptToReplaceWebViewURL:replaceURL |
3105 stateObjectJSON:stateObject]; | 3071 stateObjectJSON:stateObject]; |
3106 base::WeakNSObject<CRWWebController> weakSelf(self); | 3072 __weak CRWWebController* weakSelf = self; |
3107 [self executeJavaScript:replaceStateJS completionHandler:^(id, NSError*) { | 3073 [self executeJavaScript:replaceStateJS |
3108 if (!weakSelf || weakSelf.get()->_isBeingDestroyed) | 3074 completionHandler:^(id, NSError*) { |
3109 return; | 3075 base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
3110 base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); | 3076 if (!strongSelf || strongSelf.get()->_isBeingDestroyed) |
3111 [strongSelf didFinishNavigation]; | 3077 return; |
3112 }]; | 3078 [strongSelf didFinishNavigation]; |
| 3079 }]; |
3113 return YES; | 3080 return YES; |
3114 } | 3081 } |
3115 | 3082 |
3116 #pragma mark - | 3083 #pragma mark - |
3117 | 3084 |
3118 - (BOOL)wantsKeyboardShield { | 3085 - (BOOL)wantsKeyboardShield { |
3119 if ([self.nativeController | 3086 if ([self.nativeController |
3120 respondsToSelector:@selector(wantsKeyboardShield)]) { | 3087 respondsToSelector:@selector(wantsKeyboardShield)]) { |
3121 return [self.nativeController wantsKeyboardShield]; | 3088 return [self.nativeController wantsKeyboardShield]; |
3122 } | 3089 } |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3518 shouldReceiveTouch:(UITouch*)touch { | 3485 shouldReceiveTouch:(UITouch*)touch { |
3519 // Expect only _contextMenuRecognizer. | 3486 // Expect only _contextMenuRecognizer. |
3520 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); | 3487 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); |
3521 | 3488 |
3522 // This is custom long press gesture recognizer. By the time the gesture is | 3489 // This is custom long press gesture recognizer. By the time the gesture is |
3523 // recognized the web controller needs to know if there is a link under the | 3490 // recognized the web controller needs to know if there is a link under the |
3524 // touch. If there a link, the web controller will reject system's context | 3491 // touch. If there a link, the web controller will reject system's context |
3525 // menu and show another one. If for some reason context menu info is not | 3492 // menu and show another one. If for some reason context menu info is not |
3526 // fetched - system context menu will be shown. | 3493 // fetched - system context menu will be shown. |
3527 [self setDOMElementForLastTouch:nil]; | 3494 [self setDOMElementForLastTouch:nil]; |
3528 base::WeakNSObject<CRWWebController> weakSelf(self); | 3495 __weak CRWWebController* weakSelf = self; |
3529 [self fetchDOMElementAtPoint:[touch locationInView:_webView] | 3496 [self fetchDOMElementAtPoint:[touch locationInView:_webView] |
3530 completionHandler:^(NSDictionary* element) { | 3497 completionHandler:^(NSDictionary* element) { |
3531 [weakSelf setDOMElementForLastTouch:element]; | 3498 [weakSelf setDOMElementForLastTouch:element]; |
3532 }]; | 3499 }]; |
3533 return YES; | 3500 return YES; |
3534 } | 3501 } |
3535 | 3502 |
3536 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer { | 3503 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer { |
3537 // Expect only _contextMenuRecognizer. | 3504 // Expect only _contextMenuRecognizer. |
3538 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); | 3505 DCHECK([gestureRecognizer isEqual:_contextMenuRecognizer]); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3633 return [_delegate webController:self | 3600 return [_delegate webController:self |
3634 shouldBlockPopupWithURL:popupURL | 3601 shouldBlockPopupWithURL:popupURL |
3635 sourceURL:sourceURL]; | 3602 sourceURL:sourceURL]; |
3636 } | 3603 } |
3637 | 3604 |
3638 - (void)openPopupWithInfo:(const web::NewWindowInfo&)windowInfo { | 3605 - (void)openPopupWithInfo:(const web::NewWindowInfo&)windowInfo { |
3639 const GURL url(windowInfo.url); | 3606 const GURL url(windowInfo.url); |
3640 const GURL currentURL([self currentNavigationURL]); | 3607 const GURL currentURL([self currentNavigationURL]); |
3641 NSString* windowName = windowInfo.window_name.get(); | 3608 NSString* windowName = windowInfo.window_name.get(); |
3642 web::Referrer referrer(currentURL, windowInfo.referrer_policy); | 3609 web::Referrer referrer(currentURL, windowInfo.referrer_policy); |
3643 base::WeakNSObject<CRWWebController> weakSelf(self); | 3610 __weak CRWWebController* weakSelf = self; |
3644 void (^showPopupHandler)() = ^{ | 3611 void (^showPopupHandler)() = ^{ |
3645 CRWWebController* child = [[weakSelf delegate] webPageOrderedOpen:url | 3612 CRWWebController* child = [[weakSelf delegate] webPageOrderedOpen:url |
3646 referrer:referrer | 3613 referrer:referrer |
3647 windowName:windowName | 3614 windowName:windowName |
3648 inBackground:NO]; | 3615 inBackground:NO]; |
3649 DCHECK(!child || child.sessionController.openedByDOM); | 3616 DCHECK(!child || child.sessionController.openedByDOM); |
3650 }; | 3617 }; |
3651 | 3618 |
3652 BOOL showPopup = windowInfo.user_is_interacting || | 3619 BOOL showPopup = windowInfo.user_is_interacting || |
3653 (![self shouldBlockPopupWithURL:url sourceURL:currentURL]); | 3620 (![self shouldBlockPopupWithURL:url sourceURL:currentURL]); |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3948 return [self currentSessionEntry].navigationItem->GetHttpRequestHeaders(); | 3915 return [self currentSessionEntry].navigationItem->GetHttpRequestHeaders(); |
3949 } | 3916 } |
3950 | 3917 |
3951 #pragma mark - | 3918 #pragma mark - |
3952 #pragma mark CRWWebViewScrollViewProxyObserver | 3919 #pragma mark CRWWebViewScrollViewProxyObserver |
3953 | 3920 |
3954 - (void)webViewScrollViewDidZoom: | 3921 - (void)webViewScrollViewDidZoom: |
3955 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { | 3922 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { |
3956 _pageHasZoomed = YES; | 3923 _pageHasZoomed = YES; |
3957 | 3924 |
3958 base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); | 3925 __weak UIScrollView* weakScrollView = self.webScrollView; |
3959 [self extractViewportTagWithCompletion:^( | 3926 [self extractViewportTagWithCompletion:^( |
3960 const web::PageViewportState* viewportState) { | 3927 const web::PageViewportState* viewportState) { |
3961 if (!weakScrollView) | 3928 if (!weakScrollView) |
3962 return; | 3929 return; |
3963 base::scoped_nsobject<UIScrollView> scrollView([weakScrollView retain]); | 3930 base::scoped_nsobject<UIScrollView> scrollView(weakScrollView); |
3964 if (viewportState && !viewportState->viewport_tag_present() && | 3931 if (viewportState && !viewportState->viewport_tag_present() && |
3965 [scrollView minimumZoomScale] == [scrollView maximumZoomScale] && | 3932 [scrollView minimumZoomScale] == [scrollView maximumZoomScale] && |
3966 [scrollView zoomScale] > 1.0) { | 3933 [scrollView zoomScale] > 1.0) { |
3967 UMA_HISTOGRAM_BOOLEAN(kUMAViewportZoomBugCount, true); | 3934 UMA_HISTOGRAM_BOOLEAN(kUMAViewportZoomBugCount, true); |
3968 } | 3935 } |
3969 }]; | 3936 }]; |
3970 } | 3937 } |
3971 | 3938 |
3972 - (void)webViewScrollViewDidResetContentSize: | 3939 - (void)webViewScrollViewDidResetContentSize: |
3973 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { | 3940 (CRWWebViewScrollViewProxy*)webViewScrollViewProxy { |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4068 - (void)extractViewportTagWithCompletion:(ViewportStateCompletion)completion { | 4035 - (void)extractViewportTagWithCompletion:(ViewportStateCompletion)completion { |
4069 DCHECK(completion); | 4036 DCHECK(completion); |
4070 web::NavigationItem* currentItem = [self currentNavItem]; | 4037 web::NavigationItem* currentItem = [self currentNavItem]; |
4071 if (!currentItem) { | 4038 if (!currentItem) { |
4072 completion(nullptr); | 4039 completion(nullptr); |
4073 return; | 4040 return; |
4074 } | 4041 } |
4075 NSString* const kViewportContentQuery = | 4042 NSString* const kViewportContentQuery = |
4076 @"var viewport = document.querySelector('meta[name=\"viewport\"]');" | 4043 @"var viewport = document.querySelector('meta[name=\"viewport\"]');" |
4077 "viewport ? viewport.content : '';"; | 4044 "viewport ? viewport.content : '';"; |
4078 base::WeakNSObject<CRWWebController> weakSelf(self); | 4045 __weak CRWWebController* weakSelf = self; |
4079 int itemID = currentItem->GetUniqueID(); | 4046 int itemID = currentItem->GetUniqueID(); |
4080 [self executeJavaScript:kViewportContentQuery | 4047 [self executeJavaScript:kViewportContentQuery |
4081 completionHandler:^(id viewportContent, NSError*) { | 4048 completionHandler:^(id viewportContent, NSError*) { |
4082 web::NavigationItem* item = [weakSelf currentNavItem]; | 4049 web::NavigationItem* item = [weakSelf currentNavItem]; |
4083 if (item && item->GetUniqueID() == itemID) { | 4050 if (item && item->GetUniqueID() == itemID) { |
4084 web::PageViewportState viewportState( | 4051 web::PageViewportState viewportState( |
4085 base::mac::ObjCCast<NSString>(viewportContent)); | 4052 base::mac::ObjCCast<NSString>(viewportContent)); |
4086 completion(&viewportState); | 4053 completion(&viewportState); |
4087 } else { | 4054 } else { |
4088 completion(nullptr); | 4055 completion(nullptr); |
(...skipping 28 matching lines...) Expand all Loading... |
4117 displayState.zoom_state().set_zoom_scale( | 4084 displayState.zoom_state().set_zoom_scale( |
4118 displayState.zoom_state().minimum_zoom_scale() + | 4085 displayState.zoom_state().minimum_zoom_scale() + |
4119 zoomPercentage * displayState.zoom_state().GetMinMaxZoomDifference()); | 4086 zoomPercentage * displayState.zoom_state().GetMinMaxZoomDifference()); |
4120 currentItem->SetPageDisplayState(displayState); | 4087 currentItem->SetPageDisplayState(displayState); |
4121 [self applyPageDisplayState:currentItem->GetPageDisplayState()]; | 4088 [self applyPageDisplayState:currentItem->GetPageDisplayState()]; |
4122 } | 4089 } |
4123 | 4090 |
4124 - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState { | 4091 - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState { |
4125 if (!displayState.IsValid()) | 4092 if (!displayState.IsValid()) |
4126 return; | 4093 return; |
4127 base::WeakNSObject<CRWWebController> weakSelf(self); | 4094 __weak CRWWebController* weakSelf = self; |
4128 web::PageDisplayState displayStateCopy = displayState; | 4095 web::PageDisplayState displayStateCopy = displayState; |
4129 [self extractViewportTagWithCompletion:^( | 4096 [self extractViewportTagWithCompletion:^( |
4130 const web::PageViewportState* viewportState) { | 4097 const web::PageViewportState* viewportState) { |
4131 if (viewportState) { | 4098 if (viewportState) { |
4132 [weakSelf applyPageDisplayState:displayStateCopy | 4099 [weakSelf applyPageDisplayState:displayStateCopy |
4133 userScalable:viewportState->user_scalable()]; | 4100 userScalable:viewportState->user_scalable()]; |
4134 } | 4101 } |
4135 }]; | 4102 }]; |
4136 } | 4103 } |
4137 | 4104 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4206 (const web::PageScrollState&)scrollState { | 4173 (const web::PageScrollState&)scrollState { |
4207 DCHECK(scrollState.IsValid()); | 4174 DCHECK(scrollState.IsValid()); |
4208 CGPoint scrollOffset = | 4175 CGPoint scrollOffset = |
4209 CGPointMake(scrollState.offset_x(), scrollState.offset_y()); | 4176 CGPointMake(scrollState.offset_x(), scrollState.offset_y()); |
4210 if (_loadPhase == web::PAGE_LOADED) { | 4177 if (_loadPhase == web::PAGE_LOADED) { |
4211 // If the page is loaded, update the scroll immediately. | 4178 // If the page is loaded, update the scroll immediately. |
4212 [self.webScrollView setContentOffset:scrollOffset]; | 4179 [self.webScrollView setContentOffset:scrollOffset]; |
4213 } else { | 4180 } else { |
4214 // If the page isn't loaded, store the action to update the scroll | 4181 // If the page isn't loaded, store the action to update the scroll |
4215 // when the page finishes loading. | 4182 // when the page finishes loading. |
4216 base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); | 4183 __weak UIScrollView* weakScrollView = self.webScrollView; |
4217 base::scoped_nsprotocol<ProceduralBlock> action([^{ | 4184 base::scoped_nsprotocol<ProceduralBlock> action([^{ |
4218 [weakScrollView setContentOffset:scrollOffset]; | 4185 [weakScrollView setContentOffset:scrollOffset]; |
4219 } copy]); | 4186 } copy]); |
4220 [_pendingLoadCompleteActions addObject:action]; | 4187 [_pendingLoadCompleteActions addObject:action]; |
4221 } | 4188 } |
4222 } | 4189 } |
4223 | 4190 |
4224 #pragma mark - | 4191 #pragma mark - |
4225 #pragma mark Web Page Features | 4192 #pragma mark Web Page Features |
4226 | 4193 |
4227 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler { | 4194 - (void)fetchWebPageWidthWithCompletionHandler:(void (^)(CGFloat))handler { |
4228 if (!_webView) { | 4195 if (!_webView) { |
4229 handler(0); | 4196 handler(0); |
4230 return; | 4197 return; |
4231 } | 4198 } |
4232 | 4199 |
4233 [self executeJavaScript:@"__gCrWeb.getPageWidth();" | 4200 [self executeJavaScript:@"__gCrWeb.getPageWidth();" |
4234 completionHandler:^(id pageWidth, NSError*) { | 4201 completionHandler:^(id pageWidth, NSError*) { |
4235 handler([base::mac::ObjCCastStrict<NSNumber>(pageWidth) floatValue]); | 4202 handler([base::mac::ObjCCastStrict<NSNumber>(pageWidth) floatValue]); |
4236 }]; | 4203 }]; |
4237 } | 4204 } |
4238 | 4205 |
4239 - (void)fetchDOMElementAtPoint:(CGPoint)point | 4206 - (void)fetchDOMElementAtPoint:(CGPoint)point |
4240 completionHandler:(void (^)(NSDictionary*))handler { | 4207 completionHandler:(void (^)(NSDictionary*))handler { |
4241 DCHECK(handler); | 4208 DCHECK(handler); |
4242 // Convert point into web page's coordinate system (which may be scaled and/or | 4209 // Convert point into web page's coordinate system (which may be scaled and/or |
4243 // scrolled). | 4210 // scrolled). |
4244 CGPoint scrollOffset = self.scrollPosition; | 4211 CGPoint scrollOffset = self.scrollPosition; |
4245 CGFloat webViewContentWidth = self.webScrollView.contentSize.width; | 4212 CGFloat webViewContentWidth = self.webScrollView.contentSize.width; |
4246 base::WeakNSObject<CRWWebController> weakSelf(self); | 4213 __weak CRWWebController* weakSelf = self; |
4247 [self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) { | 4214 [self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) { |
4248 CGFloat scale = pageWidth / webViewContentWidth; | 4215 CGFloat scale = pageWidth / webViewContentWidth; |
4249 CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale, | 4216 CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale, |
4250 (point.y + scrollOffset.y) * scale); | 4217 (point.y + scrollOffset.y) * scale); |
4251 NSString* const kGetElementScript = | 4218 NSString* const kGetElementScript = |
4252 [NSString stringWithFormat:@"__gCrWeb.getElementFromPoint(%g, %g);", | 4219 [NSString stringWithFormat:@"__gCrWeb.getElementFromPoint(%g, %g);", |
4253 localPoint.x, localPoint.y]; | 4220 localPoint.x, localPoint.y]; |
4254 [weakSelf executeJavaScript:kGetElementScript | 4221 [weakSelf executeJavaScript:kGetElementScript |
4255 completionHandler:^(id element, NSError*) { | 4222 completionHandler:^(id element, NSError*) { |
4256 handler(base::mac::ObjCCastStrict<NSDictionary>(element)); | 4223 handler(base::mac::ObjCCastStrict<NSDictionary>(element)); |
(...skipping 11 matching lines...) Expand all Loading... |
4268 title = @"JavaScript"; | 4235 title = @"JavaScript"; |
4269 } else { | 4236 } else { |
4270 base::string16 URLText = url_formatter::FormatUrl(params.link_url); | 4237 base::string16 URLText = url_formatter::FormatUrl(params.link_url); |
4271 title = base::SysUTF16ToNSString(URLText); | 4238 title = base::SysUTF16ToNSString(URLText); |
4272 } | 4239 } |
4273 } | 4240 } |
4274 NSString* src = element[@"src"]; | 4241 NSString* src = element[@"src"]; |
4275 if (src) { | 4242 if (src) { |
4276 params.src_url = GURL(base::SysNSStringToUTF8(src)); | 4243 params.src_url = GURL(base::SysNSStringToUTF8(src)); |
4277 if (!title) | 4244 if (!title) |
4278 title = [[src copy] autorelease]; | 4245 title = [src copy]; |
4279 if ([title hasPrefix:base::SysUTF8ToNSString(url::kDataScheme)]) | 4246 if ([title hasPrefix:base::SysUTF8ToNSString(url::kDataScheme)]) |
4280 title = nil; | 4247 title = nil; |
4281 } | 4248 } |
4282 NSString* titleAttribute = element[@"title"]; | 4249 NSString* titleAttribute = element[@"title"]; |
4283 if (titleAttribute) | 4250 if (titleAttribute) |
4284 title = titleAttribute; | 4251 title = titleAttribute; |
4285 if (title) { | 4252 if (title) { |
4286 params.menu_title.reset([title copy]); | 4253 params.menu_title.reset([title copy]); |
4287 } | 4254 } |
4288 NSString* referrerPolicy = element[@"referrerPolicy"]; | 4255 NSString* referrerPolicy = element[@"referrerPolicy"]; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4339 [_delegate webControllerDidSuppressDialog:self]; | 4306 [_delegate webControllerDidSuppressDialog:self]; |
4340 } | 4307 } |
4341 | 4308 |
4342 - (void)didBlockPopupWithURL:(GURL)popupURL | 4309 - (void)didBlockPopupWithURL:(GURL)popupURL |
4343 sourceURL:(GURL)sourceURL | 4310 sourceURL:(GURL)sourceURL |
4344 referrerPolicy:(const std::string&)referrerPolicyString { | 4311 referrerPolicy:(const std::string&)referrerPolicyString { |
4345 web::ReferrerPolicy referrerPolicy = | 4312 web::ReferrerPolicy referrerPolicy = |
4346 web::ReferrerPolicyFromString(referrerPolicyString); | 4313 web::ReferrerPolicyFromString(referrerPolicyString); |
4347 web::Referrer referrer(sourceURL, referrerPolicy); | 4314 web::Referrer referrer(sourceURL, referrerPolicy); |
4348 NSString* const kWindowName = @""; // obsoleted | 4315 NSString* const kWindowName = @""; // obsoleted |
4349 base::WeakNSObject<CRWWebController> weakSelf(self); | 4316 __weak CRWWebController* weakSelf = self; |
4350 void (^showPopupHandler)() = ^{ | 4317 void (^showPopupHandler)() = ^{ |
4351 // On Desktop cross-window comunication is not supported for unblocked | 4318 // On Desktop cross-window comunication is not supported for unblocked |
4352 // popups; so it's ok to create a new independent page. | 4319 // popups; so it's ok to create a new independent page. |
4353 CRWWebController* child = | 4320 CRWWebController* child = |
4354 [[weakSelf delegate] webPageOrderedOpen:popupURL | 4321 [[weakSelf delegate] webPageOrderedOpen:popupURL |
4355 referrer:referrer | 4322 referrer:referrer |
4356 windowName:kWindowName | 4323 windowName:kWindowName |
4357 inBackground:NO]; | 4324 inBackground:NO]; |
4358 DCHECK(!child || child.sessionController.openedByDOM); | 4325 DCHECK(!child || child.sessionController.openedByDOM); |
4359 }; | 4326 }; |
4360 | 4327 |
4361 web::BlockedPopupInfo info(popupURL, referrer, kWindowName, showPopupHandler); | 4328 web::BlockedPopupInfo info(popupURL, referrer, kWindowName, showPopupHandler); |
4362 [self.delegate webController:self didBlockPopup:info]; | 4329 [self.delegate webController:self didBlockPopup:info]; |
4363 } | 4330 } |
4364 | 4331 |
4365 - (void)didBlockPopupWithURL:(GURL)popupURL sourceURL:(GURL)sourceURL { | 4332 - (void)didBlockPopupWithURL:(GURL)popupURL sourceURL:(GURL)sourceURL { |
4366 if ([_delegate respondsToSelector:@selector(webController:didBlockPopup:)]) { | 4333 if ([_delegate respondsToSelector:@selector(webController:didBlockPopup:)]) { |
4367 base::WeakNSObject<CRWWebController> weakSelf(self); | 4334 __weak CRWWebController* weakSelf = self; |
4368 dispatch_async(dispatch_get_main_queue(), ^{ | 4335 dispatch_async(dispatch_get_main_queue(), ^{ |
4369 [self queryPageReferrerPolicy:^(NSString* policy) { | 4336 [self queryPageReferrerPolicy:^(NSString* policy) { |
4370 [weakSelf didBlockPopupWithURL:popupURL | 4337 [weakSelf didBlockPopupWithURL:popupURL |
4371 sourceURL:sourceURL | 4338 sourceURL:sourceURL |
4372 referrerPolicy:base::SysNSStringToUTF8(policy)]; | 4339 referrerPolicy:base::SysNSStringToUTF8(policy)]; |
4373 }]; | 4340 }]; |
4374 }); | 4341 }); |
4375 } | 4342 } |
4376 } | 4343 } |
4377 | 4344 |
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4623 [_containerView addToolbars:_webViewToolbars]; | 4590 [_containerView addToolbars:_webViewToolbars]; |
4624 | 4591 |
4625 base::scoped_nsobject<CRWWebViewContentView> webViewContentView( | 4592 base::scoped_nsobject<CRWWebViewContentView> webViewContentView( |
4626 [[CRWWebViewContentView alloc] initWithWebView:_webView | 4593 [[CRWWebViewContentView alloc] initWithWebView:_webView |
4627 scrollView:self.webScrollView]); | 4594 scrollView:self.webScrollView]); |
4628 [_containerView displayWebViewContentView:webViewContentView]; | 4595 [_containerView displayWebViewContentView:webViewContentView]; |
4629 } | 4596 } |
4630 } | 4597 } |
4631 | 4598 |
4632 - (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config { | 4599 - (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config { |
4633 return [web::CreateWKWebView(CGRectZero, config, | 4600 return web::CreateWKWebView(CGRectZero, config, |
4634 self.webStateImpl->GetBrowserState(), | 4601 self.webStateImpl->GetBrowserState(), |
4635 [self useDesktopUserAgent]) autorelease]; | 4602 [self useDesktopUserAgent]); |
4636 } | 4603 } |
4637 | 4604 |
4638 - (void)setWebView:(WKWebView*)webView { | 4605 - (void)setWebView:(WKWebView*)webView { |
4639 DCHECK_NE(_webView.get(), webView); | 4606 DCHECK_NE(_webView.get(), webView); |
4640 | 4607 |
4641 // Unwind the old web view. | 4608 // Unwind the old web view. |
4642 // TODO(eugenebut): Remove CRWWKScriptMessageRouter once crbug.com/543374 is | 4609 // TODO(eugenebut): Remove CRWWKScriptMessageRouter once crbug.com/543374 is |
4643 // fixed. | 4610 // fixed. |
4644 CRWWKScriptMessageRouter* messageRouter = | 4611 CRWWKScriptMessageRouter* messageRouter = |
4645 [self webViewConfigurationProvider].GetScriptMessageRouter(); | 4612 [self webViewConfigurationProvider].GetScriptMessageRouter(); |
4646 if (_webView) { | 4613 if (_webView) { |
4647 [messageRouter removeAllScriptMessageHandlersForWebView:_webView]; | 4614 [messageRouter removeAllScriptMessageHandlersForWebView:_webView]; |
4648 } | 4615 } |
4649 [_webView setNavigationDelegate:nil]; | 4616 [_webView setNavigationDelegate:nil]; |
4650 [_webView setUIDelegate:nil]; | 4617 [_webView setUIDelegate:nil]; |
4651 for (NSString* keyPath in self.WKWebViewObservers) { | 4618 for (NSString* keyPath in self.observedKeyPaths) { |
4652 [_webView removeObserver:self forKeyPath:keyPath]; | 4619 [_webView removeObserver:self forKeyPath:keyPath]; |
4653 } | 4620 } |
4654 [self clearActivityIndicatorTasks]; | 4621 [self clearActivityIndicatorTasks]; |
4655 | 4622 |
4656 _webView.reset([webView retain]); | 4623 _webView.reset(webView); |
4657 | 4624 |
4658 // Set up the new web view. | 4625 // Set up the new web view. |
4659 if (webView) { | 4626 if (webView) { |
4660 base::WeakNSObject<CRWWebController> weakSelf(self); | 4627 __weak CRWWebController* weakSelf = self; |
4661 [messageRouter setScriptMessageHandler:^(WKScriptMessage* message) { | 4628 [messageRouter setScriptMessageHandler:^(WKScriptMessage* message) { |
4662 [weakSelf didReceiveScriptMessage:message]; | 4629 [weakSelf didReceiveScriptMessage:message]; |
4663 } | 4630 } |
4664 name:kScriptMessageName | 4631 name:kScriptMessageName |
4665 webView:webView]; | 4632 webView:webView]; |
4666 _windowIDJSManager.reset( | 4633 _windowIDJSManager.reset( |
4667 [[CRWJSWindowIDManager alloc] initWithWebView:webView]); | 4634 [[CRWJSWindowIDManager alloc] initWithWebView:webView]); |
4668 } else { | 4635 } else { |
4669 _windowIDJSManager.reset(); | 4636 _windowIDJSManager.reset(); |
4670 } | 4637 } |
4671 [_webView setNavigationDelegate:self]; | 4638 [_webView setNavigationDelegate:self]; |
4672 [_webView setUIDelegate:self]; | 4639 [_webView setUIDelegate:self]; |
4673 for (NSString* keyPath in self.WKWebViewObservers) { | 4640 for (NSString* keyPath in self.observedKeyPaths) { |
4674 [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr]; | 4641 [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr]; |
4675 } | 4642 } |
4676 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); | 4643 _injectedScriptManagers.reset([[NSMutableSet alloc] init]); |
4677 [self setDocumentURL:_defaultURL]; | 4644 [self setDocumentURL:_defaultURL]; |
4678 } | 4645 } |
4679 | 4646 |
4680 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache { | 4647 - (void)removeWebViewAllowingCachedReconstruction:(BOOL)allowCache { |
4681 if (!_webView) | 4648 if (!_webView) |
4682 return; | 4649 return; |
4683 | 4650 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4719 // This happens during tests. | 4686 // This happens during tests. |
4720 if (!_webView) { | 4687 if (!_webView) { |
4721 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 4688 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
4722 } | 4689 } |
4723 | 4690 |
4724 std::string MIMEType = self.webState->GetContentsMimeType(); | 4691 std::string MIMEType = self.webState->GetContentsMimeType(); |
4725 return [self documentTypeFromMIMEType:base::SysUTF8ToNSString(MIMEType)]; | 4692 return [self documentTypeFromMIMEType:base::SysUTF8ToNSString(MIMEType)]; |
4726 } | 4693 } |
4727 | 4694 |
4728 - (void)loadRequest:(NSMutableURLRequest*)request { | 4695 - (void)loadRequest:(NSMutableURLRequest*)request { |
4729 _latestWKNavigation.reset([[_webView loadRequest:request] retain]); | 4696 _latestWKNavigation.reset([_webView loadRequest:request]); |
4730 } | 4697 } |
4731 | 4698 |
4732 - (void)loadPOSTRequest:(NSMutableURLRequest*)request { | 4699 - (void)loadPOSTRequest:(NSMutableURLRequest*)request { |
4733 if (!_POSTRequestLoader) { | 4700 if (!_POSTRequestLoader) { |
4734 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]); | 4701 _POSTRequestLoader.reset([[CRWJSPOSTRequestLoader alloc] init]); |
4735 } | 4702 } |
4736 | 4703 |
4737 CRWWKScriptMessageRouter* messageRouter = | 4704 CRWWKScriptMessageRouter* messageRouter = |
4738 [self webViewConfigurationProvider].GetScriptMessageRouter(); | 4705 [self webViewConfigurationProvider].GetScriptMessageRouter(); |
4739 | 4706 |
(...skipping 25 matching lines...) Expand all Loading... |
4765 - (void)loadHTML:(NSString*)HTML forAppSpecificURL:(const GURL&)URL { | 4732 - (void)loadHTML:(NSString*)HTML forAppSpecificURL:(const GURL&)URL { |
4766 CHECK(web::GetWebClient()->IsAppSpecificURL(URL)); | 4733 CHECK(web::GetWebClient()->IsAppSpecificURL(URL)); |
4767 [self loadHTML:HTML forURL:URL]; | 4734 [self loadHTML:HTML forURL:URL]; |
4768 } | 4735 } |
4769 | 4736 |
4770 - (void)loadHTMLForCurrentURL:(NSString*)HTML { | 4737 - (void)loadHTMLForCurrentURL:(NSString*)HTML { |
4771 [self loadHTML:HTML forURL:self.currentURL]; | 4738 [self loadHTML:HTML forURL:self.currentURL]; |
4772 } | 4739 } |
4773 | 4740 |
4774 - (void)stopLoading { | 4741 - (void)stopLoading { |
4775 _stoppedWKNavigation.reset(_latestWKNavigation); | 4742 _stoppedWKNavigation = _latestWKNavigation; |
4776 | 4743 |
4777 base::RecordAction(UserMetricsAction("Stop")); | 4744 base::RecordAction(UserMetricsAction("Stop")); |
4778 // Discard the pending and transient entried before notifying the tab model | 4745 // Discard the pending and transient entried before notifying the tab model |
4779 // observers of the change via |-abortLoad|. | 4746 // observers of the change via |-abortLoad|. |
4780 [[self sessionController] discardNonCommittedEntries]; | 4747 [[self sessionController] discardNonCommittedEntries]; |
4781 [self abortLoad]; | 4748 [self abortLoad]; |
4782 // If discarding the non-committed entries results in an app-specific URL, | 4749 // If discarding the non-committed entries results in an app-specific URL, |
4783 // reload it in its native view. | 4750 // reload it in its native view. |
4784 if (!self.nativeController && | 4751 if (!self.nativeController && |
4785 [self shouldLoadURLInNativeView:[self currentNavigationURL]]) { | 4752 [self shouldLoadURLInNativeView:[self currentNavigationURL]]) { |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5050 [self loadWithParams:params]; | 5017 [self loadWithParams:params]; |
5051 } | 5018 } |
5052 return; | 5019 return; |
5053 } else { | 5020 } else { |
5054 [self registerLoadRequest:webViewURL]; | 5021 [self registerLoadRequest:webViewURL]; |
5055 } | 5022 } |
5056 } | 5023 } |
5057 // Ensure the URL is registered and loadPhase is as expected. | 5024 // Ensure the URL is registered and loadPhase is as expected. |
5058 DCHECK(_lastRegisteredRequestURL == webViewURL); | 5025 DCHECK(_lastRegisteredRequestURL == webViewURL); |
5059 DCHECK(self.loadPhase == web::LOAD_REQUESTED); | 5026 DCHECK(self.loadPhase == web::LOAD_REQUESTED); |
5060 _latestWKNavigation.reset([navigation retain]); | 5027 _latestWKNavigation.reset(navigation); |
5061 } | 5028 } |
5062 | 5029 |
5063 - (void)webView:(WKWebView*)webView | 5030 - (void)webView:(WKWebView*)webView |
5064 didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation { | 5031 didReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation { |
5065 [self registerLoadRequest:net::GURLWithNSURL(webView.URL) | 5032 [self registerLoadRequest:net::GURLWithNSURL(webView.URL) |
5066 referrer:[self currentReferrer] | 5033 referrer:[self currentReferrer] |
5067 transition:ui::PAGE_TRANSITION_SERVER_REDIRECT]; | 5034 transition:ui::PAGE_TRANSITION_SERVER_REDIRECT]; |
5068 } | 5035 } |
5069 | 5036 |
5070 - (void)webView:(WKWebView*)webView | 5037 - (void)webView:(WKWebView*)webView |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5196 } | 5163 } |
5197 | 5164 |
5198 if (![authMethod isEqual:NSURLAuthenticationMethodServerTrust]) { | 5165 if (![authMethod isEqual:NSURLAuthenticationMethodServerTrust]) { |
5199 completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, nil); | 5166 completionHandler(NSURLSessionAuthChallengeRejectProtectionSpace, nil); |
5200 return; | 5167 return; |
5201 } | 5168 } |
5202 | 5169 |
5203 SecTrustRef trust = challenge.protectionSpace.serverTrust; | 5170 SecTrustRef trust = challenge.protectionSpace.serverTrust; |
5204 base::ScopedCFTypeRef<SecTrustRef> scopedTrust(trust, | 5171 base::ScopedCFTypeRef<SecTrustRef> scopedTrust(trust, |
5205 base::scoped_policy::RETAIN); | 5172 base::scoped_policy::RETAIN); |
5206 base::WeakNSObject<CRWWebController> weakSelf(self); | 5173 __weak CRWWebController* weakSelf = self; |
5207 [_certVerificationController | 5174 [_certVerificationController |
5208 decideLoadPolicyForTrust:scopedTrust | 5175 decideLoadPolicyForTrust:scopedTrust |
5209 host:challenge.protectionSpace.host | 5176 host:challenge.protectionSpace.host |
5210 completionHandler:^(web::CertAcceptPolicy policy, | 5177 completionHandler:^(web::CertAcceptPolicy policy, |
5211 net::CertStatus status) { | 5178 net::CertStatus status) { |
5212 base::scoped_nsobject<CRWWebController> strongSelf( | 5179 base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
5213 [weakSelf retain]); | |
5214 if (!strongSelf) { | 5180 if (!strongSelf) { |
5215 completionHandler( | 5181 completionHandler( |
5216 NSURLSessionAuthChallengeRejectProtectionSpace, nil); | 5182 NSURLSessionAuthChallengeRejectProtectionSpace, nil); |
5217 return; | 5183 return; |
5218 } | 5184 } |
5219 [strongSelf processAuthChallenge:challenge | 5185 [strongSelf processAuthChallenge:challenge |
5220 forCertAcceptPolicy:policy | 5186 forCertAcceptPolicy:policy |
5221 certStatus:status | 5187 certStatus:status |
5222 completionHandler:completionHandler]; | 5188 completionHandler:completionHandler]; |
5223 }]; | 5189 }]; |
(...skipping 25 matching lines...) Expand all Loading... |
5249 } | 5215 } |
5250 } | 5216 } |
5251 | 5217 |
5252 #pragma mark - | 5218 #pragma mark - |
5253 #pragma mark KVO Observation | 5219 #pragma mark KVO Observation |
5254 | 5220 |
5255 - (void)observeValueForKeyPath:(NSString*)keyPath | 5221 - (void)observeValueForKeyPath:(NSString*)keyPath |
5256 ofObject:(id)object | 5222 ofObject:(id)object |
5257 change:(NSDictionary*)change | 5223 change:(NSDictionary*)change |
5258 context:(void*)context { | 5224 context:(void*)context { |
5259 NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath]; | 5225 // All observed keypaths have to be present in |self.observedKeyPaths|. |
5260 DCHECK(dispatcherSelectorName); | 5226 DCHECK([self.observedKeyPaths containsObject:keyPath]); |
5261 if (dispatcherSelectorName) | 5227 |
5262 [self performSelector:NSSelectorFromString(dispatcherSelectorName)]; | 5228 if ([keyPath isEqualToString:@"certificateChain"]) { |
| 5229 [self webViewSecurityFeaturesDidChange]; |
| 5230 } else if ([keyPath isEqualToString:@"estimatedProgress"]) { |
| 5231 [self webViewEstimatedProgressDidChange]; |
| 5232 } else if ([keyPath isEqualToString:@"hasOnlySecureContent"]) { |
| 5233 [self webViewSecurityFeaturesDidChange]; |
| 5234 } else if ([keyPath isEqualToString:@"loading"]) { |
| 5235 [self webViewLoadingStateDidChange]; |
| 5236 } else if ([keyPath isEqualToString:@"title"]) { |
| 5237 [self webViewTitleDidChange]; |
| 5238 } else if ([keyPath isEqualToString:@"URL"]) { |
| 5239 [self webViewURLDidChange]; |
| 5240 } else { |
| 5241 DCHECK(false); |
| 5242 } |
5263 } | 5243 } |
5264 | 5244 |
5265 - (void)webViewEstimatedProgressDidChange { | 5245 - (void)webViewEstimatedProgressDidChange { |
5266 if (!_isBeingDestroyed) { | 5246 if (!_isBeingDestroyed) { |
5267 self.webStateImpl->SendChangeLoadProgress([_webView estimatedProgress]); | 5247 self.webStateImpl->SendChangeLoadProgress([_webView estimatedProgress]); |
5268 } | 5248 } |
5269 } | 5249 } |
5270 | 5250 |
5271 - (void)webViewSecurityFeaturesDidChange { | 5251 - (void)webViewSecurityFeaturesDidChange { |
5272 if (self.loadPhase == web::LOAD_REQUESTED) { | 5252 if (self.loadPhase == web::LOAD_REQUESTED) { |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5632 } | 5612 } |
5633 | 5613 |
5634 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 5614 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
5635 } | 5615 } |
5636 | 5616 |
5637 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { | 5617 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { |
5638 return [action.request valueForHTTPHeaderField:@"Referer"]; | 5618 return [action.request valueForHTTPHeaderField:@"Referer"]; |
5639 } | 5619 } |
5640 | 5620 |
5641 @end | 5621 @end |
OLD | NEW |