Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3991)

Unified Diff: chrome/browser/extensions/extension_process_manager.cc

Issue 7328029: Use process-per-app-instance for hosted apps without background permission. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix incognito function. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 65e55ff4b962286a8382503ed5beb5533cbd49ac..1944478e0e7205f3ad66660dc8d3f6aada6bd304 100644
--- a/chrome/browser/extensions/extension_process_manager.cc
+++ b/chrome/browser/extensions/extension_process_manager.cc
@@ -37,6 +37,7 @@ class IncognitoExtensionProcessManager : public ExtensionProcessManager {
const GURL& url);
virtual SiteInstance* GetSiteInstanceForURL(const GURL& url);
virtual RenderProcessHost* GetExtensionProcess(const GURL& url);
+ virtual const Extension* GetExtensionForSiteInstance(int site_instance_id);
private:
// NotificationObserver:
@@ -95,9 +96,7 @@ ExtensionProcessManager::ExtensionProcessManager(Profile* profile)
Source<Profile>(original_profile));
registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED,
Source<Profile>(profile));
- registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
- NotificationService::AllSources());
- registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
+ registrar_.Add(this, content::NOTIFICATION_SITE_INSTANCE_DELETED,
NotificationService::AllSources());
registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING,
NotificationService::AllSources());
@@ -221,28 +220,23 @@ ExtensionHost* ExtensionProcessManager::GetBackgroundHostForExtension(
return NULL;
}
-void ExtensionProcessManager::RegisterExtensionProcess(
- const std::string& extension_id, int process_id) {
- // TODO(mpcomplete): This is the only place we actually read process_ids_.
- // Is it necessary?
- ProcessIDMap::const_iterator it = process_ids_.find(extension_id);
- if (it != process_ids_.end() && (*it).second == process_id)
+void ExtensionProcessManager::RegisterExtensionSiteInstance(
+ int site_instance_id, const std::string& extension_id) {
+ SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id);
+ if (it != extension_ids_.end() && (*it).second == extension_id)
return;
- // Extension ids should get removed from the map before the process ids get
- // reused from a dead renderer.
- DCHECK(it == process_ids_.end());
- process_ids_[extension_id] = process_id;
+ // SiteInstance ids should get removed from the map before the extension ids
+ // get used for a new SiteInstance.
+ DCHECK(it == extension_ids_.end());
+ extension_ids_[site_instance_id] = extension_id;
}
-void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) {
- ProcessIDMap::iterator it = process_ids_.begin();
- while (it != process_ids_.end()) {
- if (it->second == process_id)
- process_ids_.erase(it++);
- else
- ++it;
- }
+void ExtensionProcessManager::UnregisterExtensionSiteInstance(
+ int site_instance_id) {
+ SiteInstanceIDMap::iterator it = extension_ids_.find(site_instance_id);
+ if (it != extension_ids_.end())
+ extension_ids_.erase(it++);
}
RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
@@ -262,6 +256,20 @@ RenderProcessHost* ExtensionProcessManager::GetExtensionProcess(
Extension::GetBaseURLFromExtensionId(extension_id));
}
+const Extension* ExtensionProcessManager::GetExtensionForSiteInstance(
+ int site_instance_id) {
+ SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id);
+ if (it != extension_ids_.end()) {
+ // Look up the extension by ID, including disabled extensions in case
+ // this gets called while an old process is still around.
+ ExtensionService* service =
+ browsing_instance_->profile()->GetExtensionService();
+ return service->GetExtensionById(it->second, false);
+ }
+
+ return NULL;
+}
+
SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) {
return browsing_instance_->GetSiteInstanceForURL(url);
}
@@ -313,10 +321,9 @@ void ExtensionProcessManager::Observe(int type,
break;
}
- case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED:
- case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: {
- RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
- UnregisterExtensionProcess(host->id());
+ case content::NOTIFICATION_SITE_INSTANCE_DELETED: {
+ SiteInstance* site_instance = Source<SiteInstance>(source).ptr();
+ UnregisterExtensionSiteInstance(site_instance->id());
break;
}
@@ -422,6 +429,17 @@ RenderProcessHost* IncognitoExtensionProcessManager::GetExtensionProcess(
}
}
+const Extension* IncognitoExtensionProcessManager::GetExtensionForSiteInstance(
+ int site_instance_id) {
+ const Extension* extension =
+ ExtensionProcessManager::GetExtensionForSiteInstance(site_instance_id);
+ if (extension && extension->incognito_split_mode()) {
+ return extension;
+ } else {
+ return original_manager_->GetExtensionForSiteInstance(site_instance_id);
+ }
+}
+
const Extension* IncognitoExtensionProcessManager::GetExtensionOrAppByURL(
const GURL& url) {
ExtensionService* service =
« no previous file with comments | « chrome/browser/extensions/extension_process_manager.h ('k') | chrome/browser/extensions/extension_service.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698