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

Unified Diff: ios/web/web_state/ui/crw_web_controller.mm

Issue 2482803003: Revert of [ObjC ARC] Converts crw_web_controller to ARC. (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ios/web/web_state/ui/crw_web_controller.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « ios/web/web_state/ui/crw_web_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698