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 30fcb4d3dcffbdcce9788182e75f4b5cc7055858..8e80d1c7a0bcfd02147f3b70514bcdbd0ad77fa3 100644 |
--- a/chrome/browser/extensions/extension_process_manager.cc |
+++ b/chrome/browser/extensions/extension_process_manager.cc |
@@ -10,6 +10,7 @@ |
#include "chrome/browser/extensions/extension_host.h" |
#include "chrome/browser/extensions/extension_info_map.h" |
#include "chrome/browser/extensions/extension_service.h" |
+#include "chrome/browser/extensions/extension_system.h" |
#include "chrome/browser/profiles/profile.h" |
#include "chrome/browser/ui/browser.h" |
#include "chrome/browser/ui/browser_window.h" |
@@ -37,6 +38,7 @@ using content::OpenURLParams; |
using content::Referrer; |
using content::RenderViewHost; |
using content::SiteInstance; |
+using content::WebContents; |
namespace { |
@@ -307,56 +309,66 @@ std::set<RenderViewHost*> |
return result; |
// Gather up all the views for that site. |
- for (ExtensionRenderViews::iterator view = all_extension_views_.begin(); |
- view != all_extension_views_.end(); ++view) { |
- if (view->first->GetSiteInstance() == site_instance) |
- result.insert(view->first); |
+ for (ExtensionWebContents::iterator contents = |
+ all_extension_contents_.begin(); |
+ contents != all_extension_contents_.end(); ++contents) { |
+ if (contents->first->GetSiteInstance() == site_instance) |
+ result.insert(contents->first->GetRenderViewHost()); |
} |
return result; |
} |
-void ExtensionProcessManager::RegisterRenderViewHost( |
- RenderViewHost* render_view_host, |
+const Extension* ExtensionProcessManager::GetExtensionForRenderViewHost( |
+ content::RenderViewHost* render_view_host) { |
+ ExtensionService* service = |
+ ExtensionSystem::Get(GetProfile())->extension_service(); |
+ return service->extensions()->GetByID( |
+ render_view_host->GetSiteInstance()->GetSite().host()); |
+} |
+ |
+void ExtensionProcessManager::RegisterWebContents( |
+ WebContents* web_contents, |
const Extension* extension) { |
- all_extension_views_[render_view_host] = content::VIEW_TYPE_INVALID; |
+ all_extension_contents_[web_contents] = content::VIEW_TYPE_INVALID; |
} |
-void ExtensionProcessManager::UnregisterRenderViewHost( |
- RenderViewHost* render_view_host) { |
- ExtensionRenderViews::iterator view = |
- all_extension_views_.find(render_view_host); |
- if (view == all_extension_views_.end()) |
+void ExtensionProcessManager::UnregisterWebContents( |
+ WebContents* web_contents) { |
+ ExtensionWebContents::iterator contents = |
+ all_extension_contents_.find(web_contents); |
+ if (contents == all_extension_contents_.end()) |
return; |
- content::ViewType view_type = view->second; |
- all_extension_views_.erase(view); |
+ content::ViewType view_type = contents->second; |
+ all_extension_contents_.erase(contents); |
// 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( |
- GetExtensionID(render_view_host)); |
+ GetExtensionID(contents->first->GetRenderViewHost())); |
if (extension) |
DecrementLazyKeepaliveCount(extension); |
} |
} |
-void ExtensionProcessManager::UpdateRegisteredRenderView( |
- RenderViewHost* render_view_host) { |
- ExtensionRenderViews::iterator view = |
- all_extension_views_.find(render_view_host); |
- if (view == all_extension_views_.end()) |
+void ExtensionProcessManager::UpdateRegisteredWebContents( |
+ WebContents* web_contents) { |
+ ExtensionWebContents::iterator contents = |
+ all_extension_contents_.find(web_contents); |
+ if (contents == all_extension_contents_.end()) |
return; |
- view->second = render_view_host->GetDelegate()->GetRenderViewType(); |
+ RenderViewHost* render_view_host = contents->first->GetRenderViewHost(); |
+ contents->second = render_view_host->GetDelegate()->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) { |
+ if (contents->second != content::VIEW_TYPE_INVALID && |
+ contents->second != chrome::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { |
const Extension* extension = |
GetProfile()->GetExtensionService()->extensions()->GetByID( |
GetExtensionID(render_view_host)); |
@@ -369,10 +381,6 @@ SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { |
return site_instance_->GetRelatedSiteInstance(url); |
} |
-bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const { |
- return all_hosts_.find(host) != all_hosts_.end(); |
-} |
- |
int ExtensionProcessManager::GetLazyKeepaliveCount(const Extension* extension) { |
if (!extension->has_lazy_background_page()) |
return 0; |
@@ -510,9 +518,9 @@ void ExtensionProcessManager::Observe( |
case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { |
ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); |
- all_hosts_.erase(host); |
if (background_hosts_.erase(host)) |
background_page_data_.erase(host->extension()->id()); |
+ platform_app_hosts_.erase(host); |
break; |
} |
@@ -528,7 +536,7 @@ void ExtensionProcessManager::Observe( |
case content::NOTIFICATION_WEB_CONTENTS_CONNECTED: { |
content::WebContents* contents = |
content::Source<content::WebContents>(source).ptr(); |
- UpdateRegisteredRenderView(contents->GetRenderViewHost()); |
+ UpdateRegisteredWebContents(contents); |
break; |
} |
@@ -583,10 +591,10 @@ Profile* ExtensionProcessManager::GetProfile() const { |
void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, |
bool is_background) { |
DCHECK_EQ(site_instance_->GetBrowserContext(), host->profile()); |
- |
- all_hosts_.insert(host); |
if (is_background) |
background_hosts_.insert(host); |
+ if (host->extension()->is_platform_app()) |
+ platform_app_hosts_.insert(host); |
} |
void ExtensionProcessManager::CloseBackgroundHost(ExtensionHost* host) { |
@@ -620,6 +628,17 @@ IncognitoExtensionProcessManager::IncognitoExtensionProcessManager( |
content::NotificationService::AllSources()); |
} |
+const ExtensionProcessManager::ContentsSet |
+ExtensionProcessManager::GetAllContents() const { |
+ ContentsSet result; |
+ for (ExtensionWebContents::const_iterator iter = |
+ all_extension_contents_.begin(); |
+ iter != all_extension_contents_.end(); ++iter) { |
+ result.insert(iter->first); |
+ } |
+ return result; |
+} |
+ |
ExtensionHost* IncognitoExtensionProcessManager::CreateViewHost( |
const Extension* extension, |
const GURL& url, |