| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/extensions/extension_process_manager.h" | 5 #include "chrome/browser/extensions/extension_process_manager.h" |
| 6 | 6 |
| 7 #include "chrome/browser/browsing_instance.h" | 7 #include "chrome/browser/browsing_instance.h" |
| 8 #include "chrome/browser/extensions/extension_host.h" | 8 #include "chrome/browser/extensions/extension_host.h" |
| 9 #include "chrome/browser/extensions/extensions_service.h" | 9 #include "chrome/browser/extensions/extensions_service.h" |
| 10 #include "chrome/browser/profile.h" | 10 #include "chrome/browser/profile.h" |
| 11 #include "chrome/browser/renderer_host/site_instance.h" | 11 #include "chrome/browser/renderer_host/site_instance.h" |
| 12 #include "chrome/browser/renderer_host/render_view_host.h" |
| 12 #include "chrome/common/extensions/extension.h" | 13 #include "chrome/common/extensions/extension.h" |
| 13 #include "chrome/common/notification_service.h" | 14 #include "chrome/common/notification_service.h" |
| 14 #include "chrome/common/notification_type.h" | 15 #include "chrome/common/notification_type.h" |
| 16 #include "chrome/common/render_messages.h" |
| 15 | 17 |
| 16 static void CreateBackgroundHosts( | 18 static void CreateBackgroundHosts( |
| 17 ExtensionProcessManager* manager, const ExtensionList* extensions) { | 19 ExtensionProcessManager* manager, const ExtensionList* extensions) { |
| 18 for (ExtensionList::const_iterator extension = extensions->begin(); | 20 for (ExtensionList::const_iterator extension = extensions->begin(); |
| 19 extension != extensions->end(); ++extension) { | 21 extension != extensions->end(); ++extension) { |
| 20 // Start the process for the master page, if it exists. | 22 // Start the process for the master page, if it exists. |
| 21 if ((*extension)->background_url().is_valid()) | 23 if ((*extension)->background_url().is_valid()) |
| 22 manager->CreateBackgroundHost(*extension, (*extension)->background_url()); | 24 manager->CreateBackgroundHost(*extension, (*extension)->background_url()); |
| 23 } | 25 } |
| 24 } | 26 } |
| 25 | 27 |
| 26 ExtensionProcessManager::ExtensionProcessManager(Profile* profile) | 28 ExtensionProcessManager::ExtensionProcessManager(Profile* profile) |
| 27 : browsing_instance_(new BrowsingInstance(profile)) { | 29 : browsing_instance_(new BrowsingInstance(profile)) { |
| 28 registrar_.Add(this, NotificationType::EXTENSIONS_READY, | 30 registrar_.Add(this, NotificationType::EXTENSIONS_READY, |
| 29 NotificationService::AllSources()); | 31 NotificationService::AllSources()); |
| 30 registrar_.Add(this, NotificationType::EXTENSIONS_LOADED, | 32 registrar_.Add(this, NotificationType::EXTENSIONS_LOADED, |
| 31 NotificationService::AllSources()); | 33 NotificationService::AllSources()); |
| 32 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, | 34 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, |
| 33 NotificationService::AllSources()); | 35 NotificationService::AllSources()); |
| 34 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, | 36 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, |
| 35 Source<Profile>(profile)); | 37 Source<Profile>(profile)); |
| 38 registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED, |
| 39 NotificationService::AllSources()); |
| 40 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED, |
| 41 NotificationService::AllSources()); |
| 36 } | 42 } |
| 37 | 43 |
| 38 ExtensionProcessManager::~ExtensionProcessManager() { | 44 ExtensionProcessManager::~ExtensionProcessManager() { |
| 39 // Copy all_hosts_ to avoid iterator invalidation issues. | 45 // Copy all_hosts_ to avoid iterator invalidation issues. |
| 40 ExtensionHostSet to_delete(background_hosts_.begin(), | 46 ExtensionHostSet to_delete(background_hosts_.begin(), |
| 41 background_hosts_.end()); | 47 background_hosts_.end()); |
| 42 ExtensionHostSet::iterator iter; | 48 ExtensionHostSet::iterator iter; |
| 43 for (iter = to_delete.begin(); iter != to_delete.end(); ++iter) | 49 for (iter = to_delete.begin(); iter != to_delete.end(); ++iter) |
| 44 delete *iter; | 50 delete *iter; |
| 45 } | 51 } |
| (...skipping 25 matching lines...) Expand all Loading... |
| 71 | 77 |
| 72 ExtensionHost* ExtensionProcessManager::CreateBackgroundHost( | 78 ExtensionHost* ExtensionProcessManager::CreateBackgroundHost( |
| 73 Extension* extension, const GURL& url) { | 79 Extension* extension, const GURL& url) { |
| 74 ExtensionHost* host = | 80 ExtensionHost* host = |
| 75 new ExtensionHost(extension, GetSiteInstanceForURL(url), url); | 81 new ExtensionHost(extension, GetSiteInstanceForURL(url), url); |
| 76 host->CreateRenderView(NULL); // create a RenderViewHost with no view | 82 host->CreateRenderView(NULL); // create a RenderViewHost with no view |
| 77 OnExtensionHostCreated(host, true); | 83 OnExtensionHostCreated(host, true); |
| 78 return host; | 84 return host; |
| 79 } | 85 } |
| 80 | 86 |
| 87 void ExtensionProcessManager::RegisterExtensionProcess( |
| 88 std::string extension_id, int process_id) { |
| 89 ProcessIDMap::const_iterator it = process_ids_.find(extension_id); |
| 90 if (it != process_ids_.end() && (*it).second == process_id) |
| 91 return; |
| 92 |
| 93 process_ids_[extension_id] = process_id; |
| 94 |
| 95 ExtensionsService* extension_service = |
| 96 browsing_instance_->profile()->GetExtensionsService(); |
| 97 |
| 98 std::vector<std::string> page_action_ids; |
| 99 Extension* extension = extension_service->GetExtensionById(extension_id); |
| 100 for (PageActionMap::const_iterator i = extension->page_actions().begin(); |
| 101 i != extension->page_actions().end(); ++i) { |
| 102 page_action_ids.push_back(i->first); |
| 103 } |
| 104 |
| 105 RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
| 106 rph->Send(new ViewMsg_Extension_UpdatePageActions(extension_id, |
| 107 page_action_ids)); |
| 108 } |
| 109 |
| 110 void ExtensionProcessManager::UnregisterExtensionProcess(int process_id) { |
| 111 ProcessIDMap::iterator it = process_ids_.begin(); |
| 112 while (it != process_ids_.end()) { |
| 113 if (it->second == process_id) |
| 114 it = process_ids_.erase(it); |
| 115 else |
| 116 ++it; |
| 117 } |
| 118 } |
| 119 |
| 81 SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { | 120 SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { |
| 82 return browsing_instance_->GetSiteInstanceForURL(url); | 121 return browsing_instance_->GetSiteInstanceForURL(url); |
| 83 } | 122 } |
| 84 | 123 |
| 85 void ExtensionProcessManager::Observe(NotificationType type, | 124 void ExtensionProcessManager::Observe(NotificationType type, |
| 86 const NotificationSource& source, | 125 const NotificationSource& source, |
| 87 const NotificationDetails& details) { | 126 const NotificationDetails& details) { |
| 88 switch (type.value) { | 127 switch (type.value) { |
| 89 case NotificationType::EXTENSIONS_READY: | 128 case NotificationType::EXTENSIONS_READY: |
| 90 CreateBackgroundHosts(this, | 129 CreateBackgroundHosts(this, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 115 break; | 154 break; |
| 116 } | 155 } |
| 117 | 156 |
| 118 case NotificationType::EXTENSION_HOST_DESTROYED: { | 157 case NotificationType::EXTENSION_HOST_DESTROYED: { |
| 119 ExtensionHost* host = Details<ExtensionHost>(details).ptr(); | 158 ExtensionHost* host = Details<ExtensionHost>(details).ptr(); |
| 120 all_hosts_.erase(host); | 159 all_hosts_.erase(host); |
| 121 background_hosts_.erase(host); | 160 background_hosts_.erase(host); |
| 122 break; | 161 break; |
| 123 } | 162 } |
| 124 | 163 |
| 164 case NotificationType::RENDERER_PROCESS_TERMINATED: |
| 165 case NotificationType::RENDERER_PROCESS_CLOSED: { |
| 166 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); |
| 167 UnregisterExtensionProcess(host->pid()); |
| 168 break; |
| 169 } |
| 170 |
| 125 default: | 171 default: |
| 126 NOTREACHED(); | 172 NOTREACHED(); |
| 127 } | 173 } |
| 128 } | 174 } |
| 129 | 175 |
| 130 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, | 176 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, |
| 131 bool is_background) { | 177 bool is_background) { |
| 132 all_hosts_.insert(host); | 178 all_hosts_.insert(host); |
| 133 if (is_background) | 179 if (is_background) |
| 134 background_hosts_.insert(host); | 180 background_hosts_.insert(host); |
| 135 NotificationService::current()->Notify( | 181 NotificationService::current()->Notify( |
| 136 NotificationType::EXTENSION_HOST_CREATED, | 182 NotificationType::EXTENSION_HOST_CREATED, |
| 137 Source<ExtensionProcessManager>(this), | 183 Source<ExtensionProcessManager>(this), |
| 138 Details<ExtensionHost>(host)); | 184 Details<ExtensionHost>(host)); |
| 139 } | 185 } |
| OLD | NEW |