| Index: ios/web/web_state/ui/crw_web_controller.mm
|
| diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm
|
| index 300da72f70b26c2a4c96bfb56050819f4f138a1f..3a16eb13445920cfaa8c413a01d9ae1cd561f1c4 100644
|
| --- a/ios/web/web_state/ui/crw_web_controller.mm
|
| +++ b/ios/web/web_state/ui/crw_web_controller.mm
|
| @@ -18,12 +18,14 @@
|
| #include "base/ios/block_types.h"
|
| #include "base/ios/ios_util.h"
|
| #import "base/ios/ns_error_util.h"
|
| +#include "base/ios/weak_nsobject.h"
|
| #include "base/json/json_reader.h"
|
| #include "base/json/string_escape.h"
|
| #include "base/logging.h"
|
| #include "base/mac/bind_objc_block.h"
|
| #include "base/mac/bundle_locations.h"
|
| #include "base/mac/foundation_util.h"
|
| +#include "base/mac/objc_property_releaser.h"
|
| #include "base/mac/scoped_cftyperef.h"
|
| #include "base/mac/scoped_nsobject.h"
|
| #include "base/metrics/histogram.h"
|
| @@ -105,10 +107,6 @@
|
| #include "url/gurl.h"
|
| #include "url/url_constants.h"
|
|
|
| -#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| -#error "This file requires ARC support."
|
| -#endif
|
| -
|
| using base::UserMetricsAction;
|
| using web::NavigationManager;
|
| using web::NavigationManagerImpl;
|
| @@ -253,7 +251,10 @@
|
| // A container object for any navigation information that is only available
|
| // during pre-commit delegate callbacks, and thus must be held until the
|
| // navigation commits and the informatino can be used.
|
| -@interface CRWWebControllerPendingNavigationInfo : NSObject
|
| +@interface CRWWebControllerPendingNavigationInfo : NSObject {
|
| + base::mac::ObjCPropertyReleaser
|
| + _propertyReleaser_CRWWebControllerPendingNavigationInfo;
|
| +}
|
| // The referrer for the page.
|
| @property(nonatomic, copy) NSString* referrer;
|
| // The MIME type for the page.
|
| @@ -278,6 +279,8 @@
|
|
|
| - (instancetype)init {
|
| if ((self = [super init])) {
|
| + _propertyReleaser_CRWWebControllerPendingNavigationInfo.Init(
|
| + self, [CRWWebControllerPendingNavigationInfo class]);
|
| _navigationType = WKNavigationTypeOther;
|
| }
|
| return self;
|
| @@ -291,6 +294,10 @@
|
| CRWWebViewScrollViewProxyObserver,
|
| WKNavigationDelegate,
|
| WKUIDelegate> {
|
| + base::WeakNSProtocol<id<CRWWebDelegate>> _delegate;
|
| + base::WeakNSProtocol<id<CRWWebUserInterfaceDelegate>> _UIDelegate;
|
| + base::WeakNSProtocol<id<CRWNativeContentProvider>> _nativeProvider;
|
| + base::WeakNSProtocol<id<CRWSwipeRecognizerProvider>> _swipeRecognizerProvider;
|
| // The WKWebView managed by this instance.
|
| base::scoped_nsobject<WKWebView> _webView;
|
| // The CRWWebViewProxy is the wrapper to give components access to the
|
| @@ -449,7 +456,7 @@
|
| // The WKNavigation captured when |stopLoading| was called. Used for reporting
|
| // WebController.EmptyNavigationManagerCausedByStopLoading UMA metric which
|
| // helps with diagnosing a navigation related crash (crbug.com/565457).
|
| - __weak WKNavigation* _stoppedWKNavigation;
|
| + base::WeakNSObject<WKNavigation> _stoppedWKNavigation;
|
|
|
| // CRWWebUIManager object for loading WebUI pages.
|
| base::scoped_nsobject<CRWWebUIManager> _webUIManager;
|
| @@ -473,23 +480,26 @@
|
|
|
| // If |contentView_| contains a web view, this is the web view it contains.
|
| // If not, it's nil.
|
| -@property(nonatomic, strong, readonly) WKWebView* webView;
|
| +@property(nonatomic, readonly) WKWebView* webView;
|
| // The scroll view of |webView|.
|
| -@property(nonatomic, strong, readonly) UIScrollView* webScrollView;
|
| +@property(nonatomic, readonly) UIScrollView* webScrollView;
|
| // The current page state of the web view. Writing to this property
|
| // asynchronously applies the passed value to the current web view.
|
| @property(nonatomic, readwrite) web::PageDisplayState pageDisplayState;
|
| // The currently displayed native controller, if any.
|
| -@property(nonatomic, strong) id<CRWNativeContent> nativeController;
|
| +@property(nonatomic, readwrite) id<CRWNativeContent> nativeController;
|
| // Returns NavigationManager's session controller.
|
| -@property(nonatomic, strong, readonly) CRWSessionController* sessionController;
|
| +@property(nonatomic, readonly) CRWSessionController* sessionController;
|
| // Activity indicator group ID for this web controller.
|
| -@property(nonatomic, copy, readonly) NSString* activityIndicatorGroupID;
|
| -// List of keypaths observed on WKWebView. All KVO-observed keypaths have to
|
| -// be added to this list.
|
| -@property(nonatomic, strong, readonly) NSArray* observedKeyPaths;
|
| +@property(nonatomic, readonly) NSString* activityIndicatorGroupID;
|
| +// Dictionary where keys are the names of WKWebView properties and values are
|
| +// selector names which should be called when a corresponding property has
|
| +// changed. e.g. @{ @"URL" : @"webViewURLDidChange" } means that
|
| +// -[self webViewURLDidChange] must be called every time when WKWebView.URL is
|
| +// changed.
|
| +@property(nonatomic, readonly) NSDictionary* WKWebViewObservers;
|
| // Downloader for PassKit files. Lazy initialized.
|
| -@property(nonatomic, strong, readonly) CRWPassKitDownloader* passKitDownloader;
|
| +@property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader;
|
|
|
| // The web view's view of the current URL. During page transitions
|
| // this may not be the same as the session history's view of the current URL.
|
| @@ -1018,10 +1028,6 @@
|
| @synthesize usePlaceholderOverlay = _usePlaceholderOverlay;
|
| @synthesize loadPhase = _loadPhase;
|
| @synthesize shouldSuppressDialogs = _shouldSuppressDialogs;
|
| -@synthesize delegate = _delegate;
|
| -@synthesize UIDelegate = _UIDelegate;
|
| -@synthesize nativeProvider = _nativeProvider;
|
| -@synthesize swipeRecognizerProvider = _swipeRecognizerProvider;
|
|
|
| - (instancetype)initWithWebState:(WebStateImpl*)webState {
|
| self = [super init];
|
| @@ -1056,6 +1062,23 @@
|
| return self;
|
| }
|
|
|
| +- (id<CRWNativeContentProvider>)nativeProvider {
|
| + return _nativeProvider.get();
|
| +}
|
| +
|
| +- (void)setNativeProvider:(id<CRWNativeContentProvider>)nativeProvider {
|
| + _nativeProvider.reset(nativeProvider);
|
| +}
|
| +
|
| +- (id<CRWSwipeRecognizerProvider>)swipeRecognizerProvider {
|
| + return _swipeRecognizerProvider.get();
|
| +}
|
| +
|
| +- (void)setSwipeRecognizerProvider:
|
| + (id<CRWSwipeRecognizerProvider>)swipeRecognizerProvider {
|
| + _swipeRecognizerProvider.reset(swipeRecognizerProvider);
|
| +}
|
| +
|
| - (WebState*)webState {
|
| return _webStateImpl;
|
| }
|
| @@ -1086,15 +1109,26 @@
|
| [_containerView displayTransientContent:contentView];
|
| }
|
|
|
| +- (id<CRWWebDelegate>)delegate {
|
| + return _delegate.get();
|
| +}
|
|
|
| - (void)setDelegate:(id<CRWWebDelegate>)delegate {
|
| - _delegate = delegate;
|
| + _delegate.reset(delegate);
|
| if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) {
|
| if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)])
|
| [self.nativeController setDelegate:self];
|
| else
|
| [self.nativeController setDelegate:nil];
|
| }
|
| +}
|
| +
|
| +- (id<CRWWebUserInterfaceDelegate>)UIDelegate {
|
| + return _UIDelegate.get();
|
| +}
|
| +
|
| +- (void)setUIDelegate:(id<CRWWebUserInterfaceDelegate>)UIDelegate {
|
| + _UIDelegate.reset(UIDelegate);
|
| }
|
|
|
| - (void)dealloc {
|
| @@ -1105,6 +1139,7 @@
|
| _touchTrackingRecognizer.get().touchTrackingDelegate = nil;
|
| [[_webViewProxy scrollViewProxy] removeObserver:self];
|
| [[NSNotificationCenter defaultCenter] removeObserver:self];
|
| + [super dealloc];
|
| }
|
|
|
| - (void)dismissKeyboard {
|
| @@ -1136,11 +1171,15 @@
|
| self.webStateImpl->GetRequestGroupID()];
|
| }
|
|
|
| -- (NSArray*)observedKeyPaths {
|
| - return @[
|
| - @"certificateChain", @"estimatedProgress", @"hasOnlySecureContent",
|
| - @"loading", @"title", @"URL"
|
| - ];
|
| +- (NSDictionary*)WKWebViewObservers {
|
| + return @{
|
| + @"certificateChain" : @"webViewSecurityFeaturesDidChange",
|
| + @"estimatedProgress" : @"webViewEstimatedProgressDidChange",
|
| + @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange",
|
| + @"loading" : @"webViewLoadingStateDidChange",
|
| + @"title" : @"webViewTitleDidChange",
|
| + @"URL" : @"webViewURLDidChange",
|
| + };
|
| }
|
|
|
| // NativeControllerDelegate method, called to inform that title has changed.
|
| @@ -1286,7 +1325,7 @@
|
|
|
| web::ContextMenuParams params =
|
| [self contextMenuParamsForElement:_DOMElementForLastTouch.get()];
|
| - params.view.reset(_webView);
|
| + params.view.reset([_webView retain]);
|
| params.location = [gestureRecognizer locationInView:_webView];
|
| if (self.webStateImpl->HandleContextMenu(params)) {
|
| // Cancelling all touches has the intended side effect of suppressing the
|
| @@ -1329,7 +1368,8 @@
|
| UIImage* result = UIGraphicsGetImageFromCurrentImageContext();
|
| UIGraphicsEndImageContext();
|
|
|
| - defaultImage = [result stretchableImageWithLeftCapWidth:1 topCapHeight:1];
|
| + defaultImage =
|
| + [[result stretchableImageWithLeftCapWidth:1 topCapHeight:1] retain];
|
| }
|
| return defaultImage;
|
| }
|
| @@ -1567,7 +1607,7 @@
|
| // that the lifetimes work out.
|
| // Note that normally using the value as the key wouldn't make any
|
| // sense, but here it's fine since nothing needs to look up the value.
|
| - objc_setAssociatedObject(view, (__bridge void*)recognizer, recognizer,
|
| + objc_setAssociatedObject(view, recognizer, recognizer,
|
| OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
| }
|
| }
|
| @@ -1779,12 +1819,12 @@
|
| [script appendString:[self javaScriptToDispatchHashChangeWithOldURL:oldURL
|
| newURL:URL]];
|
| }
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| [self executeJavaScript:script
|
| completionHandler:^(id, NSError*) {
|
| - base::scoped_nsobject<CRWWebController> strongSelf(weakSelf);
|
| - if (!strongSelf || strongSelf.get()->_isBeingDestroyed)
|
| + if (!weakSelf || weakSelf.get()->_isBeingDestroyed)
|
| return;
|
| + base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]);
|
| strongSelf.get()->_URLOnStartLoading = URL;
|
| strongSelf.get()->_lastRegisteredRequestURL = URL;
|
| }];
|
| @@ -2265,7 +2305,7 @@
|
| // fromEntry is retained because it has the potential to be released
|
| // by goDelta: if it has not been committed.
|
| base::scoped_nsobject<CRWSessionEntry> fromEntry(
|
| - [sessionController currentEntry]);
|
| + [[sessionController currentEntry] retain]);
|
| [sessionController goDelta:delta];
|
| if (fromEntry) {
|
| [self finishHistoryNavigationFromEntry:fromEntry];
|
| @@ -2460,9 +2500,9 @@
|
| if (_passKitDownloader) {
|
| return _passKitDownloader.get();
|
| }
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| web::PassKitCompletionHandler passKitCompletion = ^(NSData* data) {
|
| - base::scoped_nsobject<CRWWebController> strongSelf(weakSelf);
|
| + base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]);
|
| if (!strongSelf) {
|
| return;
|
| }
|
| @@ -3079,18 +3119,16 @@
|
|
|
| NSString* replaceWebViewJS =
|
| [self javaScriptToReplaceWebViewURL:pushURL stateObjectJSON:stateObject];
|
| - __weak CRWWebController* weakSelf = self;
|
| - [self executeJavaScript:replaceWebViewJS
|
| - completionHandler:^(id, NSError*) {
|
| - base::scoped_nsobject<CRWWebController> strongSelf(weakSelf);
|
| - if (!strongSelf || strongSelf.get()->_isBeingDestroyed)
|
| - return;
|
| - [strongSelf optOutScrollsToTopForSubviews];
|
| - // Notify the observers.
|
| - strongSelf.get()->_webStateImpl->OnHistoryStateChanged();
|
| - [strongSelf didFinishNavigation];
|
| - }];
|
| -
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| + [self executeJavaScript:replaceWebViewJS completionHandler:^(id, NSError*) {
|
| + if (!weakSelf || weakSelf.get()->_isBeingDestroyed)
|
| + return;
|
| + base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]);
|
| + [strongSelf optOutScrollsToTopForSubviews];
|
| + // Notify the observers.
|
| + strongSelf.get()->_webStateImpl->OnHistoryStateChanged();
|
| + [strongSelf didFinishNavigation];
|
| + }];
|
| return YES;
|
| }
|
|
|
| @@ -3140,14 +3178,13 @@
|
| [self replaceStateWithPageURL:replaceURL stateObject:stateObject];
|
| NSString* replaceStateJS = [self javaScriptToReplaceWebViewURL:replaceURL
|
| stateObjectJSON:stateObject];
|
| - __weak CRWWebController* weakSelf = self;
|
| - [self executeJavaScript:replaceStateJS
|
| - completionHandler:^(id, NSError*) {
|
| - base::scoped_nsobject<CRWWebController> strongSelf(weakSelf);
|
| - if (!strongSelf || strongSelf.get()->_isBeingDestroyed)
|
| - return;
|
| - [strongSelf didFinishNavigation];
|
| - }];
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| + [self executeJavaScript:replaceStateJS completionHandler:^(id, NSError*) {
|
| + if (!weakSelf || weakSelf.get()->_isBeingDestroyed)
|
| + return;
|
| + base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]);
|
| + [strongSelf didFinishNavigation];
|
| + }];
|
| return YES;
|
| }
|
|
|
| @@ -3563,7 +3600,7 @@
|
| // menu and show another one. If for some reason context menu info is not
|
| // fetched - system context menu will be shown.
|
| [self setDOMElementForLastTouch:nil];
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| [self fetchDOMElementAtPoint:[touch locationInView:_webView]
|
| completionHandler:^(NSDictionary* element) {
|
| [weakSelf setDOMElementForLastTouch:element];
|
| @@ -3678,7 +3715,7 @@
|
| const GURL currentURL([self currentNavigationURL]);
|
| NSString* windowName = windowInfo.window_name.get();
|
| web::Referrer referrer(currentURL, windowInfo.referrer_policy);
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| void (^showPopupHandler)() = ^{
|
| CRWWebController* child = [[weakSelf delegate] webPageOrderedOpen:url
|
| referrer:referrer
|
| @@ -3993,12 +4030,12 @@
|
| (CRWWebViewScrollViewProxy*)webViewScrollViewProxy {
|
| _pageHasZoomed = YES;
|
|
|
| - __weak UIScrollView* weakScrollView = self.webScrollView;
|
| + base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView);
|
| [self extractViewportTagWithCompletion:^(
|
| const web::PageViewportState* viewportState) {
|
| if (!weakScrollView)
|
| return;
|
| - base::scoped_nsobject<UIScrollView> scrollView(weakScrollView);
|
| + base::scoped_nsobject<UIScrollView> scrollView([weakScrollView retain]);
|
| if (viewportState && !viewportState->viewport_tag_present() &&
|
| [scrollView minimumZoomScale] == [scrollView maximumZoomScale] &&
|
| [scrollView zoomScale] > 1.0) {
|
| @@ -4113,7 +4150,7 @@
|
| NSString* const kViewportContentQuery =
|
| @"var viewport = document.querySelector('meta[name=\"viewport\"]');"
|
| "viewport ? viewport.content : '';";
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| int itemID = currentItem->GetUniqueID();
|
| [self executeJavaScript:kViewportContentQuery
|
| completionHandler:^(id viewportContent, NSError*) {
|
| @@ -4162,7 +4199,7 @@
|
| - (void)applyPageDisplayState:(const web::PageDisplayState&)displayState {
|
| if (!displayState.IsValid())
|
| return;
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| web::PageDisplayState displayStateCopy = displayState;
|
| [self extractViewportTagWithCompletion:^(
|
| const web::PageViewportState* viewportState) {
|
| @@ -4251,7 +4288,7 @@
|
| } else {
|
| // If the page isn't loaded, store the action to update the scroll
|
| // when the page finishes loading.
|
| - __weak UIScrollView* weakScrollView = self.webScrollView;
|
| + base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView);
|
| base::scoped_nsprotocol<ProceduralBlock> action([^{
|
| [weakScrollView setContentOffset:scrollOffset];
|
| } copy]);
|
| @@ -4281,7 +4318,7 @@
|
| // scrolled).
|
| CGPoint scrollOffset = self.scrollPosition;
|
| CGFloat webViewContentWidth = self.webScrollView.contentSize.width;
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| [self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) {
|
| CGFloat scale = pageWidth / webViewContentWidth;
|
| CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale,
|
| @@ -4313,7 +4350,7 @@
|
| if (src) {
|
| params.src_url = GURL(base::SysNSStringToUTF8(src));
|
| if (!title)
|
| - title = [src copy];
|
| + title = [[src copy] autorelease];
|
| if ([title hasPrefix:base::SysUTF8ToNSString(url::kDataScheme)])
|
| title = nil;
|
| }
|
| @@ -4388,7 +4425,7 @@
|
| web::ReferrerPolicyFromString(referrerPolicyString);
|
| web::Referrer referrer(sourceURL, referrerPolicy);
|
| NSString* const kWindowName = @""; // obsoleted
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| void (^showPopupHandler)() = ^{
|
| // On Desktop cross-window comunication is not supported for unblocked
|
| // popups; so it's ok to create a new independent page.
|
| @@ -4406,7 +4443,7 @@
|
|
|
| - (void)didBlockPopupWithURL:(GURL)popupURL sourceURL:(GURL)sourceURL {
|
| if ([_delegate respondsToSelector:@selector(webController:didBlockPopup:)]) {
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| dispatch_async(dispatch_get_main_queue(), ^{
|
| [self queryPageReferrerPolicy:^(NSString* policy) {
|
| [weakSelf didBlockPopupWithURL:popupURL
|
| @@ -4672,9 +4709,9 @@
|
| }
|
|
|
| - (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config {
|
| - return web::CreateWKWebView(CGRectZero, config,
|
| - self.webStateImpl->GetBrowserState(),
|
| - [self useDesktopUserAgent]);
|
| + return [web::CreateWKWebView(CGRectZero, config,
|
| + self.webStateImpl->GetBrowserState(),
|
| + [self useDesktopUserAgent]) autorelease];
|
| }
|
|
|
| - (void)setWebView:(WKWebView*)webView {
|
| @@ -4690,16 +4727,16 @@
|
| }
|
| [_webView setNavigationDelegate:nil];
|
| [_webView setUIDelegate:nil];
|
| - for (NSString* keyPath in self.observedKeyPaths) {
|
| + for (NSString* keyPath in self.WKWebViewObservers) {
|
| [_webView removeObserver:self forKeyPath:keyPath];
|
| }
|
| [self clearActivityIndicatorTasks];
|
|
|
| - _webView.reset(webView);
|
| + _webView.reset([webView retain]);
|
|
|
| // Set up the new web view.
|
| if (webView) {
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| [messageRouter setScriptMessageHandler:^(WKScriptMessage* message) {
|
| [weakSelf didReceiveScriptMessage:message];
|
| }
|
| @@ -4712,7 +4749,7 @@
|
| }
|
| [_webView setNavigationDelegate:self];
|
| [_webView setUIDelegate:self];
|
| - for (NSString* keyPath in self.observedKeyPaths) {
|
| + for (NSString* keyPath in self.WKWebViewObservers) {
|
| [_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr];
|
| }
|
| _injectedScriptManagers.reset([[NSMutableSet alloc] init]);
|
| @@ -4768,7 +4805,7 @@
|
| }
|
|
|
| - (void)loadRequest:(NSMutableURLRequest*)request {
|
| - _latestWKNavigation.reset([_webView loadRequest:request]);
|
| + _latestWKNavigation.reset([[_webView loadRequest:request] retain]);
|
| }
|
|
|
| - (void)loadPOSTRequest:(NSMutableURLRequest*)request {
|
| @@ -4814,7 +4851,7 @@
|
| }
|
|
|
| - (void)stopLoading {
|
| - _stoppedWKNavigation = _latestWKNavigation;
|
| + _stoppedWKNavigation.reset(_latestWKNavigation);
|
|
|
| base::RecordAction(UserMetricsAction("Stop"));
|
| // Discard the pending and transient entried before notifying the tab model
|
| @@ -5111,7 +5148,7 @@
|
| // Ensure the URL is registered and loadPhase is as expected.
|
| DCHECK(_lastRegisteredRequestURL == webViewURL);
|
| DCHECK(self.loadPhase == web::LOAD_REQUESTED);
|
| - _latestWKNavigation.reset(navigation);
|
| + _latestWKNavigation.reset([navigation retain]);
|
| }
|
|
|
| - (void)webView:(WKWebView*)webView
|
| @@ -5260,13 +5297,14 @@
|
| SecTrustRef trust = challenge.protectionSpace.serverTrust;
|
| base::ScopedCFTypeRef<SecTrustRef> scopedTrust(trust,
|
| base::scoped_policy::RETAIN);
|
| - __weak CRWWebController* weakSelf = self;
|
| + base::WeakNSObject<CRWWebController> weakSelf(self);
|
| [_certVerificationController
|
| decideLoadPolicyForTrust:scopedTrust
|
| host:challenge.protectionSpace.host
|
| completionHandler:^(web::CertAcceptPolicy policy,
|
| net::CertStatus status) {
|
| - base::scoped_nsobject<CRWWebController> strongSelf(weakSelf);
|
| + base::scoped_nsobject<CRWWebController> strongSelf(
|
| + [weakSelf retain]);
|
| if (!strongSelf) {
|
| completionHandler(
|
| NSURLSessionAuthChallengeRejectProtectionSpace, nil);
|
| @@ -5312,23 +5350,10 @@
|
| ofObject:(id)object
|
| change:(NSDictionary*)change
|
| context:(void*)context {
|
| - // All observed keypaths have to be present in |self.observedKeyPaths|.
|
| - DCHECK([self.observedKeyPaths containsObject:keyPath]);
|
| - if ([keyPath isEqualToString:@"certificateChain"]) {
|
| - [self webViewSecurityFeaturesDidChange];
|
| - } else if ([keyPath isEqualToString:@"estimatedProgress"]) {
|
| - [self webViewEstimatedProgressDidChange];
|
| - } else if ([keyPath isEqualToString:@"hasOnlySecureContent"]) {
|
| - [self webViewSecurityFeaturesDidChange];
|
| - } else if ([keyPath isEqualToString:@"loading"]) {
|
| - [self webViewLoadingStateDidChange];
|
| - } else if ([keyPath isEqualToString:@"title"]) {
|
| - [self webViewTitleDidChange];
|
| - } else if ([keyPath isEqualToString:@"URL"]) {
|
| - [self webViewURLDidChange];
|
| - } else {
|
| - NOTREACHED();
|
| - }
|
| + NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath];
|
| + DCHECK(dispatcherSelectorName);
|
| + if (dispatcherSelectorName)
|
| + [self performSelector:NSSelectorFromString(dispatcherSelectorName)];
|
| }
|
|
|
| - (void)webViewEstimatedProgressDidChange {
|
|
|