Index: ios/chrome/browser/ui/ntp/google_landing_view_controller.mm |
diff --git a/ios/chrome/browser/ui/ntp/google_landing_view_controller.mm b/ios/chrome/browser/ui/ntp/google_landing_view_controller.mm |
index 674880577a5ba89192ad636d626e9e3395b51316..69f1073cf07bc801da31ef9136ad5ce2dc5b67b4 100644 |
--- a/ios/chrome/browser/ui/ntp/google_landing_view_controller.mm |
+++ b/ios/chrome/browser/ui/ntp/google_landing_view_controller.mm |
@@ -35,6 +35,10 @@ |
#include "ui/base/l10n/l10n_util.h" |
#include "ui/base/page_transition_types.h" |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
using base::UserMetricsAction; |
namespace { |
@@ -61,28 +65,27 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
UIGestureRecognizerDelegate, |
WhatsNewHeaderViewDelegate> { |
// Fake omnibox. |
- base::scoped_nsobject<UIButton> _searchTapTarget; |
+ UIButton* _searchTapTarget; |
// A collection view for the most visited sites. |
- base::scoped_nsobject<UICollectionView> _mostVisitedView; |
+ UICollectionView* _mostVisitedView; |
// The overscroll actions controller managing accelerators over the toolbar. |
- base::scoped_nsobject<OverscrollActionsController> |
- _overscrollActionsController; |
+ OverscrollActionsController* _overscrollActionsController; |
// |YES| when notifications indicate the omnibox is focused. |
BOOL _omniboxFocused; |
// Tap and swipe gesture recognizers when the omnibox is focused. |
- base::scoped_nsobject<UITapGestureRecognizer> _tapGestureRecognizer; |
- base::scoped_nsobject<UISwipeGestureRecognizer> _swipeGestureRecognizer; |
+ UITapGestureRecognizer* _tapGestureRecognizer; |
+ UISwipeGestureRecognizer* _swipeGestureRecognizer; |
// Handles displaying the context menu for all form factors. |
- base::scoped_nsobject<ContextMenuCoordinator> _contextMenuCoordinator; |
+ ContextMenuCoordinator* _contextMenuCoordinator; |
// URL of the last deleted most viewed entry. If present the UI to restore it |
// is shown. |
- base::scoped_nsobject<NSURL> _deletedUrl; |
+ NSURL* _deletedUrl; |
// |YES| if the view has finished its first layout. This is useful when |
// determining if the view has sized itself for tablet. |
@@ -101,24 +104,24 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
CFTimeInterval _shiftTilesDownStartTime; |
CGSize _mostVisitedCellSize; |
- base::scoped_nsobject<NSLayoutConstraint> _hintLabelLeadingConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _voiceTapTrailingConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _doodleHeightConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _doodleTopMarginConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _searchFieldWidthConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _searchFieldHeightConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _searchFieldTopMarginConstraint; |
- base::scoped_nsobject<NewTabPageHeaderView> _headerView; |
- base::scoped_nsobject<WhatsNewHeaderView> _promoHeaderView; |
- base::WeakNSProtocol<id<GoogleLandingDataSource>> _dataSource; |
- base::WeakNSProtocol<id<UrlLoader, OmniboxFocuser>> _dispatcher; |
+ NSLayoutConstraint* _hintLabelLeadingConstraint; |
+ NSLayoutConstraint* _voiceTapTrailingConstraint; |
+ NSLayoutConstraint* _doodleHeightConstraint; |
+ NSLayoutConstraint* _doodleTopMarginConstraint; |
+ NSLayoutConstraint* _searchFieldWidthConstraint; |
+ NSLayoutConstraint* _searchFieldHeightConstraint; |
+ NSLayoutConstraint* _searchFieldTopMarginConstraint; |
+ NewTabPageHeaderView* _headerView; |
+ WhatsNewHeaderView* _promoHeaderView; |
+ __weak id<GoogleLandingDataSource> _dataSource; |
+ __weak id<UrlLoader, OmniboxFocuser> _dispatcher; |
} |
// Whether the Google logo or doodle is being shown. |
@property(nonatomic, assign) BOOL logoIsShowing; |
// Exposes view and methods to drive the doodle. |
-@property(nonatomic, assign) id<LogoVendor> logoVendor; |
+@property(nonatomic, weak) id<LogoVendor> logoVendor; |
// |YES| if this consumer is has voice search enabled. |
@property(nonatomic, assign) BOOL voiceSearchIsEnabled; |
@@ -127,7 +130,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
@property(nonatomic, assign) NSUInteger maximumMostVisitedSitesShown; |
// Gets the text of a what's new promo. |
-@property(nonatomic, retain) NSString* promoText; |
+@property(nonatomic, strong) NSString* promoText; |
// Gets the icon of a what's new promo. |
// TODO(crbug.com/694750): This should not be WhatsNewIcon. |
@@ -228,13 +231,13 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
_scrolledToTop = NO; |
_animateHeader = YES; |
- _tapGestureRecognizer.reset([[UITapGestureRecognizer alloc] |
- initWithTarget:self |
- action:@selector(blurOmnibox)]); |
+ _tapGestureRecognizer = |
+ [[UITapGestureRecognizer alloc] initWithTarget:self |
+ action:@selector(blurOmnibox)]; |
[_tapGestureRecognizer setDelegate:self]; |
- _swipeGestureRecognizer.reset([[UISwipeGestureRecognizer alloc] |
- initWithTarget:self |
- action:@selector(blurOmnibox)]); |
+ _swipeGestureRecognizer = |
+ [[UISwipeGestureRecognizer alloc] initWithTarget:self |
+ action:@selector(blurOmnibox)]; |
[_swipeGestureRecognizer setDirection:UISwipeGestureRecognizerDirectionDown]; |
self.leftMargin = |
@@ -303,7 +306,6 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
[_mostVisitedView setDelegate:nil]; |
[_mostVisitedView setDataSource:nil]; |
[_overscrollActionsController invalidate]; |
- [super dealloc]; |
} |
#pragma mark - Properties |
@@ -313,7 +315,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
} |
- (void)setDataSource:(id<GoogleLandingDataSource>)dataSource { |
- _dataSource.reset(dataSource); |
+ _dataSource = dataSource; |
} |
- (id<UrlLoader, OmniboxFocuser>)dispatcher { |
@@ -321,7 +323,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
} |
- (void)setDispatcher:(id<UrlLoader, OmniboxFocuser>)dispatcher { |
- _dispatcher.reset(dispatcher); |
+ _dispatcher = dispatcher; |
} |
#pragma mark - Private |
@@ -382,7 +384,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// Initialize and add a search field tap target and a voice search button. |
- (void)addSearchField { |
- _searchTapTarget.reset([[UIButton alloc] init]); |
+ _searchTapTarget = [[UIButton alloc] init]; |
if (IsIPadIdiom()) { |
UIImage* searchBoxImage = [[UIImage imageNamed:@"ntp_google_search_box"] |
resizableImageWithCapInsets:kSearchBoxStretchInsets]; |
@@ -399,22 +401,22 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
[_searchTapTarget setIsAccessibilityElement:NO]; |
// Set up fakebox hint label. |
- UILabel* searchHintLabel = [[[UILabel alloc] init] autorelease]; |
+ UILabel* searchHintLabel = [[UILabel alloc] init]; |
content_suggestions::configureSearchHintLabel(searchHintLabel, |
- _searchTapTarget.get()); |
+ _searchTapTarget); |
- _hintLabelLeadingConstraint.reset([[searchHintLabel.leadingAnchor |
+ _hintLabelLeadingConstraint = [searchHintLabel.leadingAnchor |
constraintEqualToAnchor:[_searchTapTarget leadingAnchor] |
- constant:kHintLabelSidePadding] retain]); |
+ constant:kHintLabelSidePadding]; |
[_hintLabelLeadingConstraint setActive:YES]; |
// Add a voice search button. |
- UIButton* voiceTapTarget = [[[UIButton alloc] init] autorelease]; |
+ UIButton* voiceTapTarget = [[UIButton alloc] init]; |
content_suggestions::configureVoiceSearchButton(voiceTapTarget, |
- _searchTapTarget.get()); |
+ _searchTapTarget); |
- _voiceTapTrailingConstraint.reset([[voiceTapTarget.trailingAnchor |
- constraintEqualToAnchor:[_searchTapTarget trailingAnchor]] retain]); |
+ _voiceTapTrailingConstraint = [voiceTapTarget.trailingAnchor |
+ constraintEqualToAnchor:[_searchTapTarget trailingAnchor]]; |
[NSLayoutConstraint activateConstraints:@[ |
[searchHintLabel.trailingAnchor |
constraintEqualToAnchor:voiceTapTarget.leadingAnchor], |
@@ -447,28 +449,27 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// Use a GenericChromeCommand because |sender| already has a tag set for a |
// different command. |
- base::scoped_nsobject<GenericChromeCommand> command( |
- [[GenericChromeCommand alloc] initWithTag:IDC_PRELOAD_VOICE_SEARCH]); |
+ GenericChromeCommand* command = |
+ [[GenericChromeCommand alloc] initWithTag:IDC_PRELOAD_VOICE_SEARCH]; |
[sender chromeExecuteCommand:command]; |
} |
// Initialize and add a panel with most visited sites. |
- (void)addMostVisited { |
CGRect mostVisitedFrame = [self.view bounds]; |
- base::scoped_nsobject<UICollectionViewFlowLayout> flowLayout; |
+ UICollectionViewFlowLayout* flowLayout; |
if (IsIPadIdiom()) |
- flowLayout.reset([[UICollectionViewFlowLayout alloc] init]); |
+ flowLayout = [[UICollectionViewFlowLayout alloc] init]; |
else |
- flowLayout.reset([[MostVisitedLayout alloc] init]); |
+ flowLayout = [[MostVisitedLayout alloc] init]; |
[flowLayout setScrollDirection:UICollectionViewScrollDirectionVertical]; |
[flowLayout setItemSize:_mostVisitedCellSize]; |
[flowLayout setMinimumInteritemSpacing:8]; |
[flowLayout setMinimumLineSpacing:content_suggestions::spacingBetweenTiles()]; |
DCHECK(!_mostVisitedView); |
- _mostVisitedView.reset([[UICollectionView alloc] |
- initWithFrame:mostVisitedFrame |
- collectionViewLayout:flowLayout]); |
+ _mostVisitedView = [[UICollectionView alloc] initWithFrame:mostVisitedFrame |
+ collectionViewLayout:flowLayout]; |
[_mostVisitedView setAutoresizingMask:UIViewAutoresizingFlexibleHeight | |
UIViewAutoresizingFlexibleWidth]; |
[_mostVisitedView setDelegate:self]; |
@@ -501,8 +502,8 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
- (void)addOverscrollActions { |
if (!IsIPadIdiom()) { |
- _overscrollActionsController.reset([[OverscrollActionsController alloc] |
- initWithScrollView:_mostVisitedView]); |
+ _overscrollActionsController = [[OverscrollActionsController alloc] |
+ initWithScrollView:_mostVisitedView]; |
[_overscrollActionsController setStyle:OverscrollStyle::NTP_NON_INCOGNITO]; |
[_overscrollActionsController setDelegate:self]; |
} |
@@ -655,28 +656,26 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
- (void)addConstraintsForLogoView:(UIView*)logoView |
searchField:(UIView*)searchField |
andHeaderView:(UIView*)headerView { |
- _doodleTopMarginConstraint.reset([[logoView.topAnchor |
+ _doodleTopMarginConstraint = [logoView.topAnchor |
constraintEqualToAnchor:headerView.topAnchor |
- constant:content_suggestions::doodleTopMargin()] retain]); |
- _doodleHeightConstraint.reset([[logoView.heightAnchor |
+ constant:content_suggestions::doodleTopMargin()]; |
+ _doodleHeightConstraint = [logoView.heightAnchor |
constraintEqualToConstant:content_suggestions::doodleHeight( |
- self.logoIsShowing)] retain]); |
- _searchFieldWidthConstraint.reset([[searchField.widthAnchor |
+ self.logoIsShowing)]; |
+ _searchFieldWidthConstraint = [searchField.widthAnchor |
constraintEqualToConstant:content_suggestions::searchFieldWidth( |
- [self viewWidth])] retain]); |
- _searchFieldHeightConstraint.reset([[searchField.heightAnchor |
- constraintEqualToConstant:content_suggestions::kSearchFieldHeight] |
- retain]); |
- _searchFieldTopMarginConstraint.reset([[searchField.topAnchor |
+ [self viewWidth])]; |
+ _searchFieldHeightConstraint = [searchField.heightAnchor |
+ constraintEqualToConstant:content_suggestions::kSearchFieldHeight]; |
+ _searchFieldTopMarginConstraint = [searchField.topAnchor |
constraintEqualToAnchor:logoView.bottomAnchor |
- constant:content_suggestions::searchFieldTopMargin()] |
- retain]); |
+ constant:content_suggestions::searchFieldTopMargin()]; |
[NSLayoutConstraint activateConstraints:@[ |
_doodleTopMarginConstraint, |
- _doodleHeightConstraint.get(), |
- _searchFieldWidthConstraint.get(), |
- _searchFieldHeightConstraint.get(), |
- _searchFieldTopMarginConstraint.get(), |
+ _doodleHeightConstraint, |
+ _searchFieldWidthConstraint, |
+ _searchFieldHeightConstraint, |
+ _searchFieldTopMarginConstraint, |
[logoView.widthAnchor constraintEqualToAnchor:headerView.widthAnchor], |
[logoView.leadingAnchor constraintEqualToAnchor:headerView.leadingAnchor], |
[searchField.centerXAnchor |
@@ -751,11 +750,11 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// TODO(jif): This needs a radar, since it is almost certainly a |
// UIKit accessibility bug. crbug.com/529271 |
if (UIAccessibilityIsVoiceOverRunning()) { |
- UICollectionView* blockView = [_mostVisitedView retain]; |
+ __block UICollectionView* blockView = _mostVisitedView; |
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, |
static_cast<int64_t>(1 * NSEC_PER_SEC)), |
dispatch_get_main_queue(), ^{ |
- [blockView release]; |
+ blockView = nil; |
}); |
} |
@@ -783,7 +782,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
withReuseIdentifier:@"header" |
forIndexPath:indexPath]; |
if (!_headerView) { |
- _headerView.reset([[NewTabPageHeaderView alloc] init]); |
+ _headerView = [[NewTabPageHeaderView alloc] init]; |
[_headerView addSubview:[self.logoVendor view]]; |
[_headerView addSubview:_searchTapTarget]; |
self.logoVendor.view.translatesAutoresizingMaskIntoConstraints = NO; |
@@ -820,7 +819,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
withReuseIdentifier:@"header" |
forIndexPath:indexPath]; |
if (!_promoHeaderView) { |
- _promoHeaderView.reset([[WhatsNewHeaderView alloc] init]); |
+ _promoHeaderView = [[WhatsNewHeaderView alloc] init]; |
[_promoHeaderView |
setSideMargin:content_suggestions::centeredTilesMarginForWidth( |
[self viewWidth]) |
@@ -887,10 +886,10 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
[cell setupWithURL:ntpTile.url title:title dataSource:self.dataSource]; |
- base::scoped_nsobject<UILongPressGestureRecognizer> longPress( |
+ UILongPressGestureRecognizer* longPress = |
[[UILongPressGestureRecognizer alloc] |
initWithTarget:self |
- action:@selector(handleMostVisitedLongPress:)]); |
+ action:@selector(handleMostVisitedLongPress:)]; |
[cell addGestureRecognizer:longPress]; |
return cell; |
@@ -917,25 +916,24 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
web::ContextMenuParams params; |
// Get view coordinates in local space. |
params.location = [sender locationInView:self.view]; |
- params.view.reset([self.view retain]); |
+ params.view.reset(self.view); |
// Present sheet/popover using controller that is added to view hierarchy. |
UIViewController* topController = [params.view window].rootViewController; |
while (topController.presentedViewController) |
topController = topController.presentedViewController; |
- _contextMenuCoordinator.reset([[ContextMenuCoordinator alloc] |
- initWithBaseViewController:topController |
- params:params]); |
+ _contextMenuCoordinator = |
+ [[ContextMenuCoordinator alloc] initWithBaseViewController:topController |
+ params:params]; |
ProceduralBlock action; |
// Open In New Tab. |
GURL url = [self urlForIndex:index]; |
- base::WeakNSObject<GoogleLandingViewController> weakSelf(self); |
+ __weak GoogleLandingViewController* weakSelf = self; |
action = ^{ |
- base::scoped_nsobject<GoogleLandingViewController> strongSelf( |
- [weakSelf retain]); |
+ GoogleLandingViewController* strongSelf = weakSelf; |
if (!strongSelf) |
return; |
MostVisitedCell* cell = (MostVisitedCell*)sender.view; |
@@ -953,8 +951,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// Open in Incognito Tab. |
action = ^{ |
- base::scoped_nsobject<GoogleLandingViewController> strongSelf( |
- [weakSelf retain]); |
+ GoogleLandingViewController* strongSelf = weakSelf; |
if (!strongSelf) |
return; |
MostVisitedCell* cell = (MostVisitedCell*)sender.view; |
@@ -975,8 +972,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
NSString* title = |
l10n_util::GetNSStringWithFixup(IDS_BOOKMARK_BUBBLE_REMOVE_BOOKMARK); |
action = ^{ |
- base::scoped_nsobject<GoogleLandingViewController> strongSelf( |
- [weakSelf retain]); |
+ GoogleLandingViewController* strongSelf = weakSelf; |
// Early return if the controller has been deallocated. |
if (!strongSelf) |
return; |
@@ -994,14 +990,12 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
} |
- (void)showMostVisitedUndoForURL:(NSURL*)url { |
- _deletedUrl.reset([url retain]); |
+ _deletedUrl = url; |
- MDCSnackbarMessageAction* action = |
- [[[MDCSnackbarMessageAction alloc] init] autorelease]; |
- base::WeakNSObject<GoogleLandingViewController> weakSelf(self); |
+ MDCSnackbarMessageAction* action = [[MDCSnackbarMessageAction alloc] init]; |
+ __weak GoogleLandingViewController* weakSelf = self; |
action.handler = ^{ |
- base::scoped_nsobject<GoogleLandingViewController> strongSelf( |
- [weakSelf retain]); |
+ GoogleLandingViewController* strongSelf = weakSelf; |
if (!strongSelf) |
return; |
[[strongSelf dataSource] |
@@ -1226,13 +1220,13 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
didTriggerAction:(OverscrollAction)action { |
switch (action) { |
case OverscrollAction::NEW_TAB: { |
- base::scoped_nsobject<GenericChromeCommand> command( |
- [[GenericChromeCommand alloc] initWithTag:IDC_NEW_TAB]); |
+ GenericChromeCommand* command = |
+ [[GenericChromeCommand alloc] initWithTag:IDC_NEW_TAB]; |
[[self view] chromeExecuteCommand:command]; |
} break; |
case OverscrollAction::CLOSE_TAB: { |
- base::scoped_nsobject<GenericChromeCommand> command( |
- [[GenericChromeCommand alloc] initWithTag:IDC_CLOSE_TAB]); |
+ GenericChromeCommand* command = |
+ [[GenericChromeCommand alloc] initWithTag:IDC_CLOSE_TAB]; |
[[self view] chromeExecuteCommand:command]; |
} break; |
case OverscrollAction::REFRESH: |