Index: chrome/browser/cocoa/extensions/extension_infobar_controller.mm |
=================================================================== |
--- chrome/browser/cocoa/extensions/extension_infobar_controller.mm (revision 0) |
+++ chrome/browser/cocoa/extensions/extension_infobar_controller.mm (revision 0) |
@@ -0,0 +1,117 @@ |
+// 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. |
+ |
+#import "chrome/browser/cocoa/extensions/extension_infobar_controller.h" |
+ |
+#import "chrome/browser/cocoa/animatable_view.h" |
+#include "chrome/browser/cocoa/infobar.h" |
+#include "chrome/browser/extensions/extension_host.h" |
+#include "chrome/browser/extensions/extension_infobar_delegate.h" |
+#include "chrome/browser/tab_contents/tab_contents.h" |
+ |
+namespace { |
+const CGFloat kAnimationDuration = 0.12; |
+const CGFloat kBottomBorderHeightPx = 1.0; |
+} // namepsace |
+ |
+@interface ExtensionInfoBarController(Private) |
+// Called when the extension's hosted NSView has been resized. |
+- (void)extensionViewFrameChanged; |
+// Adjusts the width of the extension's hosted view to match the window's width. |
+- (void)adjustWidthToFitWindow; |
+@end |
+ |
+@implementation ExtensionInfoBarController |
+ |
+- (id)initWithDelegate:(InfoBarDelegate*)delegate |
+ window:(NSWindow*)window { |
+ if ((self = [super initWithDelegate:delegate])) { |
+ window_ = window; |
+ } |
+ return self; |
+} |
+ |
+- (void)dealloc { |
+ [[NSNotificationCenter defaultCenter] removeObserver:self]; |
+ [super dealloc]; |
+} |
+ |
+- (void)addAdditionalControls { |
+ [self removeButtons]; |
+ |
+ extensionView_ = delegate_->AsExtensionInfoBarDelegate()-> |
+ extension_host()->view()->native_view(); |
+ |
+ // Add the extension's RenderWidgetHostViewMac 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_]; |
+ |
+ // 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 notification registered below will never fire. |
+ if (extensionFrame.size.height > 0.0) { |
+ NSSize infoBarSize = [[self view] frame].size; |
+ infoBarSize.height = extensionFrame.size.height + kBottomBorderHeightPx; |
+ [[self view] setFrameSize:infoBarSize]; |
+ [infoBarView_ setFrameSize:infoBarSize]; |
+ } |
+ |
+ [self adjustWidthToFitWindow]; |
+ |
+ // 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(adjustWidthToFitWindow) |
+ name:NSWindowDidResizeNotification |
+ object:window_]; |
+} |
+ |
+- (void)extensionViewFrameChanged { |
+ [self adjustWidthToFitWindow]; |
+ |
+ AnimatableView* view = [self animatableView]; |
+ NSRect infoBarFrame = [view frame]; |
+ CGFloat newHeight = NSHeight([extensionView_ frame]) + kBottomBorderHeightPx; |
+ [infoBarView_ setPostsFrameChangedNotifications:NO]; |
+ infoBarFrame.size.height = newHeight; |
+ [infoBarView_ setFrame:infoBarFrame]; |
+ [infoBarView_ setPostsFrameChangedNotifications:YES]; |
+ [view animateToNewHeight:newHeight duration:kAnimationDuration]; |
+} |
+ |
+- (void)adjustWidthToFitWindow { |
+ [extensionView_ setPostsFrameChangedNotifications:NO]; |
+ NSSize extensionViewSize = [extensionView_ frame].size; |
+ extensionViewSize.width = NSWidth([window_ frame]); |
+ [extensionView_ setFrameSize:extensionViewSize]; |
+ [extensionView_ setPostsFrameChangedNotifications:YES]; |
+} |
+ |
+@end |
+ |
+InfoBar* ExtensionInfoBarDelegate::CreateInfoBar() { |
+ NSWindow* window = [(NSView*)tab_contents_->GetContentNativeView() window]; |
+ ExtensionInfoBarController* controller = |
+ [[ExtensionInfoBarController alloc] initWithDelegate:this |
+ window:window]; |
+ return new InfoBar(controller); |
+} |
Property changes on: chrome/browser/cocoa/extensions/extension_infobar_controller.mm |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |