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

Unified Diff: ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm

Issue 2824493002: Reland of [ObjC ARC] Converts ios/chrome/browser/ui/contextual_search:contextual_search to ARC. (Closed)
Patch Set: fix test Created 3 years, 8 months 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
Index: ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm
diff --git a/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm b/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm
index cc6aacd23b891b9d91b4968f6b45f133b5cbb789..b21863b5ad6d7a419e2301c3dbc5bc0999cc5b7e 100644
--- a/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm
+++ b/ios/chrome/browser/ui/contextual_search/contextual_search_controller.mm
@@ -8,13 +8,11 @@
#include <utility>
#include "base/ios/ios_util.h"
-#import "base/ios/weak_nsobject.h"
#include "base/json/json_reader.h"
#include "base/logging.h"
#import "base/mac/bind_objc_block.h"
#include "base/mac/foundation_util.h"
#include "base/mac/scoped_block.h"
-#include "base/mac/scoped_nsobject.h"
#include "base/strings/sys_string_conversions.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
@@ -61,6 +59,10 @@
// Returns |value| clamped so that min <= value <= max
#define CLAMP(min, value, max) MAX(min, MIN(value, max))
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
namespace {
// command prefix for injected JavaScript.
const std::string kCommandPrefix = "contextualSearch";
@@ -124,7 +126,7 @@ CGRect StringValueToRect(NSString* rectString) {
NSArray* StringValueToRectArray(const std::string& list) {
NSString* nsList = base::SysUTF8ToNSString(list);
- NSMutableArray* rectsArray = [[[NSMutableArray alloc] init] autorelease];
+ NSMutableArray* rectsArray = [[NSMutableArray alloc] init];
NSArray* items = [nsList componentsSeparatedByString:@","];
for (NSString* item : items) {
CGRect rect = StringValueToRect(item);
@@ -151,11 +153,11 @@ NSArray* StringValueToRectArray(const std::string& list) {
TouchToSearchPermissionsChangeAudience>
// Controller delegate for the controller to call back to.
-@property(nonatomic, readwrite, assign) id<ContextualSearchControllerDelegate>
+@property(nonatomic, readwrite, weak) id<ContextualSearchControllerDelegate>
controllerDelegate;
// Permissions interface for this feature. Property is readwrite for testing.
-@property(nonatomic, readwrite, retain)
+@property(nonatomic, readwrite, strong)
TouchToSearchPermissionsMediator* permissions;
// Synchronous method executed by -asynchronouslyEnableContextualSearch:
@@ -243,13 +245,13 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
@implementation ContextualSearchController {
// Permissions interface for this feature.
- base::scoped_nsobject<TouchToSearchPermissionsMediator> _permissions;
+ TouchToSearchPermissionsMediator* _permissions;
// WebState for the tab this object is attached to.
web::WebState* _webState;
// Access to the web view from |_webState|.
- base::scoped_nsprotocol<id<CRWWebViewProxy>> _webViewProxy;
+ id<CRWWebViewProxy> _webViewProxy;
// Observer for |_webState|.
std::unique_ptr<ContextualSearchWebStateObserver> _webStateObserver;
@@ -258,22 +260,22 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
std::unique_ptr<ContextualSearchWebStateObserver> _searchTabWebStateObserver;
// Object that manages find_in_page.js injection into the web view.
- base::WeakNSObject<JsContextualSearchManager> _contextualSearchJsManager;
+ __weak JsContextualSearchManager* _contextualSearchJsManager;
// Gesture reccognizer for contextual search taps.
- base::scoped_nsobject<UITapGestureRecognizer> _tapRecognizer;
+ UITapGestureRecognizer* _tapRecognizer;
// Gesture reccognizer for double tap. It is used to prevent |_tapRecognizer|
// from firing if there is a double tap on the web view. It is disabled when
// the panel is displayed, since any tap will dismiss the panel in that case.
- base::scoped_nsobject<UITapGestureRecognizer> _doubleTapRecognizer;
+ UITapGestureRecognizer* _doubleTapRecognizer;
// Gesture recognizer for long-tap copy.
- base::scoped_nsobject<UILongPressGestureRecognizer> _copyGestureRecognizer;
+ UILongPressGestureRecognizer* _copyGestureRecognizer;
// Gesture recognizer to detect taps outside of the CS interface that would
// cause it to dismiss.
- base::scoped_nsobject<WindowGestureObserver> _dismissRecognizer;
+ WindowGestureObserver* _dismissRecognizer;
// Context information retrieved from a search tap.
std::shared_ptr<ContextualSearchContext> _searchContext;
@@ -286,22 +288,22 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
// The panel view controlled by this object; it is created externally and
// owned by its superview. There is no guarantee about its lifetime.
- base::WeakNSObject<ContextualSearchPanelView> _panelView;
+ __weak ContextualSearchPanelView* _panelView;
// The view containing the highlighting of the search terms.
- base::WeakNSObject<ContextualSearchHighlighterView> _contextualHighlightView;
+ __weak ContextualSearchHighlighterView* _contextualHighlightView;
// Content view displayed in the peeking section of the panel.
- base::scoped_nsobject<ContextualSearchHeaderView> _headerView;
+ ContextualSearchHeaderView* _headerView;
// Vertical constraints for layout of the search tab.
- base::scoped_nsobject<NSArray> _searchTabVerticalConstraints;
+ NSArray* _searchTabVerticalConstraints;
// Container view for the opt-out promo and the search tab view.
- base::scoped_nsobject<ContextualSearchResultsView> _searchResultsView;
+ ContextualSearchResultsView* _searchResultsView;
// View for the opt-out promo.
- base::scoped_nsobject<ContextualSearchPromoView> _promoView;
+ ContextualSearchPromoView* _promoView;
// The tab that should be used as the opener for the search tab.
Tab* _opener;
@@ -377,7 +379,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
BOOL _preventScrollToShowSelection;
// The time of the last dismiss.
- base::scoped_nsobject<NSDate> _lastDismiss;
+ NSDate* _lastDismiss;
}
@synthesize enabled = _enabled;
@@ -388,8 +390,8 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
delegate:(id<ContextualSearchControllerDelegate>)
delegate {
if ((self = [super init])) {
- _permissions.reset([[TouchToSearchPermissionsMediator alloc]
- initWithBrowserState:browserState]);
+ _permissions = [[TouchToSearchPermissionsMediator alloc]
+ initWithBrowserState:browserState];
[_permissions setAudience:self];
self.controllerDelegate = delegate;
@@ -398,12 +400,12 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
// but it will observe and un-observe the web tabs as it changes over time.
_webStateObserver.reset(new ContextualSearchWebStateObserver(self));
- _copyGestureRecognizer.reset([[UILongPressGestureRecognizer alloc]
+ _copyGestureRecognizer = [[UILongPressGestureRecognizer alloc]
initWithTarget:self
- action:@selector(handleLongPressFrom:)]);
+ action:@selector(handleLongPressFrom:)];
- base::WeakNSObject<ContextualSearchController> weakself(self);
- auto callback = base::BindBlock(
+ __weak ContextualSearchController* weakself = self;
+ auto callback = base::BindBlockArc(
^(ContextualSearchDelegate::SearchResolution resolution) {
[weakself updateForResolvedSearch:resolution];
});
@@ -418,7 +420,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
}
- (void)setPermissions:(TouchToSearchPermissionsMediator*)permissions {
- _permissions.reset(permissions);
+ _permissions = permissions;
}
- (ContextualSearchPanelView*)panel {
@@ -430,28 +432,28 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
DCHECK(panel);
// Save the new panel, set up observation and delegation relationships.
- _panelView.reset(panel);
+ _panelView = panel;
[_panelView addMotionObserver:self];
[_dismissRecognizer setViewToExclude:_panelView];
// Create new subviews.
NSMutableArray* panelContents = [NSMutableArray arrayWithCapacity:3];
- _headerView.reset([[ContextualSearchHeaderView alloc]
- initWithHeight:[_panelView configuration].peekingHeight]);
+ _headerView = [[ContextualSearchHeaderView alloc]
+ initWithHeight:[_panelView configuration].peekingHeight];
[_headerView addGestureRecognizer:_copyGestureRecognizer];
[_headerView setTapHandler:self];
[panelContents addObject:_headerView];
if (self.permissions.preferenceState == TouchToSearch::UNDECIDED) {
- _promoView.reset([[ContextualSearchPromoView alloc] initWithFrame:CGRectZero
- delegate:self]);
+ _promoView = [[ContextualSearchPromoView alloc] initWithFrame:CGRectZero
+ delegate:self];
[panelContents addObject:_promoView];
}
- _searchResultsView.reset(
- [[ContextualSearchResultsView alloc] initWithFrame:CGRectZero]);
+ _searchResultsView =
+ [[ContextualSearchResultsView alloc] initWithFrame:CGRectZero];
[_searchResultsView setPromoter:self];
[_searchResultsView setPreloadChecker:self];
[panelContents addObject:_searchResultsView];
@@ -463,7 +465,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
// Asynchronously enables contextual search, so that some preferences
// (UIAccessibilityIsVoiceOverRunning(), for example) have time to synchronize
// with their own notifications.
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
[weakSelf doEnableContextualSearch:enabled];
});
@@ -486,7 +488,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
if (_webViewProxy) {
[[_webViewProxy scrollViewProxy] removeObserver:self];
}
- _webViewProxy.reset([webViewProxy retain]);
+ _webViewProxy = webViewProxy;
if (_webViewProxy) {
[[_webViewProxy scrollViewProxy] addObserver:self];
}
@@ -500,9 +502,9 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)setWebState:(web::WebState*)webState {
[self disconnectWebState];
if (webState) {
- _contextualSearchJsManager.reset(static_cast<JsContextualSearchManager*>(
+ _contextualSearchJsManager = static_cast<JsContextualSearchManager*>(
[webState->GetJSInjectionReceiver()
- instanceOfClass:[JsContextualSearchManager class]]));
+ instanceOfClass:[JsContextualSearchManager class]]);
_webState = webState;
_webStateObserver->ObserveWebState(webState);
[self updateWebViewProxy:webState->GetWebViewProxy()];
@@ -519,12 +521,11 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
if (!_webStateEnabled) {
DOMAlteringLock::CreateForWebState([self webState]);
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
- auto callback =
- base::BindBlock(^bool(const base::DictionaryValue& JSON,
- const GURL& originURL, bool userIsInteracting) {
- base::scoped_nsobject<ContextualSearchController> strongSelf(
- [weakSelf retain]);
+ __weak ContextualSearchController* weakSelf = self;
+ auto callback = base::BindBlockArc(
+ ^bool(const base::DictionaryValue& JSON, const GURL& originURL,
+ bool userIsInteracting) {
+ ContextualSearchController* strongSelf = weakSelf;
// |originURL| and |isInteracting| aren't used.
return [strongSelf handleScriptCommand:JSON];
});
@@ -532,16 +533,16 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
// |_doubleTapRecognizer| should be added to the web view before
// |_tapRecognizer| so |_tapRecognizer| can require it to fail.
- _doubleTapRecognizer.reset([[UITapGestureRecognizer alloc]
- initWithTarget:self
- action:@selector(ignoreTap:)]);
+ _doubleTapRecognizer =
+ [[UITapGestureRecognizer alloc] initWithTarget:self
+ action:@selector(ignoreTap:)];
[_doubleTapRecognizer setDelegate:self];
[_doubleTapRecognizer setNumberOfTapsRequired:2];
[_webViewProxy addGestureRecognizer:_doubleTapRecognizer];
- _tapRecognizer.reset([[UITapGestureRecognizer alloc]
+ _tapRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
- action:@selector(handleTapFrom:)]);
+ action:@selector(handleTapFrom:)];
[_tapRecognizer setDelegate:self];
[_webViewProxy addGestureRecognizer:_tapRecognizer];
@@ -584,7 +585,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)disconnectWebState {
if (_webState) {
- _contextualSearchJsManager.reset();
+ _contextualSearchJsManager = nil;
_webStateObserver->ObserveWebState(nullptr);
[self updateWebViewProxy:nil];
[self disableCurrentWebState];
@@ -595,9 +596,9 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
if (!_panelView)
return;
if (!_dismissRecognizer) {
- _dismissRecognizer.reset([[WindowGestureObserver alloc]
+ _dismissRecognizer = [[WindowGestureObserver alloc]
initWithTarget:self
- action:@selector(handleWindowGesture:)]);
+ action:@selector(handleWindowGesture:)];
[_dismissRecognizer setViewToExclude:_panelView];
[[_panelView window] addGestureRecognizer:_dismissRecognizer];
}
@@ -616,11 +617,10 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)dealloc {
[self close];
- [super dealloc];
}
- (void)handleWindowGesture:(UIGestureRecognizer*)recognizer {
- DCHECK(recognizer == _dismissRecognizer.get());
+ DCHECK(recognizer == _dismissRecognizer);
[self dismissPane:ContextualSearch::BASE_PAGE_TAP];
}
@@ -706,7 +706,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
bool selectionValid;
if (!JSONCommand.GetBoolean("valid", &selectionValid))
selectionValid = true;
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
ProceduralBlockWithBool lockAction = ^(BOOL lockAcquired) {
if (lockAcquired) {
[weakSelf handleSelectionChanged:selectedText
@@ -732,7 +732,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
}
- (void)handleTapFrom:(UIGestureRecognizer*)recognizer {
- DCHECK(recognizer == _tapRecognizer.get());
+ DCHECK(recognizer == _tapRecognizer);
// Taps will be triggered by long-presses to make a selection in the webview,
// as well as 'regular' taps. Long-presses that create a selection will set
// |_newSelectionDisplaying| as well as populating _selectedText (this happens
@@ -774,7 +774,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
dispatch_time_t dispatch = dispatch_time(
DISPATCH_TIME_NOW,
static_cast<int64_t>(kDOMModificationDelaySeconds * NSEC_PER_SEC));
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
dispatch_after(dispatch, dispatch_get_main_queue(), ^{
[weakSelf handleTapAtPoint:tapPoint];
});
@@ -783,7 +783,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
}
- (void)handleLongPressFrom:(UIGestureRecognizer*)recognizer {
- DCHECK(recognizer == _copyGestureRecognizer.get());
+ DCHECK(recognizer == _copyGestureRecognizer);
if (recognizer.state != UIGestureRecognizerStateEnded)
return;
@@ -827,8 +827,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
relativeTapPoint.x /= contentSize.width;
relativeTapPoint.y /= contentSize.height;
- base::WeakNSProtocol<id<CRWWebViewProxy>> weakWebViewProxy(
- _webViewProxy.get());
+ __weak id<CRWWebViewProxy> weakWebViewProxy = _webViewProxy;
void (^handler)(NSString*) = ^(NSString* result) {
[_tapRecognizer setEnabled:YES];
// If there has been an error in the javascript, return can be nil.
@@ -1022,7 +1021,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
animated:[_panelView state] != ContextualSearch::DISMISSED];
if (_resolvedSearch.start_offset != -1 &&
_resolvedSearch.end_offset != -1) {
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
[_contextualSearchJsManager
expandHighlightToStartOffset:_resolvedSearch.start_offset
endOffset:_resolvedSearch.end_offset
@@ -1076,7 +1075,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)scrollToShowSelection:(CRWWebViewScrollViewProxy*)scrollView {
if (!scrollView || _preventScrollToShowSelection)
return;
- if (!_contextualHighlightView.get()) {
+ if (!_contextualHighlightView) {
return;
}
CGRect highlightBoundingRect = [_contextualHighlightView boundingRect];
@@ -1164,13 +1163,12 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
if (![self webState]) {
return;
}
- if (!_contextualHighlightView.get() && [rects count]) {
+ if (!_contextualHighlightView && [rects count]) {
CGRect frame = [[self webState]->GetWebViewProxy() frame];
ContextualSearchHighlighterView* highlightView =
- [[[ContextualSearchHighlighterView alloc] initWithFrame:frame
- delegate:self]
- autorelease];
- _contextualHighlightView.reset(highlightView);
+ [[ContextualSearchHighlighterView alloc] initWithFrame:frame
+ delegate:self];
+ _contextualHighlightView = highlightView;
[[self webState]->GetWebViewProxy() addSubview:highlightView];
}
CGPoint scroll = [[_webViewProxy scrollViewProxy] contentOffset];
@@ -1213,7 +1211,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
[[_panelView window] removeGestureRecognizer:_dismissRecognizer];
_delegate.reset();
[_searchResultsView setActive:NO];
- _searchResultsView.reset();
+ _searchResultsView = nil;
}
#pragma mark - Promo view management
@@ -1289,7 +1287,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)panelWillPromote:(ContextualSearchPanelView*)panel {
DCHECK(panel == _panelView);
[panel removeMotionObserver:self];
- _panelView.reset();
+ _panelView = nil;
[self setState:ContextualSearch::DISMISSED
reason:ContextualSearch::TAB_PROMOTION];
}
@@ -1423,7 +1421,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (void)cleanUpWebStateForDismissWithCompletion:
(ProceduralBlock)completionHandler {
- _lastDismiss.reset([[NSDate date] retain]);
+ _lastDismiss = [NSDate date];
_currentTapCancelled = YES;
ContextualSearch::PanelState originalState = [_panelView state];
if (originalState == ContextualSearch::DISMISSED) {
@@ -1448,10 +1446,10 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
ContextualSearchDelegate::SearchResolution blank;
_resolvedSearch = blank;
if (completionHandler) {
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
ProceduralBlock javaScriptCompletion = ^{
- if ([self webState]) {
- DOMAlteringLock::FromWebState([self webState])->Release(self);
+ if ([weakSelf webState]) {
+ DOMAlteringLock::FromWebState([weakSelf webState])->Release(weakSelf);
completionHandler();
}
};
@@ -1520,9 +1518,8 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
}
- (void)promoViewSettingsTapped {
- base::scoped_nsobject<GenericChromeCommand> command(
- [[GenericChromeCommand alloc]
- initWithTag:IDC_SHOW_CONTEXTUAL_SEARCH_SETTINGS]);
+ GenericChromeCommand* command = [[GenericChromeCommand alloc]
+ initWithTag:IDC_SHOW_CONTEXTUAL_SEARCH_SETTINGS];
UIWindow* main_window = [[UIApplication sharedApplication] keyWindow];
[main_window chromeExecuteCommand:command];
}
@@ -1550,8 +1547,8 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
- (BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:
(UIGestureRecognizer*)otherGestureRecognizer {
- return gestureRecognizer == _tapRecognizer.get() ||
- gestureRecognizer == _doubleTapRecognizer.get();
+ return gestureRecognizer == _tapRecognizer ||
+ gestureRecognizer == _doubleTapRecognizer;
}
#pragma mark - CRWWebViewScrollViewObserver methods
@@ -1623,7 +1620,7 @@ dismissPaneWithJavascriptCompletionHandler:(ProceduralBlock)completionHandler
#pragma mark - ContextualSearchHighlighterDelegate methods
- (void)updateHighlight {
- base::WeakNSObject<ContextualSearchController> weakSelf(self);
+ __weak ContextualSearchController* weakSelf = self;
[_contextualSearchJsManager
highlightRectsWithCompletionHandler:^void(id result, NSError* error) {
[weakSelf handleHighlightJSResult:result withError:error];

Powered by Google App Engine
This is Rietveld 408576698