Index: chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm |
diff --git a/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm b/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm |
deleted file mode 100644 |
index 0d8b61a14f089620f851596ca2740af65cd0e472..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm |
+++ /dev/null |
@@ -1,270 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#import "chrome/browser/ui/cocoa/infobars/extension_infobar_controller.h" |
- |
-#include "chrome/browser/extensions/extension_infobar_delegate.h" |
-#include "chrome/browser/extensions/extension_context_menu_model.h" |
-#include "chrome/browser/extensions/extension_view.h" |
-#include "chrome/browser/extensions/extension_view_host.h" |
-#include "chrome/browser/infobars/infobar_service.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser_finder.h" |
-#import "chrome/browser/ui/cocoa/animatable_view.h" |
-#include "chrome/browser/ui/cocoa/infobars/infobar_cocoa.h" |
-#import "chrome/browser/ui/cocoa/menu_button.h" |
-#include "content/public/browser/web_contents.h" |
-#include "extensions/browser/image_loader.h" |
-#include "extensions/common/constants.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/extension_icon_set.h" |
-#include "extensions/common/extension_resource.h" |
-#include "extensions/common/manifest_handlers/icons_handler.h" |
-#include "grit/theme_resources.h" |
-#include "skia/ext/skia_utils_mac.h" |
-#include "ui/base/resource/resource_bundle.h" |
-#include "ui/gfx/canvas.h" |
-#import "ui/base/cocoa/menu_controller.h" |
-#include "ui/gfx/image/image.h" |
- |
-const CGFloat kBottomBorderHeightPx = 1.0; |
-const CGFloat kButtonHeightPx = 26.0; |
-const CGFloat kButtonLeftMarginPx = 2.0; |
-const CGFloat kButtonWidthPx = 34.0; |
-const CGFloat kDropArrowLeftMarginPx = 3.0; |
-const CGFloat kToolbarMinHeightPx = 36.0; |
-const CGFloat kToolbarMaxHeightPx = 72.0; |
- |
-@interface ExtensionInfoBarController(Private) |
-// Called when the extension's hosted NSView has been resized. |
-- (void)extensionViewFrameChanged; |
-// Returns the clamped height of the extension view to be within the min and max |
-// values defined above. |
-- (CGFloat)clampedExtensionViewHeight; |
-// Adjusts the width of the extension's hosted view to match the window's width |
-// and sets the proper height for it as well. |
-- (void)adjustExtensionViewSize; |
-// Sets the image to be used in the button on the left side of the infobar. |
-- (void)setButtonImage:(NSImage*)image; |
-@end |
- |
-// A helper class to bridge the asynchronous Skia bitmap loading mechanism to |
-// the extension's button. |
-class InfobarBridge { |
- public: |
- explicit InfobarBridge(ExtensionInfoBarController* owner) |
- : owner_(owner), |
- delegate_([owner delegate]->AsExtensionInfoBarDelegate()), |
- weak_ptr_factory_(this) { |
- LoadIcon(); |
- } |
- |
- // Load the Extension's icon image. |
- void LoadIcon() { |
- const extensions::Extension* extension = delegate_->extension_view_host()-> |
- extension(); |
- extensions::ExtensionResource icon_resource = |
- extensions::IconsInfo::GetIconResource( |
- extension, |
- extension_misc::EXTENSION_ICON_BITTY, |
- ExtensionIconSet::MATCH_EXACTLY); |
- extensions::ImageLoader* loader = extensions::ImageLoader::Get( |
- delegate_->extension_view_host()->browser_context()); |
- loader->LoadImageAsync(extension, icon_resource, |
- gfx::Size(extension_misc::EXTENSION_ICON_BITTY, |
- extension_misc::EXTENSION_ICON_BITTY), |
- base::Bind(&InfobarBridge::OnImageLoaded, |
- weak_ptr_factory_.GetWeakPtr())); |
- } |
- |
- // ImageLoader callback. |
- // TODO(andybons): The infobar view implementations share a lot of the same |
- // code. Come up with a strategy to share amongst them. |
- void OnImageLoaded(const gfx::Image& image) { |
- if (!delegate_) |
- return; // The delegate can go away while the image asynchronously loads. |
- |
- ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
- |
- // Fall back on the default extension icon on failure. |
- const gfx::ImageSkia* icon; |
- if (image.IsEmpty()) |
- icon = rb.GetImageSkiaNamed(IDR_EXTENSIONS_SECTION); |
- else |
- icon = image.ToImageSkia(); |
- |
- gfx::ImageSkia* drop_image = rb.GetImageSkiaNamed(IDR_APP_DROPARROW); |
- |
- const int image_size = extension_misc::EXTENSION_ICON_BITTY; |
- scoped_ptr<gfx::Canvas> canvas( |
- new gfx::Canvas( |
- gfx::Size(image_size + kDropArrowLeftMarginPx + drop_image->width(), |
- image_size), 1.0f, false)); |
- canvas->DrawImageInt(*icon, |
- 0, 0, icon->width(), icon->height(), |
- 0, 0, image_size, image_size, |
- false); |
- canvas->DrawImageInt(*drop_image, |
- image_size + kDropArrowLeftMarginPx, |
- image_size / 2); |
- [owner_ setButtonImage:gfx::SkBitmapToNSImage( |
- canvas->ExtractImageRep().sk_bitmap())]; |
- } |
- |
- private: |
- // Weak. Owns us. |
- ExtensionInfoBarController* owner_; |
- |
- // Weak. |
- ExtensionInfoBarDelegate* delegate_; |
- |
- base::WeakPtrFactory<InfobarBridge> weak_ptr_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(InfobarBridge); |
-}; |
- |
- |
-@implementation ExtensionInfoBarController |
- |
-- (id)initWithInfoBar:(InfoBarCocoa*)infobar { |
- if ((self = [super initWithInfoBar:infobar])) { |
- dropdownButton_.reset([[MenuButton alloc] init]); |
- [dropdownButton_ setOpenMenuOnClick:YES]; |
- |
- base::scoped_nsobject<NSMenu> contextMenu( |
- [[NSMenu alloc] initWithTitle:@""]); |
- [contextMenu setDelegate:self]; |
- // See menu_button.h for documentation on why this is needed. |
- [contextMenu addItemWithTitle:@"" action:NULL keyEquivalent:@""]; |
- [dropdownButton_ setAttachedMenu:contextMenu]; |
- |
- bridge_.reset(new InfobarBridge(self)); |
- } |
- return self; |
-} |
- |
-- (void)dealloc { |
- [[NSNotificationCenter defaultCenter] removeObserver:self]; |
- [super dealloc]; |
-} |
- |
-- (void)addAdditionalControls { |
- [self removeButtons]; |
- |
- extensionView_ = [self delegate]->AsExtensionInfoBarDelegate() |
- ->extension_view_host()->view()->GetNativeView(); |
- |
- // Add the extension's RenderWidgetHostView to the view hierarchy of the |
- // InfoBar and make sure to place it below the Close button. |
- [infoBarView_ addSubview:extensionView_ |
- positioned:NSWindowBelow |
- relativeTo:(NSView*)closeButton_]; |
- |
- // Add the context menu button to the hierarchy. |
- [dropdownButton_ setShowsBorderOnlyWhileMouseInside:YES]; |
- CGFloat buttonY = |
- std::floor(NSMidY([infoBarView_ frame]) - (kButtonHeightPx / 2.0)) + |
- kBottomBorderHeightPx; |
- NSRect buttonFrame = NSMakeRect( |
- kButtonLeftMarginPx, buttonY, kButtonWidthPx, kButtonHeightPx); |
- [dropdownButton_ setFrame:buttonFrame]; |
- [dropdownButton_ setAutoresizingMask:NSViewMinYMargin | NSViewMaxYMargin]; |
- [infoBarView_ addSubview:dropdownButton_]; |
- |
- // Because the parent view has a bottom border, account for it during |
- // positioning. |
- NSRect extensionFrame = [extensionView_ frame]; |
- extensionFrame.origin.y = kBottomBorderHeightPx; |
- |
- [extensionView_ setFrame:extensionFrame]; |
- // The extension's native view will only have a height that is non-zero if it |
- // already has been loaded and rendered, which is the case when you switch |
- // back to a tab with an extension infobar within it. The reason this is |
- // needed is because the extension view's frame will not have changed in the |
- // above case, so the NSViewFrameDidChangeNotification registered below will |
- // never fire. |
- if (NSHeight(extensionFrame) > 0.0) |
- [self infobar]->SetBarTargetHeight([self clampedExtensionViewHeight]); |
- |
- [self adjustExtensionViewSize]; |
- |
- // These two notification handlers are here to ensure the width of the |
- // native extension view is the same as the browser window's width and that |
- // the parent infobar view matches the height of the extension's native view. |
- [[NSNotificationCenter defaultCenter] |
- addObserver:self |
- selector:@selector(extensionViewFrameChanged) |
- name:NSViewFrameDidChangeNotification |
- object:extensionView_]; |
- |
- [[NSNotificationCenter defaultCenter] |
- addObserver:self |
- selector:@selector(adjustExtensionViewSize) |
- name:NSViewFrameDidChangeNotification |
- object:[self view]]; |
-} |
- |
-- (void)infobarWillHide { |
- [[dropdownButton_ menu] cancelTracking]; |
- [super infobarWillHide]; |
-} |
- |
-- (void)infobarWillClose { |
- [self disablePopUpMenu:[dropdownButton_ menu]]; |
- [super infobarWillClose]; |
-} |
- |
-- (void)extensionViewFrameChanged { |
- [self adjustExtensionViewSize]; |
- [self infobar]->SetBarTargetHeight([self clampedExtensionViewHeight]); |
-} |
- |
-- (CGFloat)clampedExtensionViewHeight { |
- CGFloat height = [self delegate]->AsExtensionInfoBarDelegate()->height(); |
- return std::max(kToolbarMinHeightPx, std::min(height, kToolbarMaxHeightPx)); |
-} |
- |
-- (void)adjustExtensionViewSize { |
- [extensionView_ setPostsFrameChangedNotifications:NO]; |
- NSSize extensionViewSize = [extensionView_ frame].size; |
- extensionViewSize.width = NSWidth([[self view] frame]); |
- extensionViewSize.height = [self clampedExtensionViewHeight]; |
- [extensionView_ setFrameSize:extensionViewSize]; |
- [extensionView_ setPostsFrameChangedNotifications:YES]; |
-} |
- |
-- (void)setButtonImage:(NSImage*)image { |
- [dropdownButton_ setImage:image]; |
-} |
- |
-- (void)menuNeedsUpdate:(NSMenu*)menu { |
- DCHECK([self isOwned]); |
- |
- if (!contextMenuController_) { |
- extensions::ExtensionViewHost* extensionViewHost = |
- [self delegate]->AsExtensionInfoBarDelegate()->extension_view_host(); |
- Browser* browser = chrome::FindBrowserWithWebContents( |
- [self delegate]->AsExtensionInfoBarDelegate()->GetWebContents()); |
- contextMenuModel_ = make_scoped_refptr(new ExtensionContextMenuModel( |
- extensionViewHost->extension(), browser)); |
- contextMenuController_.reset( |
- [[MenuController alloc] initWithModel:contextMenuModel_.get() |
- useWithPopUpButtonCell:NO]); |
- } |
- |
- [menu removeAllItems]; |
- [contextMenuController_ menuNeedsUpdate:menu]; |
-} |
- |
-@end |
- |
-// static |
-scoped_ptr<infobars::InfoBar> ExtensionInfoBarDelegate::CreateInfoBar( |
- scoped_ptr<ExtensionInfoBarDelegate> delegate) { |
- scoped_ptr<InfoBarCocoa> infobar(new InfoBarCocoa(delegate.Pass())); |
- base::scoped_nsobject<ExtensionInfoBarController> controller( |
- [[ExtensionInfoBarController alloc] initWithInfoBar:infobar.get()]); |
- infobar->set_controller(controller); |
- return infobar.Pass(); |
-} |