Chromium Code Reviews| Index: chrome/browser/extensions/extension_process_manager.cc |
| diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc |
| index f249cf4985e073a1d6ea880d38e74952dceec7ff..561a93c938432feac1821a8156d80cdf9b0479cb 100644 |
| --- a/chrome/browser/extensions/extension_process_manager.cc |
| +++ b/chrome/browser/extensions/extension_process_manager.cc |
| @@ -123,6 +123,8 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile) |
| content::Source<Profile>(profile)); |
| registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
| content::Source<Profile>(profile)); |
| + registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
| + content::NotificationService::AllSources()); |
| registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, |
| content::NotificationService::AllSources()); |
| } |
| @@ -263,7 +265,6 @@ ExtensionHost* ExtensionProcessManager::GetBackgroundHostForExtension( |
| return host; |
| } |
| return NULL; |
| - |
| } |
| std::set<RenderViewHost*> |
| @@ -277,10 +278,10 @@ std::set<RenderViewHost*> |
| return result; |
| // Gather up all the views for that site. |
| - for (RenderViewHostSet::iterator view = all_extension_views_.begin(); |
| + for (ExtensionRenderViews::iterator view = all_extension_views_.begin(); |
| view != all_extension_views_.end(); ++view) { |
| - if ((*view)->site_instance() == site_instance) |
| - result.insert(*view); |
| + if (view->first->site_instance() == site_instance) |
| + result.insert(view->first); |
| } |
| return result; |
| @@ -289,16 +290,53 @@ std::set<RenderViewHost*> |
| void ExtensionProcessManager::RegisterRenderViewHost( |
| RenderViewHost* render_view_host, |
| const Extension* extension) { |
| - all_extension_views_.insert(render_view_host); |
| + all_extension_views_[render_view_host] = content::VIEW_TYPE_INVALID; |
| } |
| void ExtensionProcessManager::UnregisterRenderViewHost( |
| RenderViewHost* render_view_host) { |
| - all_extension_views_.erase(render_view_host); |
| + ExtensionRenderViews::iterator view = |
| + all_extension_views_.find(render_view_host); |
| + if (view == all_extension_views_.end()) |
| + return; |
| + |
| + content::ViewType view_type = view->second; |
| + all_extension_views_.erase(view); |
| + |
| + // Keepalive count, balanced in UpdateRegisteredRenderView. |
| + if (view_type != content::VIEW_TYPE_INVALID && |
| + view_type != chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| + const Extension* extension = |
| + GetProfile()->GetExtensionService()->extensions()->GetByID( |
| + render_view_host->site_instance()->GetSite().host()); |
|
Yoyo Zhou
2012/03/02 03:10:46
Maybe a TODO: it seems like this could be a helper
Matt Perry
2012/03/02 20:25:21
Added a local helper.
|
| + if (extension) |
| + DecrementLazyKeepaliveCount(extension); |
| + } |
| } |
| -SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL( |
| - const GURL& url) { |
| +void ExtensionProcessManager::UpdateRegisteredRenderView( |
| + RenderViewHost* render_view_host) { |
| + ExtensionRenderViews::iterator view = |
| + all_extension_views_.find(render_view_host); |
| + if (view == all_extension_views_.end()) |
| + return; |
| + |
| + view->second = render_view_host->delegate()->GetRenderViewType(); |
| + |
| + // Keep the lazy background page alive as long as any non-background-page |
| + // extension views are visible. Keepalive count balanced in |
| + // UnregisterRenderViewHost. |
| + if (view->second != content::VIEW_TYPE_INVALID && |
| + view->second != chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| + const Extension* extension = |
| + GetProfile()->GetExtensionService()->extensions()->GetByID( |
| + render_view_host->site_instance()->GetSite().host()); |
| + if (extension) |
| + IncrementLazyKeepaliveCount(extension); |
| + } |
| +} |
| + |
| +SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { |
| return site_instance_->GetRelatedSiteInstance(url); |
| } |
| @@ -318,7 +356,6 @@ int ExtensionProcessManager::IncrementLazyKeepaliveCount( |
| if (extension->background_page_persists()) |
| return 0; |
| - // TODO(mpcomplete): Handle visible views changing. |
| int& count = ::GetLazyKeepaliveCount(GetProfile(), extension); |
| if (++count == 1) |
| OnLazyBackgroundPageActive(extension->id()); |
| @@ -342,7 +379,7 @@ int ExtensionProcessManager::DecrementLazyKeepaliveCount( |
| void ExtensionProcessManager::OnLazyBackgroundPageIdle( |
| const std::string& extension_id) { |
| ExtensionHost* host = GetBackgroundHostForExtension(extension_id); |
| - if (host && !HasVisibleViews(extension_id)) |
| + if (host) |
| host->SendShouldClose(); |
| } |
| @@ -360,19 +397,20 @@ void ExtensionProcessManager::OnShouldCloseAck( |
| host->OnShouldCloseAck(sequence_id); |
| } |
| -bool ExtensionProcessManager::HasVisibleViews(const std::string& extension_id) { |
| - const std::set<RenderViewHost*>& views = |
| - GetRenderViewHostsForExtension(extension_id); |
| - for (std::set<RenderViewHost*>::const_iterator it = views.begin(); |
| - it != views.end(); ++it) { |
| - const RenderViewHost* host = *it; |
| - if (host->site_instance()->GetSite().host() == extension_id && |
| - host->delegate()->GetRenderViewType() != |
| - chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
| - return true; |
| - } |
| - } |
| - return false; |
| +void ExtensionProcessManager::OnNetworkRequestStarted( |
| + RenderViewHost* render_view_host) { |
| + ExtensionHost* host = GetBackgroundHostForExtension( |
| + render_view_host->site_instance()->GetSite().host()); |
| + if (host) |
| + IncrementLazyKeepaliveCount(host->extension()); |
| +} |
| + |
| +void ExtensionProcessManager::OnNetworkRequestDone( |
| + RenderViewHost* render_view_host) { |
| + ExtensionHost* host = GetBackgroundHostForExtension( |
| + render_view_host->site_instance()->GetSite().host()); |
| + if (host) |
| + DecrementLazyKeepaliveCount(host->extension()); |
| } |
| void ExtensionProcessManager::Observe( |
| @@ -428,6 +466,13 @@ void ExtensionProcessManager::Observe( |
| break; |
| } |
| + case content::NOTIFICATION_WEB_CONTENTS_CONNECTED: { |
|
Yoyo Zhou
2012/03/02 03:10:46
Naively, it seems like this should be balanced wit
Matt Perry
2012/03/02 20:25:21
No need - UnregisterRenderViewHost cleans up our R
|
| + content::WebContents* contents = |
| + content::Source<content::WebContents>(source).ptr(); |
| + UpdateRegisteredRenderView(contents->GetRenderViewHost()); |
| + break; |
| + } |
| + |
| case content::NOTIFICATION_APP_TERMINATING: { |
| // Close background hosts when the last browser is closed so that they |
| // have time to shutdown various objects on different threads. Our |