Chromium Code Reviews| Index: chrome/browser/ui/views/infobars/extension_infobar.cc |
| =================================================================== |
| --- chrome/browser/ui/views/infobars/extension_infobar.cc (revision 65711) |
| +++ chrome/browser/ui/views/infobars/extension_infobar.cc (working copy) |
| @@ -32,61 +32,51 @@ |
| ExtensionInfoBar::ExtensionInfoBar(ExtensionInfoBarDelegate* delegate) |
| : InfoBar(delegate), |
| - delegate_(delegate), |
| ALLOW_THIS_IN_INITIALIZER_LIST(tracker_(this)) { |
| - delegate_->set_observer(this); |
| - |
| - ExtensionHost* extension_host = delegate_->extension_host(); |
| - |
| // We set the target height for the InfoBar to be the height of the |
| // ExtensionView it contains (plus 1 because the view should not overlap the |
| // separator line at the bottom). When the InfoBar is first created, however, |
| // this value is 0 but becomes positive after the InfoBar has been shown. See |
| // function: OnExtensionPreferredSizeChanged. |
| - gfx::Size sz = extension_host->view()->GetPreferredSize(); |
| - if (sz.height() > 0) |
| - sz.set_height(sz.height() + 1); |
| - set_target_height(sz.height()); |
| + ExtensionView* extension_view = delegate->extension_host()->view(); |
| + gfx::Size sz = extension_view->GetPreferredSize(); |
| + set_target_height((sz.height() > 0) ? (sz.height() + 1) : sz.height()); |
| // Setup the extension icon and its associated drop down menu. |
| SetupIconAndMenu(); |
| // Get notified of resize events for the ExtensionView. |
| - extension_host->view()->SetContainer(this); |
| + extension_view->SetContainer(this); |
| // We show the ExtensionView, but we don't want it deleted when we get |
| // destroyed, which happens on tab switching (for example). |
| - extension_host->view()->set_parent_owned(false); |
| - AddChildView(extension_host->view()); |
| + extension_view->set_parent_owned(false); |
| + AddChildView(extension_view); |
| } |
| ExtensionInfoBar::~ExtensionInfoBar() { |
| - if (delegate_) { |
| - delegate_->extension_host()->view()->SetContainer(NULL); |
| - delegate_->set_observer(NULL); |
| + if (delegate()) { |
| + delegate()->AsExtensionInfoBarDelegate()->extension_host()->view()-> |
| + SetContainer(NULL); |
| } |
| } |
| void ExtensionInfoBar::OnExtensionPreferredSizeChanged(ExtensionView* view) { |
| - DCHECK(view == delegate_->extension_host()->view()); |
| + DCHECK(delegate()); |
|
Finnur
2010/11/15 23:08:41
nit: This is redundant and just adds cruft to the
|
| + ExtensionView* extension_view = |
| + delegate()->AsExtensionInfoBarDelegate()->extension_host()->view(); |
| + DCHECK_EQ(extension_view, view); |
| - // When the infobar is closed, it animates to 0 vertical height. We'll |
| - // continue to get size changed notifications from the ExtensionView, but we |
| - // need to ignore them otherwise we'll try to re-animate open (and leak the |
| - // infobar view). |
| - if (delegate_->closing()) |
| - return; |
|
Finnur
2010/11/15 23:08:41
So, given the new model, there is no chance of it
|
| + extension_view->SetVisible(true); |
| - delegate_->extension_host()->view()->SetVisible(true); |
| + if (height() == 0) |
| + animation()->Reset(0.0); |
| - gfx::Size sz = view->GetPreferredSize(); |
| // Clamp height to a min and a max size of between 1 and 2 InfoBars. |
| + gfx::Size sz = view->GetPreferredSize(); |
| int default_height = static_cast<int>(InfoBar::kDefaultTargetHeight); |
| - sz.set_height(std::max(default_height, sz.height())); |
| - sz.set_height(std::min(2 * default_height, sz.height())); |
| + set_target_height( |
| + std::min(2 * default_height, std::max(default_height, sz.height()))); |
| - if (height() == 0) |
| - animation()->Reset(0.0); |
| - set_target_height(sz.height()); |
| animation()->Show(); |
| } |
| @@ -97,21 +87,21 @@ |
| // Layout the extension icon + drop down menu. |
| int x = 0; |
| gfx::Size sz = menu_->GetPreferredSize(); |
| - menu_->SetBounds(x, |
| - (height() - sz.height()) / 2, |
| - sz.width(), sz.height()); |
| + menu_->SetBounds(x, (height() - sz.height()) / 2, sz.width(), sz.height()); |
| x += sz.width() + kMenuHorizontalMargin; |
| - // Layout the ExtensionView, showing the HTML InfoBar. |
| - ExtensionView* view = delegate_->extension_host()->view(); |
| - view->SetBounds(x, 0, width() - x - kFarRightMargin - 1, height() - 1); |
| + // Layout the ExtensionView, showing the HTML InfoBar. The delegate owns the |
| + // view, so if the delegate is destroyed, the view will have been destroyed as |
| + // well (which also removes it as a child view). |
| + if (delegate()) { |
| + delegate()->AsExtensionInfoBarDelegate()->extension_host()->view()-> |
| + SetBounds(x, 0, width() - x - kFarRightMargin - 1, height() - 1); |
| + } |
| } |
| -void ExtensionInfoBar::OnImageLoaded( |
| - SkBitmap* image, ExtensionResource resource, int index) { |
| - if (!delegate_) |
| - return; // The delegate can go away while we asynchronously load images. |
|
Finnur
2010/11/15 23:08:41
This should be OK I guess given that it is guarant
|
| - |
| +void ExtensionInfoBar::OnImageLoaded(SkBitmap* image, |
| + ExtensionResource resource, |
| + int index) { |
| ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| // We fall back on the default extension icon on failure. |
| @@ -141,18 +131,15 @@ |
| Layout(); |
| } |
| -void ExtensionInfoBar::OnDelegateDeleted() { |
| - delegate_->extension_host()->view()->SetContainer(NULL); |
| - delegate_ = NULL; |
| -} |
| - |
| void ExtensionInfoBar::RunMenu(View* source, const gfx::Point& pt) { |
| + DCHECK(delegate()); |
| if (!options_menu_contents_.get()) { |
| Browser* browser = BrowserView::GetBrowserViewForNativeWindow( |
| platform_util::GetTopLevel(source->GetWidget()->GetNativeView()))-> |
| browser(); |
| options_menu_contents_ = new ExtensionContextMenuModel( |
| - delegate_->extension_host()->extension(), browser, NULL); |
| + delegate()->AsExtensionInfoBarDelegate()->extension_host()->extension(), |
| + browser, NULL); |
| } |
| options_menu_menu_.reset(new views::Menu2(options_menu_contents_.get())); |
| @@ -160,11 +147,13 @@ |
| } |
| void ExtensionInfoBar::SetupIconAndMenu() { |
| + DCHECK(delegate()); |
|
Finnur
2010/11/15 23:08:41
Same here, redundant.
|
| menu_ = new views::MenuButton(NULL, std::wstring(), this, false); |
| menu_->SetVisible(false); |
| AddChildView(menu_); |
| - const Extension* extension = delegate_->extension_host()->extension(); |
| + const Extension* extension = |
| + delegate()->AsExtensionInfoBarDelegate()->extension_host()->extension(); |
| ExtensionResource icon_resource = extension->GetIconResource( |
| Extension::EXTENSION_ICON_BITTY, ExtensionIconSet::MATCH_EXACTLY); |
| if (!icon_resource.relative_path().empty()) { |