Index: ios/chrome/browser/ui/toolbar/toolbar_controller.mm |
diff --git a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm |
index 7dd27ef31e01929f573355fa5d96ff80b22d4021..3eb51c61eca69a187f4aed516de3ddd5dea89ae4 100644 |
--- a/ios/chrome/browser/ui/toolbar/toolbar_controller.mm |
+++ b/ios/chrome/browser/ui/toolbar/toolbar_controller.mm |
@@ -76,10 +76,6 @@ |
// Makes a two-element C array of CGRects as described above, one for each |
// device idiom. |
#define FRAME_PAIR(H) { IPHONE_FRAME(H), IPAD_FRAME(H) } |
- |
-#if !defined(__has_feature) || !__has_feature(objc_arc) |
-#error "This file requires ARC support." |
-#endif |
// clang-format on |
const CGRect kToolbarFrame[INTERFACE_IDIOM_COUNT] = FRAME_PAIR(56); |
@@ -204,21 +200,26 @@ |
@end |
@interface ToolbarController () { |
- // The shadow view. Only used on iPhone. |
- UIImageView* fullBleedShadowView_; |
+ // The top-level toolbar view. |
+ base::scoped_nsobject<ToolbarView> view_; |
+ // The view for the toolbar background image. |
+ base::scoped_nsobject<UIImageView> backgroundView_; |
+ base::scoped_nsobject<UIImageView> shadowView_; |
+ base::scoped_nsobject<UIImageView> fullBleedShadowView_; |
// The backing object for |self.transitionLayers|. |
- NSMutableArray* transitionLayers_; |
- |
- ToolbarToolsMenuButton* toolsMenuButton_; |
- UIButton* stackButton_; |
- UIButton* shareButton_; |
- NSArray* standardButtons_; |
- ToolsMenuButtonObserverBridge* toolsMenuButtonObserverBridge_; |
+ base::scoped_nsobject<NSMutableArray> transitionLayers_; |
+ |
+ base::scoped_nsobject<ToolbarToolsMenuButton> toolsMenuButton_; |
+ base::scoped_nsobject<UIButton> stackButton_; |
+ base::scoped_nsobject<UIButton> shareButton_; |
+ base::scoped_nsobject<NSArray> standardButtons_; |
+ base::scoped_nsobject<ToolsMenuButtonObserverBridge> |
+ toolsMenuButtonObserverBridge_; |
ToolbarControllerStyle style_; |
// The following is nil if not visible. |
- ToolsPopupController* toolsPopupController_; |
+ base::scoped_nsobject<ToolsPopupController> toolsPopupController_; |
} |
// Returns the background image that should be used for |style|. |
@@ -244,18 +245,15 @@ |
@implementation ToolbarController |
@synthesize readingListModel = readingListModel_; |
-@synthesize view = view_; |
-@synthesize backgroundView = backgroundView_; |
-@synthesize shadowView = shadowView_; |
-@synthesize toolsPopupController = toolsPopupController_; |
+ |
@synthesize style = style_; |
- (void)setReadingListModel:(ReadingListModel*)readingListModel { |
readingListModel_ = readingListModel; |
if (readingListModel_) { |
- toolsMenuButtonObserverBridge_ = |
- [[ToolsMenuButtonObserverBridge alloc] initWithModel:readingListModel_ |
- toolbarButton:toolsMenuButton_]; |
+ toolsMenuButtonObserverBridge_.reset([[ToolsMenuButtonObserverBridge alloc] |
+ initWithModel:readingListModel_ |
+ toolbarButton:toolsMenuButton_]); |
} |
} |
@@ -280,11 +278,11 @@ |
toolsMenuButtonFrame.origin.y += statusBarOffset; |
} |
- view_ = [[ToolbarView alloc] initWithFrame:viewFrame]; |
- backgroundView_ = [[UIImageView alloc] initWithFrame:backgroundFrame]; |
- toolsMenuButton_ = |
- [[ToolbarToolsMenuButton alloc] initWithFrame:toolsMenuButtonFrame |
- style:style_]; |
+ view_.reset([[ToolbarView alloc] initWithFrame:viewFrame]); |
+ backgroundView_.reset([[UIImageView alloc] initWithFrame:backgroundFrame]); |
+ toolsMenuButton_.reset([[ToolbarToolsMenuButton alloc] |
+ initWithFrame:toolsMenuButtonFrame |
+ style:style_]); |
[toolsMenuButton_ setTag:IDC_SHOW_TOOLS_MENU]; |
[toolsMenuButton_ |
setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | |
@@ -298,7 +296,7 @@ |
if (idiom == IPAD_IDIOM) { |
CGRect shareButtonFrame = LayoutRectGetRect(kShareMenuButtonFrame); |
- shareButton_ = [[UIButton alloc] initWithFrame:shareButtonFrame]; |
+ shareButton_.reset([[UIButton alloc] initWithFrame:shareButtonFrame]); |
[shareButton_ setTag:IDC_SHARE_PAGE]; |
[shareButton_ |
setAutoresizingMask:UIViewAutoresizingFlexibleLeadingMargin() | |
@@ -315,7 +313,7 @@ |
CGRect shadowFrame = kShadowViewFrame[idiom]; |
shadowFrame.origin.y = CGRectGetMaxY(backgroundFrame); |
- shadowView_ = [[UIImageView alloc] initWithFrame:shadowFrame]; |
+ shadowView_.reset([[UIImageView alloc] initWithFrame:shadowFrame]); |
[shadowView_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
[shadowView_ setUserInteractionEnabled:NO]; |
[view_ addSubview:shadowView_]; |
@@ -325,8 +323,8 @@ |
// iPad omnibox does not expand to full bleed. |
CGRect fullBleedShadowFrame = kFullBleedShadowViewFrame; |
fullBleedShadowFrame.origin.y = shadowFrame.origin.y; |
- fullBleedShadowView_ = |
- [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]; |
+ fullBleedShadowView_.reset( |
+ [[UIImageView alloc] initWithFrame:fullBleedShadowFrame]); |
[fullBleedShadowView_ |
setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; |
[fullBleedShadowView_ setUserInteractionEnabled:NO]; |
@@ -336,8 +334,8 @@ |
setImage:NativeImage(IDR_IOS_TOOLBAR_SHADOW_FULL_BLEED)]; |
} |
- transitionLayers_ = |
- [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]; |
+ transitionLayers_.reset( |
+ [[NSMutableArray alloc] initWithCapacity:kTransitionLayerCapacity]); |
// UIImageViews do not default to userInteractionEnabled:YES. |
[view_ setUserInteractionEnabled:YES]; |
@@ -348,8 +346,8 @@ |
setImage:StretchableImageFromUIImage(tile, 0.0, 3.0)]; |
if (idiom == IPHONE_IDIOM) { |
- stackButton_ = |
- [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]; |
+ stackButton_.reset( |
+ [[ToolbarCenteredButton alloc] initWithFrame:stackButtonFrame]); |
[stackButton_ setTag:IDC_TOGGLE_TAB_SWITCHER]; |
[[stackButton_ titleLabel] |
setFont:[self fontForSize:kFontSizeFewerThanTenTabs]]; |
@@ -409,14 +407,27 @@ |
- (void)dealloc { |
[[NSNotificationCenter defaultCenter] removeObserver:self]; |
[toolsPopupController_ setDelegate:nil]; |
+ [super dealloc]; |
+} |
+ |
+- (UIImageView*)view { |
+ return view_.get(); |
+} |
+ |
+- (UIImageView*)backgroundView { |
+ return backgroundView_.get(); |
} |
- (CGFloat)statusBarOffset { |
return StatusBarHeight(); |
} |
+- (UIImageView*)shadowView { |
+ return shadowView_.get(); |
+} |
+ |
- (NSMutableArray*)transitionLayers { |
- return transitionLayers_; |
+ return transitionLayers_.get(); |
} |
- (BOOL)imageShouldFlipForRightToLeftLayoutDirection:(int)imageEnum { |
@@ -433,18 +444,22 @@ |
[standardButtons addObject:stackButton_]; |
if (shareButtonShouldBeVisible) |
[standardButtons addObject:shareButton_]; |
- standardButtons_ = standardButtons; |
+ standardButtons_.reset([standardButtons retain]); |
} |
- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { |
[self updateStandardButtons]; |
} |
+- (ToolsPopupController*)toolsPopupController { |
+ return toolsPopupController_.get(); |
+} |
+ |
- (void)applicationDidEnterBackground:(NSNotification*)notify { |
- if (toolsPopupController_) { |
+ if (toolsPopupController_.get()) { |
// Dismiss the tools popup menu without animation. |
[toolsMenuButton_ setToolsMenuIsVisible:NO]; |
- toolsPopupController_ = nil; |
+ toolsPopupController_.reset(nil); |
[[NSNotificationCenter defaultCenter] |
postNotificationName:kMenuWillHideNotification |
object:nil]; |
@@ -475,7 +490,7 @@ |
} |
- (int)imageEnumForButton:(UIButton*)button { |
- if (button == stackButton_) |
+ if (button == stackButton_.get()) |
return ToolbarButtonNameStack; |
return NumberOfToolbarButtonNames; |
} |
@@ -548,7 +563,7 @@ |
} |
- (void)registerEventsForButton:(UIButton*)button { |
- if (button != toolsMenuButton_) { |
+ if (button != toolsMenuButton_.get()) { |
// |target| must be |self| (as opposed to |nil|) because |self| isn't in the |
// responder chain. |
[button addTarget:self |
@@ -570,7 +585,7 @@ |
} |
- (UIView*)shareButtonView { |
- return shareButton_; |
+ return shareButton_.get(); |
} |
- (void)showToolsMenuPopupWithConfiguration: |
@@ -587,8 +602,8 @@ |
[toolsMenuButton_ setToolsMenuIsVisible:YES]; |
[configuration setToolsMenuButton:toolsMenuButton_]; |
- toolsPopupController_ = |
- [[ToolsPopupController alloc] initWithConfiguration:configuration]; |
+ toolsPopupController_.reset( |
+ [[ToolsPopupController alloc] initWithConfiguration:configuration]); |
[toolsPopupController_ setDelegate:self]; |
@@ -598,9 +613,9 @@ |
} |
- (void)dismissToolsMenuPopup { |
- if (!toolsPopupController_) |
+ if (!toolsPopupController_.get()) |
return; |
- ToolsPopupController* tempTPC = toolsPopupController_; |
+ ToolsPopupController* tempTPC = toolsPopupController_.get(); |
[tempTPC containerView].userInteractionEnabled = NO; |
[tempTPC dismissAnimatedWithCompletion:^{ |
// Unpress the tools menu button by restoring the normal and |
@@ -611,7 +626,7 @@ |
}]; |
// reset tabHistoryPopupController_ to prevent -applicationDidEnterBackground |
// from posting another kMenuWillHideNotification. |
- toolsPopupController_ = nil; |
+ toolsPopupController_.reset(); |
[[NSNotificationCenter defaultCenter] |
postNotificationName:kMenuWillHideNotification |
@@ -670,7 +685,7 @@ |
fadeButtons.fromValue = @1; |
fadeButtons.toValue = @0; |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
if (![button isHidden]) { |
[button layer].opacity = 0; |
[[button layer] addAnimation:fadeButtons forKey:@"fade"]; |
@@ -684,7 +699,7 @@ |
[CATransaction |
setAnimationTimingFunction:TimingFunction(ios::material::CurveEaseIn)]; |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
CABasicAnimation* shiftButton = |
[CABasicAnimation animationWithKeyPath:@"position"]; |
CGPoint startPosition = [button layer].position; |
@@ -706,7 +721,7 @@ |
} |
- (void)fadeInStandardControls { |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
[self fadeInView:button |
fromLeadingOffset:10 |
withDuration:ios::material::kDuration2 |
@@ -724,7 +739,7 @@ |
- (void)animationDidStart:(CAAnimation*)anim { |
// Once the buttons start fading in, set their opacity to 1 so there's no |
// flicker at the end of the animation. |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
if (anim == [[button layer] animationForKey:@"fadeIn"]) { |
[button layer].opacity = 1; |
return; |
@@ -918,18 +933,18 @@ |
- (void)setStandardControlsVisible:(BOOL)visible { |
if (visible) { |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
[button setAlpha:1.0]; |
} |
} else { |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
[button setAlpha:0.0]; |
} |
} |
} |
- (void)setStandardControlsAlpha:(CGFloat)alpha { |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
if (![button isHidden]) |
[button setAlpha:alpha]; |
} |
@@ -941,7 +956,7 @@ |
} |
- (void)setStandardControlsTransform:(CGAffineTransform)transform { |
- for (UIButton* button in standardButtons_) { |
+ for (UIButton* button in standardButtons_.get()) { |
[button setTransform:transform]; |
} |
} |
@@ -999,11 +1014,11 @@ |
} |
- (IBAction)recordUserMetrics:(id)sender { |
- if (sender == toolsMenuButton_) |
+ if (sender == toolsMenuButton_.get()) |
base::RecordAction(UserMetricsAction("MobileToolbarShowMenu")); |
- else if (sender == stackButton_) |
+ else if (sender == stackButton_.get()) |
base::RecordAction(UserMetricsAction("MobileToolbarShowStackView")); |
- else if (sender == shareButton_) |
+ else if (sender == shareButton_.get()) |
base::RecordAction(UserMetricsAction("MobileToolbarShareMenu")); |
else |
NOTREACHED(); |