Chromium Code Reviews| Index: ios/chrome/browser/ui/browser_view_controller.mm |
| diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm |
| index 1b6047bb25644130a23ded2d713519b3e2dabaa0..09880618381eeb4d265f42d0bf9ed0b19310709a 100644 |
| --- a/ios/chrome/browser/ui/browser_view_controller.mm |
| +++ b/ios/chrome/browser/ui/browser_view_controller.mm |
| @@ -25,7 +25,6 @@ |
| #include "base/mac/bind_objc_block.h" |
| #include "base/mac/bundle_locations.h" |
| #include "base/mac/foundation_util.h" |
| -#import "base/mac/scoped_nsobject.h" |
| #include "base/macros.h" |
| #include "base/memory/ptr_util.h" |
| #include "base/metrics/histogram_macros.h" |
| @@ -270,17 +269,6 @@ enum HeaderBehaviour { |
| Overlap |
| }; |
| -struct HeaderDefinition { |
| - // The header view. |
| - base::scoped_nsobject<UIView> view; |
| - // How to place the view, and its behaviour when the headers move. |
| - HeaderBehaviour behaviour; |
| - // Reduces the height of a header to adjust for shadows. |
| - CGFloat heightAdjustement; |
| - // Nudges that particular header up by this number of points. |
| - CGFloat inset; |
| -}; |
| - |
| const CGFloat kIPadFindBarOverlap = 11; |
| bool IsURLAllowedInIncognito(const GURL& url) { |
| @@ -298,6 +286,65 @@ NSString* const kNativeControllerTemporaryKey = @"NativeControllerTemporaryKey"; |
| } // namespace |
| +#pragma mark - HeaderDefinition helper |
| + |
| +@interface HeaderDefinition : NSObject |
| + |
| +// The header view. |
| +@property(nonatomic, strong) UIView* view; |
| +// How to place the view, and its behaviour when the headers move. |
| +@property(nonatomic, assign) HeaderBehaviour behaviour; |
| +// Reduces the height of a header to adjust for shadows. |
| +@property(nonatomic, assign) CGFloat heightAdjustement; |
| +// Nudges that particular header up by this number of points. |
| +@property(nonatomic, assign) CGFloat inset; |
| + |
| +- (instancetype)initWithView:(UIView*)view |
| + headerBehaviour:(HeaderBehaviour)behaviour |
| + heightAdjustment:(CGFloat)heightAdjustment |
| + inset:(CGFloat)inset; |
| + |
| ++ (instancetype)definitionWithView:(UIView*)view |
| + headerBehaviour:(HeaderBehaviour)behaviour |
| + heightAdjustment:(CGFloat)heightAdjustment |
| + inset:(CGFloat)inset; |
| + |
| +@end |
| + |
| +@implementation HeaderDefinition |
| +@synthesize view = _view; |
| +@synthesize behaviour = _behaviour; |
| +@synthesize heightAdjustement = _heightAdjustement; |
| +@synthesize inset = _inset; |
| + |
| ++ (instancetype)definitionWithView:(UIView*)view |
| + headerBehaviour:(HeaderBehaviour)behaviour |
| + heightAdjustment:(CGFloat)heightAdjustment |
| + inset:(CGFloat)inset { |
| + return [[self alloc] initWithView:view |
| + headerBehaviour:behaviour |
| + heightAdjustment:heightAdjustment |
| + inset:inset]; |
| +} |
| + |
| +- (instancetype)initWithView:(UIView*)view |
| + headerBehaviour:(HeaderBehaviour)behaviour |
| + heightAdjustment:(CGFloat)heightAdjustment |
| + inset:(CGFloat)inset { |
| + self = [super init]; |
| + if (self) { |
| + _view = view; |
| + _behaviour = behaviour; |
| + _heightAdjustement = heightAdjustment; |
| + _inset = inset; |
| + } |
| + return self; |
| +} |
| + |
| +@end |
| + |
| +#pragma mark - BVC |
| + |
| @interface BrowserViewController ()<AppRatingPromptDelegate, |
| ContextualSearchControllerDelegate, |
| ContextualSearchPanelMotionObserver, |
| @@ -532,6 +579,10 @@ NSString* const kNativeControllerTemporaryKey = @"NativeControllerTemporaryKey"; |
| // is NONE if there is no visible page or visible page is a native page. |
| @property(nonatomic, assign, readonly) web::UserAgentType userAgentType; |
| +// Returns the header views, all the chrome on top of the page, including the |
| +// ones that cannot be scrolled off screen by full screen. |
| +@property(nonatomic, strong, readonly) NSArray<HeaderDefinition*>* headerViews; |
| + |
| // BVC initialization: |
| // If the BVC is initialized with a valid browser state & tab model immediately, |
| // the path is straightforward: functionality is enabled, and the UI is built |
| @@ -733,15 +784,12 @@ NSString* const kNativeControllerTemporaryKey = @"NativeControllerTemporaryKey"; |
| // The LogoAnimationControllerOwner to be used for the next logo transition |
| // animation. |
| - (id<LogoAnimationControllerOwner>)currentLogoAnimationControllerOwner; |
| -// Returns the header views, all the chrome on top of the page, including the |
| -// ones that cannot be scrolled off screen by full screen. |
| -- (const std::vector<HeaderDefinition>)headerViews; |
| // Returns the footer view if one exists (e.g. the voice search bar). |
| - (UIView*)footerView; |
| // Returns the height of the header view for the tab model's current tab. |
| - (CGFloat)headerHeight; |
| // Sets the frame for the headers. |
| -- (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers |
| +- (void)setFramesForHeaders:(NSArray<HeaderDefinition*>*)headers |
| atOffset:(CGFloat)headerOffset; |
| // Returns the y coordinate for the footer's frame when animating the footer |
| // in/out of fullscreen. |
| @@ -2647,40 +2695,42 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| return 0.0; |
| } |
| -- (const std::vector<HeaderDefinition>)headerViews { |
| - std::vector<HeaderDefinition> results; |
| +- (NSArray*)headerViews { |
| + NSMutableArray* results = [[NSMutableArray alloc] init]; |
|
marq (ping after 24h)
2017/04/06 14:58:16
NSMutableArray<HeaderDefinition*>*
(also in the
stkhapugin
2017/04/10 15:15:47
Done.
|
| if (![self isViewLoaded]) |
| return results; |
| if (!IsIPadIdiom()) { |
| if ([_toolbarController view]) { |
| - HeaderDefinition header = { |
| - base::scoped_nsobject<UIView>([_toolbarController view]), Hideable, |
| - [ToolbarController toolbarDropShadowHeight], 0.0, |
| - }; |
| - results.push_back(header); |
| + [results addObject:[HeaderDefinition |
| + definitionWithView:[_toolbarController view] |
| + headerBehaviour:Hideable |
| + heightAdjustment:[ToolbarController |
| + toolbarDropShadowHeight] |
| + inset:0.0]]; |
| } |
| } else { |
| if ([_tabStripController view]) { |
| - HeaderDefinition header = { |
| - base::scoped_nsobject<UIView>([_tabStripController view]), Hideable, |
| - 0.0, 0.0, |
| - }; |
| - results.push_back(header); |
| + [results addObject:[HeaderDefinition |
| + definitionWithView:[_tabStripController view] |
| + headerBehaviour:Hideable |
| + heightAdjustment:0.0 |
| + inset:0.0]]; |
| } |
| if ([_toolbarController view]) { |
| - HeaderDefinition header = { |
| - base::scoped_nsobject<UIView>([_toolbarController view]), Hideable, |
| - [ToolbarController toolbarDropShadowHeight], 0.0, |
| - }; |
| - results.push_back(header); |
| + [results addObject:[HeaderDefinition |
| + definitionWithView:[_toolbarController view] |
| + headerBehaviour:Hideable |
| + heightAdjustment:[ToolbarController |
| + toolbarDropShadowHeight] |
| + inset:0.0]]; |
| } |
| if ([_findBarController view]) { |
| - HeaderDefinition header = { |
| - base::scoped_nsobject<UIView>([_findBarController view]), Overlap, |
| - 0.0, kIPadFindBarOverlap, |
| - }; |
| - results.push_back(header); |
| + [results addObject:[HeaderDefinition |
| + definitionWithView:[_findBarController view] |
| + headerBehaviour:Overlap |
| + heightAdjustment:0.0 |
| + inset:kIPadFindBarOverlap]]; |
| } |
| } |
| return results; |
|
marq (ping after 24h)
2017/04/06 14:58:16
[results copy]
stkhapugin
2017/04/10 15:15:47
Done.
|
| @@ -2704,10 +2754,10 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| return 0; |
| } |
| - const std::vector<HeaderDefinition> views = [self headerViews]; |
| + NSArray<HeaderDefinition*>* views = [self headerViews]; |
| CGFloat height = [self headerOffset]; |
| - for (const auto& header : views) { |
| + for (HeaderDefinition* header in views) { |
| if (header.view && header.behaviour == Hideable) { |
| height += CGRectGetHeight([header.view frame]) - |
| header.heightAdjustement - header.inset; |
| @@ -2722,8 +2772,8 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| } |
| - (CGFloat)currentHeaderOffset { |
| - const std::vector<HeaderDefinition> headers = [self headerViews]; |
| - if (!headers.size()) |
| + NSArray<HeaderDefinition*>* headers = [self headerViews]; |
| + if (!headers.count) |
| return 0.0; |
| // Prerender tab does not have a toolbar, return |headerHeight| as promised by |
| @@ -2753,10 +2803,10 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| [controller setToolbarInsetsForHeaderOffset:offset]; |
| } |
| -- (void)setFramesForHeaders:(const std::vector<HeaderDefinition>)headers |
| +- (void)setFramesForHeaders:(NSArray<HeaderDefinition*>*)headers |
| atOffset:(CGFloat)headerOffset { |
| CGFloat height = [self headerOffset]; |
| - for (const auto& header : headers) { |
| + for (HeaderDefinition* header in headers) { |
| CGRect frame = [header.view frame]; |
| frame.origin.y = height - headerOffset - header.inset; |
| [header.view setFrame:frame]; |
| @@ -2780,7 +2830,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| footerFrame.origin.y = [self footerYForHeaderOffset:headerOffset]; |
| } |
| - const std::vector<HeaderDefinition> headers = [self headerViews]; |
| + NSArray<HeaderDefinition*>* headers = [self headerViews]; |
| void (^block)(void) = ^{ |
| [self setFramesForHeaders:headers atOffset:headerOffset]; |
| footer.frame = footerFrame; |
| @@ -2820,7 +2870,7 @@ class BrowserBookmarkModelBridge : public bookmarks::BookmarkModelObserver { |
| footerFrame.origin.y = [self footerYForHeaderOffset:headerOffset]; |
| } |
| - const std::vector<HeaderDefinition> headers = [self headerViews]; |
| + NSArray<HeaderDefinition*>* headers = [self headerViews]; |
| void (^block)(void) = ^{ |
| [self setFramesForHeaders:headers atOffset:headerOffset]; |
| footer.frame = footerFrame; |