| Index: chrome/browser/extensions/extension_process_manager.cc
|
| ===================================================================
|
| --- chrome/browser/extensions/extension_process_manager.cc (revision 20629)
|
| +++ chrome/browser/extensions/extension_process_manager.cc (working copy)
|
| @@ -9,9 +9,11 @@
|
| #include "chrome/browser/extensions/extensions_service.h"
|
| #include "chrome/browser/profile.h"
|
| #include "chrome/browser/renderer_host/site_instance.h"
|
| +#include "chrome/browser/renderer_host/render_view_host.h"
|
| #include "chrome/common/extensions/extension.h"
|
| #include "chrome/common/notification_service.h"
|
| #include "chrome/common/notification_type.h"
|
| +#include "chrome/common/render_messages.h"
|
|
|
| static void CreateBackgroundHosts(
|
| ExtensionProcessManager* manager, const ExtensionList* extensions) {
|
| @@ -33,6 +35,10 @@
|
| NotificationService::AllSources());
|
| registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED,
|
| Source<Profile>(profile));
|
| + registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED,
|
| + NotificationService::AllSources());
|
| + registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED,
|
| + NotificationService::AllSources());
|
| }
|
|
|
| ExtensionProcessManager::~ExtensionProcessManager() {
|
| @@ -78,6 +84,39 @@
|
| return host;
|
| }
|
|
|
| +void ExtensionProcessManager::RegisterExtensionProcess(
|
| + std::string extension_id, int process_id) {
|
| + ProcessIDMap::const_iterator it = process_ids_.find(extension_id);
|
| + if (it != process_ids_.end() && (*it).second == process_id)
|
| + return;
|
| +
|
| + process_ids_[extension_id] = process_id;
|
| +
|
| + ExtensionsService* extension_service =
|
| + browsing_instance_->profile()->GetExtensionsService();
|
| +
|
| + std::vector<std::string> page_action_ids;
|
| + Extension* extension = extension_service->GetExtensionById(extension_id);
|
| + for (PageActionMap::const_iterator i = extension->page_actions().begin();
|
| + i != extension->page_actions().end(); ++i) {
|
| + page_action_ids.push_back(i->first);
|
| + }
|
| +
|
| + RenderProcessHost* rph = RenderProcessHost::FromID(process_id);
|
| + rph->Send(new ViewMsg_Extension_UpdatePageActions(extension_id,
|
| + page_action_ids));
|
| +}
|
| +
|
| +void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) {
|
| + ProcessIDMap::iterator it = process_ids_.begin();
|
| + while (it != process_ids_.end()) {
|
| + if (it->second == process_id)
|
| + it = process_ids_.erase(it);
|
| + else
|
| + ++it;
|
| + }
|
| +}
|
| +
|
| SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) {
|
| return browsing_instance_->GetSiteInstanceForURL(url);
|
| }
|
| @@ -122,6 +161,13 @@
|
| break;
|
| }
|
|
|
| + case NotificationType::RENDERER_PROCESS_TERMINATED:
|
| + case NotificationType::RENDERER_PROCESS_CLOSED: {
|
| + RenderProcessHost* host = Source<RenderProcessHost>(source).ptr();
|
| + UnregisterExtensionProcess(host->pid());
|
| + break;
|
| + }
|
| +
|
| default:
|
| NOTREACHED();
|
| }
|
|
|