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

Side by Side Diff: chrome/browser/extensions/extension_process_manager.cc

Issue 155514: Implement extension specific events (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698