| Index: trunk/src/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm
|
| ===================================================================
|
| --- trunk/src/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm (revision 238401)
|
| +++ trunk/src/chrome/browser/ui/cocoa/infobars/extension_infobar_controller.mm (working copy)
|
| @@ -52,15 +52,21 @@
|
|
|
| // A helper class to bridge the asynchronous Skia bitmap loading mechanism to
|
| // the extension's button.
|
| -class InfobarBridge {
|
| +class InfobarBridge : public ExtensionInfoBarDelegate::DelegateObserver {
|
| public:
|
| explicit InfobarBridge(ExtensionInfoBarController* owner)
|
| : owner_(owner),
|
| delegate_([owner delegate]->AsExtensionInfoBarDelegate()),
|
| weak_ptr_factory_(this) {
|
| + delegate_->set_observer(this);
|
| LoadIcon();
|
| }
|
|
|
| + virtual ~InfobarBridge() {
|
| + if (delegate_)
|
| + delegate_->set_observer(NULL);
|
| + }
|
| +
|
| // Load the Extension's icon image.
|
| void LoadIcon() {
|
| const extensions::Extension* extension = delegate_->extension_view_host()->
|
| @@ -113,6 +119,11 @@
|
| canvas->ExtractImageRep().sk_bitmap())];
|
| }
|
|
|
| + // Overridden from ExtensionInfoBarDelegate::DelegateObserver:
|
| + virtual void OnDelegateDeleted() OVERRIDE {
|
| + delegate_ = NULL;
|
| + }
|
| +
|
| private:
|
| // Weak. Owns us.
|
| ExtensionInfoBarController* owner_;
|
| @@ -128,11 +139,22 @@
|
|
|
| @implementation ExtensionInfoBarController
|
|
|
| -- (id)initWithInfoBar:(InfoBarCocoa*)infobar {
|
| +- (id)initWithInfoBar:(InfoBarCocoa*)infobar
|
| + window:(NSWindow*)window {
|
| if ((self = [super initWithInfoBar:infobar])) {
|
| + window_ = window;
|
| dropdownButton_.reset([[MenuButton alloc] init]);
|
| [dropdownButton_ setOpenMenuOnClick:YES];
|
|
|
| + extensions::ExtensionViewHost* extensionViewHost =
|
| + [self delegate]->AsExtensionInfoBarDelegate()->extension_view_host();
|
| + Browser* browser = chrome::FindBrowserWithWebContents(
|
| + [self infobar]->OwnerCocoa()->web_contents());
|
| + contextMenuController_.reset([[ExtensionActionContextMenuController alloc]
|
| + initWithExtension:extensionViewHost->extension()
|
| + browser:browser
|
| + extensionAction:NULL]);
|
| +
|
| base::scoped_nsobject<NSMenu> contextMenu(
|
| [[NSMenu alloc] initWithTitle:@""]);
|
| [contextMenu setDelegate:self];
|
| @@ -202,15 +224,10 @@
|
| [[NSNotificationCenter defaultCenter]
|
| addObserver:self
|
| selector:@selector(adjustExtensionViewSize)
|
| - name:NSViewFrameDidChangeNotification
|
| - object:[self view]];
|
| + name:NSWindowDidResizeNotification
|
| + object:window_];
|
| }
|
|
|
| -- (void)infobarWillHide {
|
| - [[dropdownButton_ menu] cancelTracking];
|
| - [super infobarWillHide];
|
| -}
|
| -
|
| - (void)infobarWillClose {
|
| [self disablePopUpMenu:[dropdownButton_ menu]];
|
| [super infobarWillClose];
|
| @@ -229,7 +246,7 @@
|
| - (void)adjustExtensionViewSize {
|
| [extensionView_ setPostsFrameChangedNotifications:NO];
|
| NSSize extensionViewSize = [extensionView_ frame].size;
|
| - extensionViewSize.width = NSWidth([[self view] frame]);
|
| + extensionViewSize.width = NSWidth([window_ frame]);
|
| extensionViewSize.height = [self clampedExtensionViewHeight];
|
| [extensionView_ setFrameSize:extensionViewSize];
|
| [extensionView_ setPostsFrameChangedNotifications:YES];
|
| @@ -240,32 +257,20 @@
|
| }
|
|
|
| - (void)menuNeedsUpdate:(NSMenu*)menu {
|
| - DCHECK([self isOwned]);
|
| -
|
| - if (!contextMenuController_) {
|
| - extensions::ExtensionViewHost* extensionViewHost =
|
| - [self delegate]->AsExtensionInfoBarDelegate()->extension_view_host();
|
| - Browser* browser = chrome::FindBrowserWithWebContents(
|
| - [self infobar]->OwnerCocoa()->web_contents());
|
| - contextMenuController_.reset([[ExtensionActionContextMenuController alloc]
|
| - initWithExtension:extensionViewHost->extension()
|
| - browser:browser
|
| - extensionAction:NULL]);
|
| - }
|
| -
|
| [menu removeAllItems];
|
| [contextMenuController_ populateMenu:menu];
|
| }
|
|
|
| @end
|
|
|
| -// static
|
| -scoped_ptr<InfoBar> ExtensionInfoBarDelegate::CreateInfoBar(
|
| - scoped_ptr<ExtensionInfoBarDelegate> delegate) {
|
| - scoped_ptr<InfoBarCocoa> infobar(
|
| - new InfoBarCocoa(delegate.PassAs<InfoBarDelegate>()));
|
| +InfoBar* ExtensionInfoBarDelegate::CreateInfoBar(InfoBarService* owner) {
|
| + scoped_ptr<InfoBarCocoa> infobar(new InfoBarCocoa(owner, this));
|
| + NSWindow* window =
|
| + [(NSView*)owner->web_contents()->GetView()->GetContentNativeView()
|
| + window];
|
| base::scoped_nsobject<ExtensionInfoBarController> controller(
|
| - [[ExtensionInfoBarController alloc] initWithInfoBar:infobar.get()]);
|
| + [[ExtensionInfoBarController alloc] initWithInfoBar:infobar.get()
|
| + window:window]);
|
| infobar->set_controller(controller);
|
| - return infobar.PassAs<InfoBar>();
|
| + return infobar.release();
|
| }
|
|
|