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 |