OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #import "ios/web/web_state/ui/crw_web_controller.h" | 5 #import "ios/web/web_state/ui/crw_web_controller.h" |
6 | 6 |
7 #import <WebKit/WebKit.h> | 7 #import <WebKit/WebKit.h> |
8 | 8 |
9 #import <objc/runtime.h> | 9 #import <objc/runtime.h> |
10 #include <stddef.h> | 10 #include <stddef.h> |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" | 45 #import "ios/web/navigation/crw_session_certificate_policy_manager.h" |
46 #import "ios/web/navigation/crw_session_controller.h" | 46 #import "ios/web/navigation/crw_session_controller.h" |
47 #import "ios/web/navigation/crw_session_entry.h" | 47 #import "ios/web/navigation/crw_session_entry.h" |
48 #import "ios/web/navigation/navigation_item_impl.h" | 48 #import "ios/web/navigation/navigation_item_impl.h" |
49 #import "ios/web/navigation/navigation_manager_impl.h" | 49 #import "ios/web/navigation/navigation_manager_impl.h" |
50 #include "ios/web/net/cert_host_pair.h" | 50 #include "ios/web/net/cert_host_pair.h" |
51 #import "ios/web/net/crw_cert_verification_controller.h" | 51 #import "ios/web/net/crw_cert_verification_controller.h" |
52 #import "ios/web/net/crw_ssl_status_updater.h" | 52 #import "ios/web/net/crw_ssl_status_updater.h" |
53 #include "ios/web/net/request_group_util.h" | 53 #include "ios/web/net/request_group_util.h" |
54 #include "ios/web/public/browser_state.h" | 54 #include "ios/web/public/browser_state.h" |
55 #include "ios/web/public/cert_store.h" | |
56 #include "ios/web/public/favicon_url.h" | 55 #include "ios/web/public/favicon_url.h" |
57 #import "ios/web/public/java_script_dialog_presenter.h" | 56 #import "ios/web/public/java_script_dialog_presenter.h" |
58 #include "ios/web/public/navigation_item.h" | 57 #include "ios/web/public/navigation_item.h" |
59 #import "ios/web/public/navigation_manager.h" | 58 #import "ios/web/public/navigation_manager.h" |
60 #import "ios/web/public/origin_util.h" | 59 #import "ios/web/public/origin_util.h" |
61 #include "ios/web/public/referrer.h" | 60 #include "ios/web/public/referrer.h" |
62 #include "ios/web/public/referrer_util.h" | 61 #include "ios/web/public/referrer_util.h" |
63 #include "ios/web/public/ssl_status.h" | 62 #include "ios/web/public/ssl_status.h" |
64 #import "ios/web/public/url_scheme_util.h" | 63 #import "ios/web/public/url_scheme_util.h" |
65 #include "ios/web/public/url_util.h" | 64 #include "ios/web/public/url_util.h" |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
485 @property(nonatomic, readonly) UIScrollView* webScrollView; | 484 @property(nonatomic, readonly) UIScrollView* webScrollView; |
486 // The current page state of the web view. Writing to this property | 485 // The current page state of the web view. Writing to this property |
487 // asynchronously applies the passed value to the current web view. | 486 // asynchronously applies the passed value to the current web view. |
488 @property(nonatomic, readwrite) web::PageDisplayState pageDisplayState; | 487 @property(nonatomic, readwrite) web::PageDisplayState pageDisplayState; |
489 // The currently displayed native controller, if any. | 488 // The currently displayed native controller, if any. |
490 @property(nonatomic, readwrite) id<CRWNativeContent> nativeController; | 489 @property(nonatomic, readwrite) id<CRWNativeContent> nativeController; |
491 // Returns NavigationManager's session controller. | 490 // Returns NavigationManager's session controller. |
492 @property(nonatomic, readonly) CRWSessionController* sessionController; | 491 @property(nonatomic, readonly) CRWSessionController* sessionController; |
493 // Activity indicator group ID for this web controller. | 492 // Activity indicator group ID for this web controller. |
494 @property(nonatomic, readonly) NSString* activityIndicatorGroupID; | 493 @property(nonatomic, readonly) NSString* activityIndicatorGroupID; |
495 // Identifier used for storing and retrieving certificates. | |
496 @property(nonatomic, readonly) int certGroupID; | |
497 // Dictionary where keys are the names of WKWebView properties and values are | 494 // Dictionary where keys are the names of WKWebView properties and values are |
498 // selector names which should be called when a corresponding property has | 495 // selector names which should be called when a corresponding property has |
499 // changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that | 496 // changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that |
500 // -[self webViewURLDidChange] must be called every time when WKWebView.URL is | 497 // -[self webViewURLDidChange] must be called every time when WKWebView.URL is |
501 // changed. | 498 // changed. |
502 @property(nonatomic, readonly) NSDictionary* WKWebViewObservers; | 499 @property(nonatomic, readonly) NSDictionary* WKWebViewObservers; |
503 // Downloader for PassKit files. Lazy initialized. | 500 // Downloader for PassKit files. Lazy initialized. |
504 @property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; | 501 @property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; |
505 | 502 |
506 // The web view's view of the current URL. During page transitions | 503 // The web view's view of the current URL. During page transitions |
(...skipping 640 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1147 [_containerView displayNativeContent:nativeController]; | 1144 [_containerView displayNativeContent:nativeController]; |
1148 [self setNativeControllerWebUsageEnabled:_webUsageEnabled]; | 1145 [self setNativeControllerWebUsageEnabled:_webUsageEnabled]; |
1149 } | 1146 } |
1150 | 1147 |
1151 - (NSString*)activityIndicatorGroupID { | 1148 - (NSString*)activityIndicatorGroupID { |
1152 return [NSString | 1149 return [NSString |
1153 stringWithFormat:@"WebController.NetworkActivityIndicatorKey.%@", | 1150 stringWithFormat:@"WebController.NetworkActivityIndicatorKey.%@", |
1154 self.webStateImpl->GetRequestGroupID()]; | 1151 self.webStateImpl->GetRequestGroupID()]; |
1155 } | 1152 } |
1156 | 1153 |
1157 - (int)certGroupID { | |
1158 return self.webState->GetCertGroupId(); | |
1159 } | |
1160 | |
1161 - (NSDictionary*)WKWebViewObservers { | 1154 - (NSDictionary*)WKWebViewObservers { |
1162 return @{ | 1155 return @{ |
1163 @"certificateChain" : @"webViewSecurityFeaturesDidChange", | 1156 @"certificateChain" : @"webViewSecurityFeaturesDidChange", |
1164 @"estimatedProgress" : @"webViewEstimatedProgressDidChange", | 1157 @"estimatedProgress" : @"webViewEstimatedProgressDidChange", |
1165 @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange", | 1158 @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange", |
1166 @"loading" : @"webViewLoadingStateDidChange", | 1159 @"loading" : @"webViewLoadingStateDidChange", |
1167 @"title" : @"webViewTitleDidChange", | 1160 @"title" : @"webViewTitleDidChange", |
1168 @"URL" : @"webViewURLDidChange", | 1161 @"URL" : @"webViewURLDidChange", |
1169 }; | 1162 }; |
1170 } | 1163 } |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1243 - (BOOL)isViewAlive { | 1236 - (BOOL)isViewAlive { |
1244 return !_webProcessIsDead && [_containerView isViewAlive]; | 1237 return !_webProcessIsDead && [_containerView isViewAlive]; |
1245 } | 1238 } |
1246 | 1239 |
1247 - (BOOL)contentIsHTML { | 1240 - (BOOL)contentIsHTML { |
1248 return [self webViewDocumentType] == web::WEB_VIEW_DOCUMENT_TYPE_HTML; | 1241 return [self webViewDocumentType] == web::WEB_VIEW_DOCUMENT_TYPE_HTML; |
1249 } | 1242 } |
1250 | 1243 |
1251 // Stop doing stuff, especially network stuff. Close the request tracker. | 1244 // Stop doing stuff, especially network stuff. Close the request tracker. |
1252 - (void)terminateNetworkActivity { | 1245 - (void)terminateNetworkActivity { |
1253 web::CertStore::GetInstance()->RemoveCertsForGroup(self.certGroupID); | |
1254 | |
1255 DCHECK(!_isHalted); | 1246 DCHECK(!_isHalted); |
1256 _isHalted = YES; | 1247 _isHalted = YES; |
1257 | 1248 |
1258 // Cancel all outstanding perform requests, and clear anything already queued | 1249 // Cancel all outstanding perform requests, and clear anything already queued |
1259 // (since this may be called from within the handling loop) to prevent any | 1250 // (since this may be called from within the handling loop) to prevent any |
1260 // asynchronous JavaScript invocation handling from continuing. | 1251 // asynchronous JavaScript invocation handling from continuing. |
1261 [NSObject cancelPreviousPerformRequestsWithTarget:self]; | 1252 [NSObject cancelPreviousPerformRequestsWithTarget:self]; |
1262 _webStateImpl->CloseRequestTracker(); | 1253 _webStateImpl->CloseRequestTracker(); |
1263 } | 1254 } |
1264 | 1255 |
(...skipping 3189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4454 | 4445 |
4455 web::NavigationManager* navManager = self.webState->GetNavigationManager(); | 4446 web::NavigationManager* navManager = self.webState->GetNavigationManager(); |
4456 web::NavigationItem* currentNavItem = navManager->GetLastCommittedItem(); | 4447 web::NavigationItem* currentNavItem = navManager->GetLastCommittedItem(); |
4457 if (!currentNavItem) { | 4448 if (!currentNavItem) { |
4458 return; | 4449 return; |
4459 } | 4450 } |
4460 | 4451 |
4461 if (!_SSLStatusUpdater) { | 4452 if (!_SSLStatusUpdater) { |
4462 _SSLStatusUpdater.reset([[CRWSSLStatusUpdater alloc] | 4453 _SSLStatusUpdater.reset([[CRWSSLStatusUpdater alloc] |
4463 initWithDataSource:self | 4454 initWithDataSource:self |
4464 navigationManager:navManager | 4455 navigationManager:navManager]); |
4465 certGroupID:self.certGroupID]); | |
4466 [_SSLStatusUpdater setDelegate:self]; | 4456 [_SSLStatusUpdater setDelegate:self]; |
4467 } | 4457 } |
4468 NSString* host = base::SysUTF8ToNSString(_documentURL.host()); | 4458 NSString* host = base::SysUTF8ToNSString(_documentURL.host()); |
4469 BOOL hasOnlySecureContent = [_webView hasOnlySecureContent]; | 4459 BOOL hasOnlySecureContent = [_webView hasOnlySecureContent]; |
4470 base::ScopedCFTypeRef<SecTrustRef> trust; | 4460 base::ScopedCFTypeRef<SecTrustRef> trust; |
4471 // TODO(crbug.com/628696): Remove these guards after moving to iOS10 SDK. | 4461 // TODO(crbug.com/628696): Remove these guards after moving to iOS10 SDK. |
4472 #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 | 4462 #if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 |
4473 if (base::ios::IsRunningOnIOS10OrLater()) { | 4463 if (base::ios::IsRunningOnIOS10OrLater()) { |
4474 trust.reset([_webView serverTrust], base::scoped_policy::RETAIN); | 4464 trust.reset([_webView serverTrust], base::scoped_policy::RETAIN); |
4475 } else { | 4465 } else { |
(...skipping 24 matching lines...) Expand all Loading... |
4500 web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); | 4490 web::GetSSLInfoFromWKWebViewSSLCertError(error, &info); |
4501 | 4491 |
4502 if (!info.cert) { | 4492 if (!info.cert) { |
4503 // |info.cert| can be null if certChain in NSError is empty or can not be | 4493 // |info.cert| can be null if certChain in NSError is empty or can not be |
4504 // parsed, in this case do not ask delegate if error should be allowed, it | 4494 // parsed, in this case do not ask delegate if error should be allowed, it |
4505 // should not be. | 4495 // should not be. |
4506 [self handleLoadError:error inMainFrame:YES]; | 4496 [self handleLoadError:error inMainFrame:YES]; |
4507 return; | 4497 return; |
4508 } | 4498 } |
4509 | 4499 |
4510 web::CertStore::GetInstance()->StoreCert(info.cert.get(), self.certGroupID); | |
4511 | |
4512 // Retrieve verification results from _certVerificationErrors cache to avoid | 4500 // Retrieve verification results from _certVerificationErrors cache to avoid |
4513 // unnecessary recalculations. Verification results are cached for the leaf | 4501 // unnecessary recalculations. Verification results are cached for the leaf |
4514 // cert, because the cert chain in |didReceiveAuthenticationChallenge:| is | 4502 // cert, because the cert chain in |didReceiveAuthenticationChallenge:| is |
4515 // the OS constructed chain, while |chain| is the chain from the server. | 4503 // the OS constructed chain, while |chain| is the chain from the server. |
4516 NSArray* chain = error.userInfo[web::kNSErrorPeerCertificateChainKey]; | 4504 NSArray* chain = error.userInfo[web::kNSErrorPeerCertificateChainKey]; |
4517 NSURL* requestURL = error.userInfo[web::kNSErrorFailingURLKey]; | 4505 NSURL* requestURL = error.userInfo[web::kNSErrorFailingURLKey]; |
4518 NSString* host = [requestURL host]; | 4506 NSString* host = [requestURL host]; |
4519 scoped_refptr<net::X509Certificate> leafCert; | 4507 scoped_refptr<net::X509Certificate> leafCert; |
4520 BOOL recoverable = NO; | 4508 BOOL recoverable = NO; |
4521 if (chain.count && host.length) { | 4509 if (chain.count && host.length) { |
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5629 } | 5617 } |
5630 | 5618 |
5631 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; | 5619 return web::WEB_VIEW_DOCUMENT_TYPE_GENERIC; |
5632 } | 5620 } |
5633 | 5621 |
5634 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { | 5622 - (NSString*)refererFromNavigationAction:(WKNavigationAction*)action { |
5635 return [action.request valueForHTTPHeaderField:@"Referer"]; | 5623 return [action.request valueForHTTPHeaderField:@"Referer"]; |
5636 } | 5624 } |
5637 | 5625 |
5638 @end | 5626 @end |
OLD | NEW |