Chromium Code Reviews| Index: chrome/browser/ui/panels/panel.cc |
| diff --git a/chrome/browser/ui/panels/panel.cc b/chrome/browser/ui/panels/panel.cc |
| index b2311362c55cf3a30a115618364754158e944910..c224ee164ee7877a0edaf97e31047cf569cafa9c 100644 |
| --- a/chrome/browser/ui/panels/panel.cc |
| +++ b/chrome/browser/ui/panels/panel.cc |
| @@ -8,13 +8,15 @@ |
| #include "chrome/browser/extensions/extension_prefs.h" |
| #include "chrome/browser/extensions/extension_service.h" |
| #include "chrome/browser/profiles/profile.h" |
| -#include "content/browser/renderer_host/render_view_host.h" |
| +#include "chrome/browser/tabs/tab_strip_model.h" |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/panels/native_panel.h" |
| #include "chrome/browser/ui/panels/panel_manager.h" |
| +#include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| #include "chrome/browser/ui/window_sizer.h" |
| #include "chrome/browser/web_applications/web_app.h" |
| #include "chrome/common/extensions/extension.h" |
| +#include "content/browser/renderer_host/render_view_host.h" |
| #include "content/browser/tab_contents/tab_contents.h" |
| #include "content/common/view_messages.h" |
| #include "content/public/browser/notification_service.h" |
| @@ -39,21 +41,22 @@ Panel::Panel(Browser* browser, const gfx::Rect& bounds) |
| expansion_state_(EXPANDED), |
| restored_height_(bounds.height()) { |
| native_panel_ = CreateNativePanel(browser, this, bounds); |
| - |
| - registrar_.Add(this, |
| - content::NOTIFICATION_TAB_ADDED, |
| - content::Source<TabContentsDelegate>(browser)); |
| + browser->tabstrip_model()->AddObserver(this); |
| } |
| Panel::~Panel() { |
| // Invoked by native panel so do not access native_panel_ here. |
|
jianli
2011/11/11 22:31:23
Could you please consider adding "destructor" afte
jennb
2011/11/11 22:42:50
Done.
|
| } |
| +void Panel::OnNativePanelClosed() { |
| + native_panel_->GetPanelBrowser()->tabstrip_model()->RemoveObserver(this); |
| + manager()->Remove(this); |
| +} |
| + |
| PanelManager* Panel::manager() const { |
| return PanelManager::GetInstance(); |
| } |
| - |
| const Extension* Panel::GetExtension() const { |
| return GetExtensionFromBrowser(browser()); |
| } |
| @@ -71,7 +74,7 @@ void Panel::SetMaxSize(const gfx::Size& max_size) { |
| max_size_ = max_size; |
| // Note: |render_view_host| might be NULL if the tab has not been created. |
| - // If so, we will do it when NOTIFICATION_TAB_ADDED is received. |
| + // If so, we will do it when TabInsertedAt() is invoked. |
| RenderViewHost* render_view_host = GetRenderViewHost(); |
| if (render_view_host) |
| RequestRenderViewHostToDisableScrollbars(render_view_host); |
| @@ -168,14 +171,6 @@ void Panel::SetBounds(const gfx::Rect& bounds) { |
| // close on the first attempt. |
| void Panel::Close() { |
| native_panel_->ClosePanel(); |
| - |
| -// TODO(dimich): Only implemented fully async on Mac. Need to update other |
| -// platforms. The panel should be removed from PanelManager when and if it |
| -// was actually closed. The closing can be cancelled because of onbeforeunload |
| -// handler on the web page. http://crbug.com/102720 |
| -#if !defined(OS_MACOSX) |
| - manager()->Remove(this); |
| -#endif |
| } |
| void Panel::Activate() { |
| @@ -543,35 +538,31 @@ void Panel::ShowAvatarBubbleFromAvatarButton() { |
| NOTREACHED(); |
| } |
| +void Panel::TabInsertedAt(TabContentsWrapper* contents, |
| + int index, |
|
jianli
2011/11/11 22:31:23
Spacing.
jennb
2011/11/11 22:42:50
Done.
|
| + bool foreground) { |
| + DCHECK_EQ(0, index); |
| + TabContents* tab_contents = contents->tab_contents(); |
| + EnableAutoResize(tab_contents->render_view_host()); |
| + |
| + // We also need to know when the render view host changes in order |
| + // to turn on preferred size changed notifications in the new |
| + // render view host. |
| + registrar_.RemoveAll(); |
|
jianli
2011/11/11 22:31:23
Why do we need to call RemoveAll first? Can TabIns
jennb
2011/11/11 22:42:50
When there's a new tab, I don't want notifications
|
| + registrar_.Add( |
| + this, |
| + content::NOTIFICATION_TAB_CONTENTS_SWAPPED, |
| + content::Source<TabContents>(tab_contents)); |
| +} |
| + |
| void Panel::Observe(int type, |
| const content::NotificationSource& source, |
| const content::NotificationDetails& details) { |
| - switch (type) { |
| - case content::NOTIFICATION_TAB_ADDED: |
| - // We also need to know when the render view host changes in order |
| - // to turn on preferred size changed notifications in the new |
| - // render view host. However, we cannot register for |
| - // NOTIFICATION_TAB_CONTENTS_SWAPPED until we actually have a |
| - // tab content so we register for it here. |
| - registrar_.Add( |
| - this, |
| - content::NOTIFICATION_TAB_CONTENTS_SWAPPED, |
| - content::Source<TabContents>(browser()->GetSelectedTabContents())); |
| - // Fall-thru to update render view host. |
| - |
| - case content::NOTIFICATION_TAB_CONTENTS_SWAPPED: { |
| - RenderViewHost* render_view_host = GetRenderViewHost(); |
| - if (render_view_host) { |
| - render_view_host->EnablePreferredSizeMode( |
| - kPreferredSizeWidth | kPreferredSizeHeightThisIsSlow); |
| - RequestRenderViewHostToDisableScrollbars(render_view_host); |
| - } |
| - break; |
| - } |
| - default: |
| - NOTREACHED() << "Got a notification we didn't register for!"; |
| - break; |
| - } |
| + DCHECK_EQ(type, content::NOTIFICATION_TAB_CONTENTS_SWAPPED); |
| + RenderViewHost* render_view_host = |
| + content::Source<TabContents>(source).ptr()->render_view_host(); |
| + if (render_view_host) |
| + EnableAutoResize(render_view_host); |
| } |
| RenderViewHost* Panel::GetRenderViewHost() const { |
| @@ -581,16 +572,24 @@ RenderViewHost* Panel::GetRenderViewHost() const { |
| return tab_contents->render_view_host(); |
| } |
| +void Panel::EnableAutoResize(RenderViewHost* render_view_host) { |
| + DCHECK(render_view_host); |
| + render_view_host->EnablePreferredSizeMode( |
| + kPreferredSizeWidth | kPreferredSizeHeightThisIsSlow); |
| + RequestRenderViewHostToDisableScrollbars(render_view_host); |
| +} |
| + |
| void Panel::RequestRenderViewHostToDisableScrollbars( |
| RenderViewHost* render_view_host) { |
| - if (render_view_host) { |
| - render_view_host->DisableScrollbarsForThreshold( |
| - native_panel_->ContentSizeFromWindowSize(max_size_)); |
| - } |
| + DCHECK(render_view_host); |
| + render_view_host->DisableScrollbarsForThreshold( |
| + native_panel_->ContentSizeFromWindowSize(max_size_)); |
| } |
| void Panel::OnWindowSizeAvailable() { |
| - RequestRenderViewHostToDisableScrollbars(GetRenderViewHost()); |
| + RenderViewHost* render_view_host = GetRenderViewHost(); |
| + if (render_view_host) |
| + RequestRenderViewHostToDisableScrollbars(render_view_host); |
| } |
| Browser* Panel::browser() const { |