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 a1f5aa0211eef998ec0e47ebedb88e7325a85d75..44e0b9f4974e6253c8561c998172235f707dad00 100644 |
--- a/ios/web/web_state/ui/crw_web_controller.mm |
+++ b/ios/web/web_state/ui/crw_web_controller.mm |
@@ -18,14 +18,12 @@ |
#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" |
@@ -107,6 +105,10 @@ |
#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; |
@@ -251,10 +253,7 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
// 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 { |
- base::mac::ObjCPropertyReleaser |
- _propertyReleaser_CRWWebControllerPendingNavigationInfo; |
-} |
+@interface CRWWebControllerPendingNavigationInfo : NSObject |
// The referrer for the page. |
@property(nonatomic, copy) NSString* referrer; |
// The MIME type for the page. |
@@ -279,8 +278,6 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
- (instancetype)init { |
if ((self = [super init])) { |
- _propertyReleaser_CRWWebControllerPendingNavigationInfo.Init( |
- self, [CRWWebControllerPendingNavigationInfo class]); |
_navigationType = WKNavigationTypeOther; |
} |
return self; |
@@ -294,10 +291,10 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
CRWWebViewScrollViewProxyObserver, |
WKNavigationDelegate, |
WKUIDelegate> { |
- base::WeakNSProtocol<id<CRWWebDelegate>> _delegate; |
- base::WeakNSProtocol<id<CRWWebUserInterfaceDelegate>> _UIDelegate; |
- base::WeakNSProtocol<id<CRWNativeContentProvider>> _nativeProvider; |
- base::WeakNSProtocol<id<CRWSwipeRecognizerProvider>> _swipeRecognizerProvider; |
+ __weak id<CRWWebDelegate> _delegate; |
+ __weak id<CRWWebUserInterfaceDelegate> _UIDelegate; |
+ __weak id<CRWNativeContentProvider> _nativeProvider; |
+ __weak 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 |
@@ -453,7 +450,7 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
// 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). |
- base::WeakNSObject<WKNavigation> _stoppedWKNavigation; |
+ __weak WKNavigation* _stoppedWKNavigation; |
// CRWWebUIManager object for loading WebUI pages. |
base::scoped_nsobject<CRWWebUIManager> _webUIManager; |
@@ -477,26 +474,23 @@ NSError* WKWebViewErrorWithSource(NSError* error, WKWebViewErrorSource source) { |
// If |contentView_| contains a web view, this is the web view it contains. |
// If not, it's nil. |
-@property(nonatomic, readonly) WKWebView* webView; |
+@property(weak, nonatomic, readonly) WKWebView* webView; |
// The scroll view of |webView|. |
-@property(nonatomic, readonly) UIScrollView* webScrollView; |
+@property(weak, 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, readwrite) id<CRWNativeContent> nativeController; |
+@property(weak, nonatomic, readwrite) id<CRWNativeContent> nativeController; |
// Returns NavigationManager's session controller. |
-@property(nonatomic, readonly) CRWSessionController* sessionController; |
+@property(weak, nonatomic, readonly) CRWSessionController* sessionController; |
// Activity indicator group ID for this web controller. |
-@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; |
+@property(weak, nonatomic, readonly) NSString* activityIndicatorGroupID; |
+// List of keypaths observed on WKWebView. All KVO-observed keypaths have to |
+// be added to this list. |
+@property(weak, nonatomic, readonly) NSArray* observedKeyPaths; |
// Downloader for PassKit files. Lazy initialized. |
-@property(nonatomic, readonly) CRWPassKitDownloader* passKitDownloader; |
+@property(weak, 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. |
@@ -1007,6 +1001,10 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
@synthesize usePlaceholderOverlay = _usePlaceholderOverlay; |
@synthesize loadPhase = _loadPhase; |
@synthesize shouldSuppressDialogs = _shouldSuppressDialogs; |
+@synthesize nativeProvider = _nativeProvider; |
+@synthesize swipeRecognizerProvider = _swipeRecognizerProvider; |
+@synthesize UIDelegate = _UIDelegate; |
+@synthesize delegate = _delegate; |
- (instancetype)initWithWebState:(WebStateImpl*)webState { |
self = [super init]; |
@@ -1041,23 +1039,6 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
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; |
} |
@@ -1088,12 +1069,8 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
[_containerView displayTransientContent:contentView]; |
} |
-- (id<CRWWebDelegate>)delegate { |
- return _delegate.get(); |
-} |
- |
- (void)setDelegate:(id<CRWWebDelegate>)delegate { |
- _delegate.reset(delegate); |
+ _delegate = delegate; |
if ([self.nativeController respondsToSelector:@selector(setDelegate:)]) { |
if ([_delegate respondsToSelector:@selector(webController:titleDidChange:)]) |
[self.nativeController setDelegate:self]; |
@@ -1102,22 +1079,14 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
} |
-- (id<CRWWebUserInterfaceDelegate>)UIDelegate { |
- return _UIDelegate.get(); |
-} |
- |
-- (void)setUIDelegate:(id<CRWWebUserInterfaceDelegate>)UIDelegate { |
- _UIDelegate.reset(UIDelegate); |
-} |
- |
- (void)dealloc { |
DCHECK([NSThread isMainThread]); |
DCHECK(_isBeingDestroyed); // 'close' must have been called already. |
DCHECK(!_webView); |
+ [_containerView.get() setDelegate:nil]; |
_touchTrackingRecognizer.get().touchTrackingDelegate = nil; |
[[_webViewProxy scrollViewProxy] removeObserver:self]; |
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
- [super dealloc]; |
} |
- (void)dismissKeyboard { |
@@ -1149,15 +1118,11 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
self.webStateImpl->GetRequestGroupID()]; |
} |
-- (NSDictionary*)WKWebViewObservers { |
- return @{ |
- @"certificateChain" : @"webViewSecurityFeaturesDidChange", |
- @"estimatedProgress" : @"webViewEstimatedProgressDidChange", |
- @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange", |
- @"loading" : @"webViewLoadingStateDidChange", |
- @"title" : @"webViewTitleDidChange", |
- @"URL" : @"webViewURLDidChange", |
- }; |
+- (NSArray*)observedKeyPaths { |
+ return @[ |
+ @"certificateChain", @"estimatedProgress", @"hasOnlySecureContent", |
+ @"loading", @"title", @"URL" |
+ ]; |
} |
// NativeControllerDelegate method, called to inform that title has changed. |
@@ -1303,7 +1268,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
web::ContextMenuParams params = |
[self contextMenuParamsForElement:_DOMElementForLastTouch.get()]; |
- params.view.reset([_webView retain]); |
+ params.view.reset(_webView); |
params.location = [gestureRecognizer locationInView:_webView]; |
if (self.webStateImpl->HandleContextMenu(params)) { |
// Cancelling all touches has the intended side effect of suppressing the |
@@ -1346,8 +1311,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
UIImage* result = UIGraphicsGetImageFromCurrentImageContext(); |
UIGraphicsEndImageContext(); |
- defaultImage = |
- [[result stretchableImageWithLeftCapWidth:1 topCapHeight:1] retain]; |
+ defaultImage = [result stretchableImageWithLeftCapWidth:1 topCapHeight:1]; |
} |
return defaultImage; |
} |
@@ -1585,7 +1549,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// 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, recognizer, recognizer, |
+ objc_setAssociatedObject(view, (__bridge void*)recognizer, recognizer, |
OBJC_ASSOCIATION_RETAIN_NONATOMIC); |
} |
} |
@@ -1732,14 +1696,15 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
NSString* combinedJS = |
[NSString stringWithFormat:@"%@%@", replaceWebViewUrlJS, popstateJS]; |
GURL blockURL(URL); |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
- [self executeJavaScript:combinedJS completionHandler:^(id, NSError*) { |
- if (!weakSelf || weakSelf.get()->_isBeingDestroyed) |
- return; |
- base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); |
- strongSelf.get()->_URLOnStartLoading = blockURL; |
- strongSelf.get()->_lastRegisteredRequestURL = blockURL; |
- }]; |
+ __weak CRWWebController* weakSelf = self; |
+ [self executeJavaScript:combinedJS |
+ completionHandler:^(id, NSError*) { |
+ base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
+ if (!strongSelf || strongSelf.get()->_isBeingDestroyed) |
+ return; |
+ strongSelf.get()->_URLOnStartLoading = blockURL; |
+ strongSelf.get()->_lastRegisteredRequestURL = blockURL; |
+ }]; |
} |
// Load the current URL in a web view, first ensuring the web view is visible. |
@@ -2237,7 +2202,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// 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] retain]); |
+ [sessionController currentEntry]); |
[sessionController goDelta:delta]; |
if (fromEntry) { |
[self finishHistoryNavigationFromEntry:fromEntry]; |
@@ -2437,9 +2402,9 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
if (_passKitDownloader) { |
return _passKitDownloader.get(); |
} |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
web::PassKitCompletionHandler passKitCompletion = ^(NSData* data) { |
- base::scoped_nsobject<CRWWebController> strongSelf([weakSelf retain]); |
+ base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
if (!strongSelf) { |
return; |
} |
@@ -3044,16 +3009,17 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
NSString* replaceWebViewJS = |
[self javascriptToReplaceWebViewURL:pushURL stateObjectJSON:stateObject]; |
- 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]; |
- }]; |
+ __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]; |
+ }]; |
return YES; |
} |
@@ -3103,13 +3069,14 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
[self replaceStateWithPageURL:replaceURL stateObject:stateObject]; |
NSString* replaceStateJS = [self javascriptToReplaceWebViewURL:replaceURL |
stateObjectJSON:stateObject]; |
- 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]; |
- }]; |
+ __weak CRWWebController* weakSelf = self; |
+ [self executeJavaScript:replaceStateJS |
+ completionHandler:^(id, NSError*) { |
+ base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
+ if (!strongSelf || strongSelf.get()->_isBeingDestroyed) |
+ return; |
+ [strongSelf didFinishNavigation]; |
+ }]; |
return YES; |
} |
@@ -3525,7 +3492,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// menu and show another one. If for some reason context menu info is not |
// fetched - system context menu will be shown. |
[self setDOMElementForLastTouch:nil]; |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
[self fetchDOMElementAtPoint:[touch locationInView:_webView] |
completionHandler:^(NSDictionary* element) { |
[weakSelf setDOMElementForLastTouch:element]; |
@@ -3640,7 +3607,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
const GURL currentURL([self currentNavigationURL]); |
NSString* windowName = windowInfo.window_name.get(); |
web::Referrer referrer(currentURL, windowInfo.referrer_policy); |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
void (^showPopupHandler)() = ^{ |
CRWWebController* child = [[weakSelf delegate] webPageOrderedOpen:url |
referrer:referrer |
@@ -3955,12 +3922,12 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
(CRWWebViewScrollViewProxy*)webViewScrollViewProxy { |
_pageHasZoomed = YES; |
- base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); |
+ __weak UIScrollView* weakScrollView = self.webScrollView; |
[self extractViewportTagWithCompletion:^( |
const web::PageViewportState* viewportState) { |
if (!weakScrollView) |
return; |
- base::scoped_nsobject<UIScrollView> scrollView([weakScrollView retain]); |
+ base::scoped_nsobject<UIScrollView> scrollView(weakScrollView); |
if (viewportState && !viewportState->viewport_tag_present() && |
[scrollView minimumZoomScale] == [scrollView maximumZoomScale] && |
[scrollView zoomScale] > 1.0) { |
@@ -4075,7 +4042,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
NSString* const kViewportContentQuery = |
@"var viewport = document.querySelector('meta[name=\"viewport\"]');" |
"viewport ? viewport.content : '';"; |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
int itemID = currentItem->GetUniqueID(); |
[self executeJavaScript:kViewportContentQuery |
completionHandler:^(id viewportContent, NSError*) { |
@@ -4124,7 +4091,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (void)applyPageDisplayState:(const web::PageDisplayState&)displayState { |
if (!displayState.IsValid()) |
return; |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
web::PageDisplayState displayStateCopy = displayState; |
[self extractViewportTagWithCompletion:^( |
const web::PageViewportState* viewportState) { |
@@ -4213,7 +4180,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} else { |
// If the page isn't loaded, store the action to update the scroll |
// when the page finishes loading. |
- base::WeakNSObject<UIScrollView> weakScrollView(self.webScrollView); |
+ __weak UIScrollView* weakScrollView = self.webScrollView; |
base::scoped_nsprotocol<ProceduralBlock> action([^{ |
[weakScrollView setContentOffset:scrollOffset]; |
} copy]); |
@@ -4243,7 +4210,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// scrolled). |
CGPoint scrollOffset = self.scrollPosition; |
CGFloat webViewContentWidth = self.webScrollView.contentSize.width; |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
[self fetchWebPageWidthWithCompletionHandler:^(CGFloat pageWidth) { |
CGFloat scale = pageWidth / webViewContentWidth; |
CGPoint localPoint = CGPointMake((point.x + scrollOffset.x) * scale, |
@@ -4275,7 +4242,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
if (src) { |
params.src_url = GURL(base::SysNSStringToUTF8(src)); |
if (!title) |
- title = [[src copy] autorelease]; |
+ title = [src copy]; |
if ([title hasPrefix:base::SysUTF8ToNSString(url::kDataScheme)]) |
title = nil; |
} |
@@ -4346,7 +4313,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
web::ReferrerPolicyFromString(referrerPolicyString); |
web::Referrer referrer(sourceURL, referrerPolicy); |
NSString* const kWindowName = @""; // obsoleted |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak 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. |
@@ -4364,7 +4331,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
- (void)didBlockPopupWithURL:(GURL)popupURL sourceURL:(GURL)sourceURL { |
if ([_delegate respondsToSelector:@selector(webController:didBlockPopup:)]) { |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
dispatch_async(dispatch_get_main_queue(), ^{ |
[self queryPageReferrerPolicy:^(NSString* policy) { |
[weakSelf didBlockPopupWithURL:popupURL |
@@ -4630,9 +4597,9 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
- (WKWebView*)createWebViewWithConfiguration:(WKWebViewConfiguration*)config { |
- return [web::CreateWKWebView(CGRectZero, config, |
- self.webStateImpl->GetBrowserState(), |
- [self useDesktopUserAgent]) autorelease]; |
+ return web::CreateWKWebView(CGRectZero, config, |
+ self.webStateImpl->GetBrowserState(), |
+ [self useDesktopUserAgent]); |
} |
- (void)setWebView:(WKWebView*)webView { |
@@ -4648,16 +4615,16 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
[_webView setNavigationDelegate:nil]; |
[_webView setUIDelegate:nil]; |
- for (NSString* keyPath in self.WKWebViewObservers) { |
+ for (NSString* keyPath in self.observedKeyPaths) { |
[_webView removeObserver:self forKeyPath:keyPath]; |
} |
[self clearActivityIndicatorTasks]; |
- _webView.reset([webView retain]); |
+ _webView.reset(webView); |
// Set up the new web view. |
if (webView) { |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
[messageRouter setScriptMessageHandler:^(WKScriptMessage* message) { |
[weakSelf didReceiveScriptMessage:message]; |
} |
@@ -4670,7 +4637,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
[_webView setNavigationDelegate:self]; |
[_webView setUIDelegate:self]; |
- for (NSString* keyPath in self.WKWebViewObservers) { |
+ for (NSString* keyPath in self.observedKeyPaths) { |
[_webView addObserver:self forKeyPath:keyPath options:0 context:nullptr]; |
} |
_injectedScriptManagers.reset([[NSMutableSet alloc] init]); |
@@ -4726,7 +4693,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
- (void)loadRequest:(NSMutableURLRequest*)request { |
- _latestWKNavigation.reset([[_webView loadRequest:request] retain]); |
+ _latestWKNavigation.reset([_webView loadRequest:request]); |
} |
- (void)loadPOSTRequest:(NSMutableURLRequest*)request { |
@@ -4772,7 +4739,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
} |
- (void)stopLoading { |
- _stoppedWKNavigation.reset(_latestWKNavigation); |
+ _stoppedWKNavigation = _latestWKNavigation; |
base::RecordAction(UserMetricsAction("Stop")); |
// Discard the pending and transient entried before notifying the tab model |
@@ -5057,7 +5024,7 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
// Ensure the URL is registered and loadPhase is as expected. |
DCHECK(_lastRegisteredRequestURL == webViewURL); |
DCHECK(self.loadPhase == web::LOAD_REQUESTED); |
- _latestWKNavigation.reset([navigation retain]); |
+ _latestWKNavigation.reset(navigation); |
} |
- (void)webView:(WKWebView*)webView |
@@ -5203,14 +5170,13 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
SecTrustRef trust = challenge.protectionSpace.serverTrust; |
base::ScopedCFTypeRef<SecTrustRef> scopedTrust(trust, |
base::scoped_policy::RETAIN); |
- base::WeakNSObject<CRWWebController> weakSelf(self); |
+ __weak CRWWebController* weakSelf = self; |
[_certVerificationController |
decideLoadPolicyForTrust:scopedTrust |
host:challenge.protectionSpace.host |
completionHandler:^(web::CertAcceptPolicy policy, |
net::CertStatus status) { |
- base::scoped_nsobject<CRWWebController> strongSelf( |
- [weakSelf retain]); |
+ base::scoped_nsobject<CRWWebController> strongSelf(weakSelf); |
if (!strongSelf) { |
completionHandler( |
NSURLSessionAuthChallengeRejectProtectionSpace, nil); |
@@ -5256,10 +5222,24 @@ const NSTimeInterval kSnapshotOverlayTransition = 0.5; |
ofObject:(id)object |
change:(NSDictionary*)change |
context:(void*)context { |
- NSString* dispatcherSelectorName = self.WKWebViewObservers[keyPath]; |
- DCHECK(dispatcherSelectorName); |
- if (dispatcherSelectorName) |
- [self performSelector:NSSelectorFromString(dispatcherSelectorName)]; |
+ // 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 { |
+ DCHECK(false); |
+ } |
} |
- (void)webViewEstimatedProgressDidChange { |