| Index: chrome/browser/cocoa/autocomplete_text_field_cell.mm | 
| diff --git a/chrome/browser/cocoa/autocomplete_text_field_cell.mm b/chrome/browser/cocoa/autocomplete_text_field_cell.mm | 
| index 8558b808a952cf3ef543bac909f712c3abd3fdcf..8772f5af9d9a68b4518e10c8a2cdef484383aab8 100644 | 
| --- a/chrome/browser/cocoa/autocomplete_text_field_cell.mm | 
| +++ b/chrome/browser/cocoa/autocomplete_text_field_cell.mm | 
| @@ -1,4 +1,4 @@ | 
| -// Copyright (c) 2009 The Chromium Authors. All rights reserved. | 
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved. | 
| // Use of this source code is governed by a BSD-style license that can be | 
| // found in the LICENSE file. | 
|  | 
| @@ -57,6 +57,22 @@ CGFloat WidthForKeyword(NSAttributedString* keywordString) { | 
|  | 
| }  // namespace | 
|  | 
| +@implementation AutocompleteTextFieldIcon | 
| + | 
| +@synthesize rect = rect_; | 
| +@synthesize view = view_; | 
| + | 
| ++ (AutocompleteTextFieldIcon*) | 
| +    iconWithRect:(NSRect)rect | 
| +            view:(LocationBarViewMac::LocationBarImageView*)view { | 
| +  AutocompleteTextFieldIcon* result = [[AutocompleteTextFieldIcon alloc] init]; | 
| +  [result setRect:rect]; | 
| +  [result setView:view]; | 
| +  return [result autorelease]; | 
| +} | 
| + | 
| +@end | 
| + | 
| @implementation AutocompleteTextFieldCell | 
|  | 
| // @synthesize doesn't seem to compile for this transition. | 
| @@ -202,12 +218,9 @@ CGFloat WidthForKeyword(NSAttributedString* keywordString) { | 
| security_image_view_ = view; | 
| } | 
|  | 
| -- (void)onSecurityIconMousePressed { | 
| -  security_image_view_->OnMousePressed(); | 
| -} | 
| - | 
| -- (void)onPageActionMousePressedIn:(NSRect)iconFrame forIndex:(size_t)index { | 
| -  page_action_views_->OnMousePressed(iconFrame, index); | 
| +- (void)setContentBlockedViewList: | 
| +    (LocationBarViewMac::ContentBlockedViews*)views { | 
| +  content_blocked_views_ = views; | 
| } | 
|  | 
| // Overriden to account for the hint strings and hint icons. | 
| @@ -235,32 +248,15 @@ CGFloat WidthForKeyword(NSAttributedString* keywordString) { | 
| textFrame.size.width = NSMaxX(cellFrame) - NSMinX(textFrame); | 
| } | 
| } else { | 
| -    // Account for the lock icon, if any, and any visible Page Action icons. | 
| +    // Leave room for images on the right (lock icon etc). | 
| +    NSArray* iconFrames = [self layedOutIcons:cellFrame]; | 
| CGFloat width = 0; | 
| -    const size_t iconCount = [self pageActionCount]; | 
| -    for (size_t i = 0; i < iconCount; ++i) { | 
| -      LocationBarViewMac::PageActionImageView* view = | 
| -          page_action_views_->ViewAt(i); | 
| -      NSImage* image = view->GetImage(); | 
| -      if (image && view->IsVisible()) { | 
| -        width += [image size].width + kIconHorizontalPad; | 
| -      } | 
| -    } | 
| - | 
| -    if (security_image_view_ && security_image_view_->IsVisible()) { | 
| -      width += [security_image_view_->GetImage() size].width + | 
| -          kIconHorizontalPad; | 
| -      NSAttributedString* label = security_image_view_->GetLabel(); | 
| -      if (label) { | 
| -        width += ceil([label size].width) + kHintXOffset; | 
| -      } | 
| -    } | 
| +    if ([iconFrames count] > 0) | 
| +      width = NSMaxX(cellFrame) - NSMinX([[iconFrames lastObject] rect]); | 
| if (width > 0) | 
| width += kIconHorizontalPad; | 
| - | 
| -    if (width < NSWidth(cellFrame)) { | 
| +    if (width < NSWidth(cellFrame)) | 
| textFrame.size.width -= width; | 
| -    } | 
| } | 
|  | 
| return textFrame; | 
| @@ -308,53 +304,21 @@ CGFloat WidthForKeyword(NSAttributedString* keywordString) { | 
| - (NSRect)pageActionFrameForIndex:(size_t)index inFrame:(NSRect)cellFrame { | 
| LocationBarViewMac::PageActionImageView* view = | 
| page_action_views_->ViewAt(index); | 
| -  const NSImage* icon = view->GetImage(); | 
|  | 
| // If we are calculating space for a preview page action, the icon is still | 
| // loading. We use this function only to get the correct x value for the | 
| // extension installed bubble arrow. | 
| if (!view->preview_enabled() && | 
| -      (!icon || !view->IsVisible())) { | 
| +      (!view->GetImage() || !view->IsVisible())) { | 
| return NSZeroRect; | 
| } | 
|  | 
| -  // Compute the amount of space used by this icon plus any other icons to its | 
| -  // right. It's terribly inefficient to do this anew every time, but easy to | 
| -  // understand. It should be fine for 5 or 10 installed Page Actions, perhaps | 
| -  // too slow for 100. | 
| -  // TODO(pamg): Refactor to avoid this if performance is a problem. | 
| -  const NSRect securityIconRect = [self securityImageFrameForFrame:cellFrame]; | 
| -  CGFloat widthUsed = 0.0; | 
| -  if (NSWidth(securityIconRect) > 0) { | 
| -    widthUsed += NSMaxX(cellFrame) - NSMinX(securityIconRect); | 
| +  for (AutocompleteTextFieldIcon* icon in [self layedOutIcons:cellFrame]) { | 
| +    if (view == [icon view]) | 
| +      return [icon rect]; | 
| } | 
| -  for (size_t i = 0; i <= index; ++i) { | 
| -    view = page_action_views_->ViewAt(i); | 
| -    if (view->IsVisible()) { | 
| -      NSImage* image = view->GetImage(); | 
| -      if (image) { | 
| -        // Page Action icons don't have labels. Don't compute space for them. | 
| -        widthUsed += [image size].width + kIconHorizontalPad; | 
| -      } | 
| -    } | 
| -  } | 
| -  widthUsed += kIconHorizontalPad; | 
| - | 
| -  // If we are calculating frame space for a preview, the icon is still | 
| -  // loading -- use maximum size as a placeholder. | 
| -  NSSize iconSize = view->GetImageSize(); | 
| - | 
| -  return [self rightJustifyImage:iconSize | 
| -                          inRect:cellFrame | 
| -                      withMargin:widthUsed]; | 
| -} | 
| - | 
| -- (NSString*)pageActionToolTipForIndex:(size_t)index { | 
| -  return page_action_views_->ViewAt(index)->GetToolTip(); | 
| -} | 
| - | 
| -- (ExtensionAction*)pageActionForIndex:(size_t)index { | 
| -  return page_action_views_->ViewAt(index)->page_action(); | 
| +  NOTREACHED(); | 
| +  return NSZeroRect; | 
| } | 
|  | 
| - (void)drawHintWithFrame:(NSRect)cellFrame inView:(NSView*)controlView { | 
| @@ -430,25 +394,65 @@ CGFloat WidthForKeyword(NSAttributedString* keywordString) { | 
| } else if (keywordString_) { | 
| [self drawKeywordWithFrame:cellFrame inView:controlView]; | 
| } else { | 
| -    if (security_image_view_ && security_image_view_->IsVisible()) { | 
| -      [self drawImageView:security_image_view_ | 
| -                  inFrame:[self securityImageFrameForFrame:cellFrame] | 
| +    for (AutocompleteTextFieldIcon* icon in [self layedOutIcons:cellFrame]) { | 
| +      [self drawImageView:[icon view] | 
| +                  inFrame:[icon rect] | 
| inView:controlView]; | 
| } | 
| +  } | 
|  | 
| -    const size_t pageActionCount = [self pageActionCount]; | 
| -    for (size_t i = 0; i < pageActionCount; ++i) { | 
| -      LocationBarViewMac::PageActionImageView* view = | 
| -          page_action_views_->ViewAt(i); | 
| -      if (view && view->IsVisible()) { | 
| -        [self drawImageView:view | 
| -                    inFrame:[self pageActionFrameForIndex:i inFrame:cellFrame] | 
| -                     inView:controlView]; | 
| -      } | 
| +  [super drawInteriorWithFrame:cellFrame inView:controlView]; | 
| +} | 
| + | 
| +- (NSArray*)layedOutIcons:(NSRect)cellFrame { | 
| +  NSMutableArray* result = [NSMutableArray arrayWithCapacity:0]; | 
| +  NSRect iconFrame = cellFrame; | 
| +  if (security_image_view_ && security_image_view_->IsVisible()) { | 
| +    NSRect securityImageFrame = [self securityImageFrameForFrame:iconFrame]; | 
| +    [result addObject: | 
| +        [AutocompleteTextFieldIcon iconWithRect:securityImageFrame | 
| +                                           view:security_image_view_]]; | 
| +    iconFrame.size.width -= NSMaxX(iconFrame) - NSMinX(securityImageFrame); | 
| +  } | 
| + | 
| +  const size_t pageActionCount = [self pageActionCount]; | 
| +  for (size_t i = 0; i < pageActionCount; ++i) { | 
| +    LocationBarViewMac::PageActionImageView* view = | 
| +        page_action_views_->ViewAt(i); | 
| +    if (view->preview_enabled() || (view->GetImage() && view->IsVisible())) { | 
| +      NSSize iconSize = view->GetImageSize(); | 
| +      NSRect pageActionFrame = | 
| +          [self rightJustifyImage:iconSize | 
| +                           inRect:iconFrame | 
| +                       withMargin:kIconHorizontalPad + iconSize.width]; | 
| +      [result addObject: | 
| +          [AutocompleteTextFieldIcon iconWithRect:pageActionFrame view:view]]; | 
| +      iconFrame.size.width -= NSMaxX(iconFrame) - NSMinX(pageActionFrame); | 
| } | 
| } | 
|  | 
| -  [super drawInteriorWithFrame:cellFrame inView:controlView]; | 
| +  if (content_blocked_views_) { | 
| +    // We use a reverse_iterator here because we're laying out the views from | 
| +    // right to left but in the vector they're ordered left to right. | 
| +    for (LocationBarViewMac::ContentBlockedViews::const_reverse_iterator | 
| +            it(content_blocked_views_->rbegin()); | 
| +        it != const_cast<const LocationBarViewMac::ContentBlockedViews*>( | 
| +            content_blocked_views_)->rend(); | 
| +        ++it) { | 
| +      if ((*it)->IsVisible()) { | 
| +        NSImage* image = (*it)->GetImage(); | 
| +        NSRect blockedContentFrame = | 
| +            [self rightJustifyImage:[image size] | 
| +                             inRect:iconFrame | 
| +                         withMargin:[image size].width + kIconHorizontalPad]; | 
| +        [result addObject: | 
| +            [AutocompleteTextFieldIcon iconWithRect:blockedContentFrame | 
| +                                               view:*it]]; | 
| +        iconFrame.size.width -= NSMaxX(iconFrame) - NSMinX(blockedContentFrame); | 
| +      } | 
| +    } | 
| +  } | 
| +  return result; | 
| } | 
|  | 
| @end | 
|  |