| Index: chrome/browser/cocoa/bookmark_bar_controller.mm | 
| =================================================================== | 
| --- chrome/browser/cocoa/bookmark_bar_controller.mm	(revision 22499) | 
| +++ chrome/browser/cocoa/bookmark_bar_controller.mm	(working copy) | 
| @@ -14,6 +14,7 @@ | 
| #import "chrome/browser/cocoa/bookmark_editor_controller.h" | 
| #import "chrome/browser/cocoa/bookmark_name_folder_controller.h" | 
| #import "chrome/browser/cocoa/bookmark_menu_cocoa_controller.h" | 
| +#import "chrome/browser/cocoa/view_resizer.h" | 
| #include "chrome/browser/cocoa/nsimage_cache.h" | 
| #include "chrome/browser/profile.h" | 
| #include "chrome/common/pref_names.h" | 
| @@ -31,15 +32,8 @@ | 
|  | 
| namespace { | 
|  | 
| -// TODO(jrg): this is the right proportional height but overlaps the | 
| -// "blue outline" of the omnibox.  Fix. | 
| - | 
| // Our height, when opened. | 
| const int kBookmarkBarHeight = 30; | 
| -// How much to adjust our parent view. | 
| -const int kBookmarkBarSuperviewHeightAdjustment = 25; | 
| -// How much to adjust the web frame. | 
| -const int kBookmarkBarWebframeHeightAdjustment = 25; | 
|  | 
| // Magic numbers from Cole | 
| const CGFloat kDefaultBookmarkWidth = 150.0; | 
| @@ -50,19 +44,17 @@ | 
| @implementation BookmarkBarController | 
|  | 
| - (id)initWithProfile:(Profile*)profile | 
| -           parentView:(NSView*)parentView | 
| -       webContentView:(NSView*)webContentView | 
| -         infoBarsView:(NSView*)infoBarsView | 
| -             delegate:(id<BookmarkURLOpener>)delegate { | 
| +         initialWidth:(float)initialWidth | 
| +       resizeDelegate:(id<ViewResizer>)resizeDelegate | 
| +          urlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 
| if ((self = [super initWithNibName:@"BookmarkBar" | 
| bundle:mac_util::MainAppBundle()])) { | 
| profile_ = profile; | 
| +    initialWidth_ = initialWidth; | 
| bookmarkModel_ = profile->GetBookmarkModel(); | 
| -    parentView_ = parentView; | 
| -    webContentView_ = webContentView; | 
| -    infoBarsView_ = infoBarsView; | 
| buttons_.reset([[NSMutableArray alloc] init]); | 
| -    delegate_ = delegate; | 
| +    resizeDelegate_ = resizeDelegate; | 
| +    urlDelegate_ = urlDelegate; | 
| } | 
| return self; | 
| } | 
| @@ -75,14 +67,11 @@ | 
| - (void)awakeFromNib { | 
| // We default to NOT open, which means height=0. | 
| DCHECK([[self view] isHidden]);  // Hidden so it's OK to change. | 
| -  NSRect frame = [[self view] frame]; | 
| -  frame.size.height = 0; | 
| -  frame.size.width = [parentView_ frame].size.width; | 
| -  [[self view] setFrame:frame]; | 
|  | 
| -  // Make sure the nodes stay bottom-aligned. | 
| -  [[self view] setAutoresizingMask:(NSViewWidthSizable | | 
| -                                         NSViewMinYMargin)]; | 
| +  // Set our initial height to zero, since that is what the superview | 
| +  // expects.  We will resize ourselves open later if needed. | 
| +  [[self view] setFrame:NSMakeRect(0, 0, initialWidth_, 0)]; | 
| + | 
| // Be sure to enable the bar before trying to show it... | 
| barIsEnabled_ = YES; | 
| if (profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar)) | 
| @@ -135,84 +124,18 @@ | 
| // determine desired state. | 
| - (void)showBookmarkBar:(BOOL)show immediately:(BOOL)immediately { | 
| if (barIsEnabled_ && (barShouldBeShown_ != show)) { | 
| -    contentViewHasOffset_ = show; | 
| -    [[self view] setHidden:show ? NO : YES]; | 
| +    if ([self view]) { | 
| +      [[self view] setHidden:show ? NO : YES]; | 
| +      [resizeDelegate_ resizeView:[self view] | 
| +                       newHeight:(show ? kBookmarkBarHeight : 0)]; | 
| +    } | 
| barShouldBeShown_ = show; | 
| if (show) { | 
| [self loaded:bookmarkModel_]; | 
| } | 
| -    [self applyContentAreaOffset:show immediately:immediately]; | 
| } | 
| } | 
|  | 
| -// Apply a contents box offset to make (or remove) room for the | 
| -// bookmark bar.  If apply==YES, always make room (the contentView_ is | 
| -// "full size").  If apply==NO we are trying to undo an offset.  If no | 
| -// offset there is nothing to undo. | 
| -// | 
| -// TODO(jrg): it is awkward we change the sizes of views for our | 
| -// parent and siblings; ideally they change their own sizes. | 
| -// | 
| -// TODO(jrg): unlike windows, we process events while an animator is | 
| -// running.  Thus, if you resize the window while the bookmark bar is | 
| -// animating, you'll mess things up.  Fix. | 
| -- (void)applyContentAreaOffset:(BOOL)apply immediately:(BOOL)immediately { | 
| -  if ([self view] == nil) { | 
| -    // We're too early, but awakeFromNib will call me again. | 
| -    return; | 
| -  } | 
| -  if (!contentViewHasOffset_ && apply) { | 
| -    // There is no offset to unconditionally apply. | 
| -    return; | 
| -  } | 
| - | 
| -  // None of these locals are members of the Hall of Justice. | 
| -  NSRect superframe = [parentView_ frame]; | 
| -  NSRect frame = [[self view] frame]; | 
| -  NSRect webframe = [webContentView_ frame]; | 
| -  NSRect infoframe = [infoBarsView_ frame]; | 
| -  if (apply) { | 
| -    superframe.size.height += kBookmarkBarSuperviewHeightAdjustment; | 
| -    // TODO(jrg): y=0 if we add the bookmark bar before the parent | 
| -    // view (toolbar) is placed in the view hierarchy.  A different | 
| -    // CL, where the bookmark bar is extracted from the toolbar nib, | 
| -    // may fix this awkwardness. | 
| -    if (superframe.origin.y > 0) { | 
| -      superframe.origin.y -= kBookmarkBarSuperviewHeightAdjustment; | 
| -      webframe.size.height -= kBookmarkBarWebframeHeightAdjustment; | 
| -    } | 
| -    frame.size.height += kBookmarkBarHeight; | 
| -    infoframe.origin.y -= kBookmarkBarWebframeHeightAdjustment; | 
| -  } else { | 
| -    superframe.size.height -= kBookmarkBarSuperviewHeightAdjustment; | 
| -    superframe.origin.y += kBookmarkBarSuperviewHeightAdjustment; | 
| -    frame.size.height -= kBookmarkBarHeight; | 
| -    webframe.size.height += kBookmarkBarWebframeHeightAdjustment; | 
| -    infoframe.origin.y += kBookmarkBarWebframeHeightAdjustment; | 
| -  } | 
| - | 
| -  // TODO(jrg): Animators can be a little fussy.  Setting these three | 
| -  // off can sometimes causes races where the finish isn't as | 
| -  // expected.  Fix, or clean out the animators as an option. | 
| -  // Odd racing is FAR worse than a lack of an animator. | 
| -  if (1 /* immediately */) { | 
| -    [parentView_ setFrame:superframe]; | 
| -    [webContentView_ setFrame:webframe]; | 
| -    [infoBarsView_ setFrame:infoframe]; | 
| -    [[self view] setFrame:frame]; | 
| -  } else { | 
| -    [[parentView_ animator] setFrame:superframe]; | 
| -    [[webContentView_ animator] setFrame:webframe]; | 
| -    [[infoBarsView_ animator] setFrame:infoframe]; | 
| -    [[[self view] animator] setFrame:frame]; | 
| -  } | 
| - | 
| -  [[self view] setNeedsDisplay:YES]; | 
| -  [parentView_ setNeedsDisplay:YES]; | 
| -  [webContentView_ setNeedsDisplay:YES]; | 
| -  [infoBarsView_ setNeedsDisplay:YES]; | 
| -} | 
| - | 
| - (BOOL)isBookmarkBarVisible { | 
| return barShouldBeShown_; | 
| } | 
| @@ -259,7 +182,7 @@ | 
|  | 
| - (IBAction)openBookmark:(id)sender { | 
| BookmarkNode* node = [self nodeFromButton:sender]; | 
| -  [delegate_ openBookmarkURL:node->GetURL() disposition:CURRENT_TAB]; | 
| +  [urlDelegate_ openBookmarkURL:node->GetURL() disposition:CURRENT_TAB]; | 
| } | 
|  | 
| // Given a NSMenuItem tag, return the appropriate bookmark node id. | 
| @@ -382,17 +305,17 @@ | 
|  | 
| - (IBAction)openBookmarkInNewForegroundTab:(id)sender { | 
| BookmarkNode* node = [self nodeFromMenuItem:sender]; | 
| -  [delegate_ openBookmarkURL:node->GetURL() disposition:NEW_FOREGROUND_TAB]; | 
| +  [urlDelegate_ openBookmarkURL:node->GetURL() disposition:NEW_FOREGROUND_TAB]; | 
| } | 
|  | 
| - (IBAction)openBookmarkInNewWindow:(id)sender { | 
| BookmarkNode* node = [self nodeFromMenuItem:sender]; | 
| -  [delegate_ openBookmarkURL:node->GetURL() disposition:NEW_WINDOW]; | 
| +  [urlDelegate_ openBookmarkURL:node->GetURL() disposition:NEW_WINDOW]; | 
| } | 
|  | 
| - (IBAction)openBookmarkInIncognitoWindow:(id)sender { | 
| BookmarkNode* node = [self nodeFromMenuItem:sender]; | 
| -  [delegate_ openBookmarkURL:node->GetURL() disposition:OFF_THE_RECORD]; | 
| +  [urlDelegate_ openBookmarkURL:node->GetURL() disposition:OFF_THE_RECORD]; | 
| } | 
|  | 
| - (IBAction)editBookmark:(id)sender { | 
| @@ -431,7 +354,7 @@ | 
| for (int i = 0; i < node->GetChildCount(); i++) { | 
| BookmarkNode* child = node->GetChild(i); | 
| if (child->is_url()) | 
| -      [delegate_ openBookmarkURL:child->GetURL() | 
| +      [urlDelegate_ openBookmarkURL:child->GetURL() | 
| disposition:NEW_BACKGROUND_TAB]; | 
| else | 
| [self openBookmarkNodesRecursive:child]; | 
| @@ -572,7 +495,7 @@ | 
| - (IBAction)openBookmarkMenuItem:(id)sender { | 
| int64 tag = [self nodeIdFromMenuTag:[sender tag]]; | 
| const BookmarkNode* node = bookmarkModel_->GetNodeByID(tag); | 
| -  [delegate_ openBookmarkURL:node->GetURL() disposition:CURRENT_TAB]; | 
| +  [urlDelegate_ openBookmarkURL:node->GetURL() disposition:CURRENT_TAB]; | 
| } | 
|  | 
| // Add all items from the given model to our bookmark bar. | 
| @@ -700,8 +623,8 @@ | 
| [self loaded:model]; | 
| } | 
|  | 
| -- (void)setDelegate:(id<BookmarkURLOpener>)delegate { | 
| -  delegate_ = delegate; | 
| +- (void)setUrlDelegate:(id<BookmarkURLOpener>)urlDelegate { | 
| +  urlDelegate_ = urlDelegate; | 
| } | 
|  | 
| - (NSArray*)buttons { | 
|  |