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 5eac738e696ef9a2a60bcaaf9e86a73659606182..9266e1f9a91e04f507b7ac82ffb33a284cabe98f 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 { |
@@ -99,28 +103,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. |
@@ -139,11 +142,11 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
CFTimeInterval _shiftTilesDownStartTime; |
CGSize _mostVisitedCellSize; |
- base::scoped_nsobject<NSLayoutConstraint> _hintLabelLeadingConstraint; |
- base::scoped_nsobject<NSLayoutConstraint> _voiceTapTrailingConstraint; |
- base::scoped_nsobject<NSMutableArray> _supplementaryViews; |
- base::scoped_nsobject<NewTabPageHeaderView> _headerView; |
- base::scoped_nsobject<WhatsNewHeaderView> _promoHeaderView; |
+ NSLayoutConstraint* _hintLabelLeadingConstraint; |
+ NSLayoutConstraint* _voiceTapTrailingConstraint; |
+ NSMutableArray* _supplementaryViews; |
+ NewTabPageHeaderView* _headerView; |
+ WhatsNewHeaderView* _promoHeaderView; |
} |
// Redeclare the |view| property to be the GoogleLandingView subclass instead of |
@@ -154,7 +157,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
@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 incognito. |
@property(nonatomic, assign) BOOL isOffTheRecord; |
@@ -166,7 +169,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. |
@@ -250,8 +253,8 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
@synthesize voiceSearchIsEnabled = _voiceSearchIsEnabled; |
- (void)loadView { |
- self.view = [[[GoogleLandingView alloc] |
- initWithFrame:[UIScreen mainScreen].bounds] autorelease]; |
+ self.view = |
+ [[GoogleLandingView alloc] initWithFrame:[UIScreen mainScreen].bounds]; |
} |
- (void)viewDidLoad { |
@@ -268,13 +271,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 addSearchField]; |
@@ -319,7 +322,6 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
[_mostVisitedView setDelegate:nil]; |
[_mostVisitedView setDataSource:nil]; |
[_overscrollActionsController invalidate]; |
- [super dealloc]; |
} |
#pragma mark - Private |
@@ -398,7 +400,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
- (void)addSearchField { |
CGRect searchFieldFrame = content_suggestions::searchFieldFrame( |
[self viewWidth], self.logoIsShowing); |
- _searchTapTarget.reset([[UIButton alloc] initWithFrame:searchFieldFrame]); |
+ _searchTapTarget = [[UIButton alloc] initWithFrame:searchFieldFrame]; |
if (IsIPadIdiom()) { |
UIImage* searchBoxImage = [[UIImage imageNamed:@"ntp_google_search_box"] |
resizableImageWithCapInsets:kSearchBoxStretchInsets]; |
@@ -415,22 +417,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(), searchFieldFrame.size.width); |
+ searchHintLabel, _searchTapTarget, searchFieldFrame.size.width); |
- _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], |
@@ -463,8 +465,8 @@ 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]; |
} |
@@ -502,7 +504,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// crbug.com/491131 |
CGFloat collectionViewWidth = CGRectGetWidth([_mostVisitedView bounds]); |
CGFloat collectionViewMinX = CGRectGetMinX([_mostVisitedView bounds]); |
- for (UIView* supplementaryView in _supplementaryViews.get()) { |
+ for (UIView* supplementaryView in _supplementaryViews) { |
CGRect supplementaryViewFrame = supplementaryView.frame; |
supplementaryViewFrame.origin.x = collectionViewMinX; |
supplementaryViewFrame.size.width = collectionViewWidth; |
@@ -534,20 +536,19 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
// 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]; |
@@ -581,8 +582,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]; |
} |
@@ -781,11 +782,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; |
}); |
} |
@@ -807,15 +808,15 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
DCHECK(kind == UICollectionElementKindSectionHeader); |
if (!_supplementaryViews) |
- _supplementaryViews.reset([[NSMutableArray alloc] init]); |
+ _supplementaryViews = [[NSMutableArray alloc] init]; |
if (indexPath.section == SectionWithOmnibox) { |
if (!_headerView) { |
- _headerView.reset([[collectionView |
- dequeueReusableSupplementaryViewOfKind: |
- UICollectionElementKindSectionHeader |
- withReuseIdentifier:@"header" |
- forIndexPath:indexPath] retain]); |
+ _headerView = |
+ [collectionView dequeueReusableSupplementaryViewOfKind: |
+ UICollectionElementKindSectionHeader |
+ withReuseIdentifier:@"header" |
+ forIndexPath:indexPath]; |
[_headerView addSubview:[self.logoVendor view]]; |
[_headerView addSubview:_searchTapTarget]; |
[_headerView addViewsToSearchField:_searchTapTarget]; |
@@ -836,11 +837,11 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
if (indexPath.section == SectionWithMostVisited) { |
if (!_promoHeaderView) { |
- _promoHeaderView.reset([[collectionView |
- dequeueReusableSupplementaryViewOfKind: |
- UICollectionElementKindSectionHeader |
- withReuseIdentifier:@"whatsNew" |
- forIndexPath:indexPath] retain]); |
+ _promoHeaderView = |
+ [collectionView dequeueReusableSupplementaryViewOfKind: |
+ UICollectionElementKindSectionHeader |
+ withReuseIdentifier:@"whatsNew" |
+ forIndexPath:indexPath]; |
[_promoHeaderView |
setSideMargin:content_suggestions::centeredTilesMarginForWidth( |
[self viewWidth])]; |
@@ -905,10 +906,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; |
@@ -935,25 +936,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; |
@@ -972,8 +972,7 @@ const CGFloat kShiftTilesDownAnimationDuration = 0.2; |
if (!self.isOffTheRecord) { |
// Open in Incognito Tab. |
action = ^{ |
- base::scoped_nsobject<GoogleLandingViewController> strongSelf( |
- [weakSelf retain]); |
+ GoogleLandingViewController* strongSelf = weakSelf; |
if (!strongSelf) |
return; |
MostVisitedCell* cell = (MostVisitedCell*)sender.view; |
@@ -995,8 +994,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; |
@@ -1014,14 +1012,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] |
@@ -1242,13 +1238,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: |