| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/browser_window.h" | 7 #include "chrome/browser/browser_window.h" |
| 8 #include "chrome/browser/browsing_instance.h" | 8 #include "chrome/browser/browsing_instance.h" |
| 9 #if defined(OS_MACOSX) | 9 #if defined(OS_MACOSX) |
| 10 #include "chrome/browser/extensions/extension_host_mac.h" | 10 #include "chrome/browser/extensions/extension_host_mac.h" |
| 11 #endif | 11 #endif |
| 12 #include "chrome/browser/extensions/extension_host.h" | 12 #include "chrome/browser/extensions/extension_host.h" |
| 13 #include "chrome/browser/extensions/extensions_service.h" | 13 #include "chrome/browser/extensions/extension_service.h" |
| 14 #include "chrome/browser/profiles/profile.h" | 14 #include "chrome/browser/profiles/profile.h" |
| 15 #include "chrome/browser/renderer_host/site_instance.h" | 15 #include "chrome/browser/renderer_host/site_instance.h" |
| 16 #include "chrome/browser/renderer_host/render_view_host.h" | 16 #include "chrome/browser/renderer_host/render_view_host.h" |
| 17 #include "chrome/browser/tab_contents/tab_contents.h" | 17 #include "chrome/browser/tab_contents/tab_contents.h" |
| 18 #include "chrome/browser/ui/browser.h" | 18 #include "chrome/browser/ui/browser.h" |
| 19 #include "chrome/common/extensions/extension.h" | 19 #include "chrome/common/extensions/extension.h" |
| 20 #include "chrome/common/extensions/extension_action.h" | 20 #include "chrome/common/extensions/extension_action.h" |
| 21 #include "chrome/common/notification_service.h" | 21 #include "chrome/common/notification_service.h" |
| 22 #include "chrome/common/notification_type.h" | 22 #include "chrome/common/notification_type.h" |
| 23 #include "chrome/common/render_messages.h" | 23 #include "chrome/common/render_messages.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 host->CreateView(browser); | 128 host->CreateView(browser); |
| 129 OnExtensionHostCreated(host, false); | 129 OnExtensionHostCreated(host, false); |
| 130 return host; | 130 return host; |
| 131 } | 131 } |
| 132 | 132 |
| 133 ExtensionHost* ExtensionProcessManager::CreateView(const GURL& url, | 133 ExtensionHost* ExtensionProcessManager::CreateView(const GURL& url, |
| 134 Browser* browser, | 134 Browser* browser, |
| 135 ViewType::Type view_type) { | 135 ViewType::Type view_type) { |
| 136 // A NULL browser may only be given for pop-up views. | 136 // A NULL browser may only be given for pop-up views. |
| 137 DCHECK(browser || (!browser && view_type == ViewType::EXTENSION_POPUP)); | 137 DCHECK(browser || (!browser && view_type == ViewType::EXTENSION_POPUP)); |
| 138 ExtensionsService* service = | 138 ExtensionService* service = |
| 139 browsing_instance_->profile()->GetExtensionsService(); | 139 browsing_instance_->profile()->GetExtensionService(); |
| 140 if (service) { | 140 if (service) { |
| 141 const Extension* extension = service->GetExtensionByURL(url); | 141 const Extension* extension = service->GetExtensionByURL(url); |
| 142 if (extension) | 142 if (extension) |
| 143 return CreateView(extension, url, browser, view_type); | 143 return CreateView(extension, url, browser, view_type); |
| 144 } | 144 } |
| 145 return NULL; | 145 return NULL; |
| 146 } | 146 } |
| 147 | 147 |
| 148 ExtensionHost* ExtensionProcessManager::CreatePopup(const Extension* extension, | 148 ExtensionHost* ExtensionProcessManager::CreatePopup(const Extension* extension, |
| 149 const GURL& url, | 149 const GURL& url, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 // Is it necessary? | 219 // Is it necessary? |
| 220 ProcessIDMap::const_iterator it = process_ids_.find(extension_id); | 220 ProcessIDMap::const_iterator it = process_ids_.find(extension_id); |
| 221 if (it != process_ids_.end() && (*it).second == process_id) | 221 if (it != process_ids_.end() && (*it).second == process_id) |
| 222 return; | 222 return; |
| 223 | 223 |
| 224 // Extension ids should get removed from the map before the process ids get | 224 // Extension ids should get removed from the map before the process ids get |
| 225 // reused from a dead renderer. | 225 // reused from a dead renderer. |
| 226 DCHECK(it == process_ids_.end()); | 226 DCHECK(it == process_ids_.end()); |
| 227 process_ids_[extension_id] = process_id; | 227 process_ids_[extension_id] = process_id; |
| 228 | 228 |
| 229 ExtensionsService* extension_service = | 229 ExtensionService* extension_service = |
| 230 browsing_instance_->profile()->GetExtensionsService(); | 230 browsing_instance_->profile()->GetExtensionService(); |
| 231 | 231 |
| 232 std::vector<std::string> page_action_ids; | 232 std::vector<std::string> page_action_ids; |
| 233 const Extension* extension = | 233 const Extension* extension = |
| 234 extension_service->GetExtensionById(extension_id, false); | 234 extension_service->GetExtensionById(extension_id, false); |
| 235 if (extension->page_action()) | 235 if (extension->page_action()) |
| 236 page_action_ids.push_back(extension->page_action()->id()); | 236 page_action_ids.push_back(extension->page_action()->id()); |
| 237 | 237 |
| 238 RenderProcessHost* rph = RenderProcessHost::FromID(process_id); | 238 RenderProcessHost* rph = RenderProcessHost::FromID(process_id); |
| 239 rph->Send(new ViewMsg_Extension_UpdatePageActions(extension_id, | 239 rph->Send(new ViewMsg_Extension_UpdatePageActions(extension_id, |
| 240 page_action_ids)); | 240 page_action_ids)); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const { | 274 bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const { |
| 275 return all_hosts_.find(host) != all_hosts_.end(); | 275 return all_hosts_.find(host) != all_hosts_.end(); |
| 276 } | 276 } |
| 277 | 277 |
| 278 void ExtensionProcessManager::Observe(NotificationType type, | 278 void ExtensionProcessManager::Observe(NotificationType type, |
| 279 const NotificationSource& source, | 279 const NotificationSource& source, |
| 280 const NotificationDetails& details) { | 280 const NotificationDetails& details) { |
| 281 switch (type.value) { | 281 switch (type.value) { |
| 282 case NotificationType::EXTENSIONS_READY: { | 282 case NotificationType::EXTENSIONS_READY: { |
| 283 CreateBackgroundHosts(this, | 283 CreateBackgroundHosts(this, |
| 284 Source<Profile>(source).ptr()->GetExtensionsService()->extensions()); | 284 Source<Profile>(source).ptr()->GetExtensionService()->extensions()); |
| 285 break; | 285 break; |
| 286 } | 286 } |
| 287 | 287 |
| 288 case NotificationType::EXTENSION_LOADED: { | 288 case NotificationType::EXTENSION_LOADED: { |
| 289 ExtensionsService* service = | 289 ExtensionService* service = |
| 290 Source<Profile>(source).ptr()->GetExtensionsService(); | 290 Source<Profile>(source).ptr()->GetExtensionService(); |
| 291 if (service->is_ready()) { | 291 if (service->is_ready()) { |
| 292 const Extension* extension = Details<const Extension>(details).ptr(); | 292 const Extension* extension = Details<const Extension>(details).ptr(); |
| 293 ::CreateBackgroundHost(this, extension); | 293 ::CreateBackgroundHost(this, extension); |
| 294 } | 294 } |
| 295 break; | 295 break; |
| 296 } | 296 } |
| 297 | 297 |
| 298 case NotificationType::EXTENSION_UNLOADED: { | 298 case NotificationType::EXTENSION_UNLOADED: { |
| 299 const Extension* extension = Details<const Extension>(details).ptr(); | 299 const Extension* extension = Details<const Extension>(details).ptr(); |
| 300 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); | 300 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 const Extension* extension = GetExtensionOrAppByURL(url); | 420 const Extension* extension = GetExtensionOrAppByURL(url); |
| 421 if (!extension || extension->incognito_split_mode()) { | 421 if (!extension || extension->incognito_split_mode()) { |
| 422 return ExtensionProcessManager::GetExtensionProcess(url); | 422 return ExtensionProcessManager::GetExtensionProcess(url); |
| 423 } else { | 423 } else { |
| 424 return original_manager_->GetExtensionProcess(url); | 424 return original_manager_->GetExtensionProcess(url); |
| 425 } | 425 } |
| 426 } | 426 } |
| 427 | 427 |
| 428 const Extension* IncognitoExtensionProcessManager::GetExtensionOrAppByURL( | 428 const Extension* IncognitoExtensionProcessManager::GetExtensionOrAppByURL( |
| 429 const GURL& url) { | 429 const GURL& url) { |
| 430 ExtensionsService* service = | 430 ExtensionService* service = |
| 431 browsing_instance_->profile()->GetExtensionsService(); | 431 browsing_instance_->profile()->GetExtensionService(); |
| 432 if (!service) | 432 if (!service) |
| 433 return NULL; | 433 return NULL; |
| 434 return (url.SchemeIs(chrome::kExtensionScheme)) ? | 434 return (url.SchemeIs(chrome::kExtensionScheme)) ? |
| 435 service->GetExtensionByURL(url) : service->GetExtensionByWebExtent(url); | 435 service->GetExtensionByURL(url) : service->GetExtensionByWebExtent(url); |
| 436 } | 436 } |
| 437 | 437 |
| 438 bool IncognitoExtensionProcessManager::IsIncognitoEnabled( | 438 bool IncognitoExtensionProcessManager::IsIncognitoEnabled( |
| 439 const Extension* extension) { | 439 const Extension* extension) { |
| 440 ExtensionsService* service = | 440 ExtensionService* service = |
| 441 browsing_instance_->profile()->GetExtensionsService(); | 441 browsing_instance_->profile()->GetExtensionService(); |
| 442 return service && service->IsIncognitoEnabled(extension); | 442 return service && service->IsIncognitoEnabled(extension); |
| 443 } | 443 } |
| 444 | 444 |
| 445 void IncognitoExtensionProcessManager::Observe( | 445 void IncognitoExtensionProcessManager::Observe( |
| 446 NotificationType type, | 446 NotificationType type, |
| 447 const NotificationSource& source, | 447 const NotificationSource& source, |
| 448 const NotificationDetails& details) { | 448 const NotificationDetails& details) { |
| 449 switch (type.value) { | 449 switch (type.value) { |
| 450 case NotificationType::BROWSER_WINDOW_READY: { | 450 case NotificationType::BROWSER_WINDOW_READY: { |
| 451 // We want to spawn our background hosts as soon as the user opens an | 451 // We want to spawn our background hosts as soon as the user opens an |
| 452 // incognito window. Watch for new browsers and create the hosts if | 452 // incognito window. Watch for new browsers and create the hosts if |
| 453 // it matches our profile. | 453 // it matches our profile. |
| 454 Browser* browser = Source<Browser>(source).ptr(); | 454 Browser* browser = Source<Browser>(source).ptr(); |
| 455 if (browser->profile() == browsing_instance_->profile()) { | 455 if (browser->profile() == browsing_instance_->profile()) { |
| 456 // On Chrome OS, a login screen is implemented as a browser. | 456 // On Chrome OS, a login screen is implemented as a browser. |
| 457 // This browser has no extension service. In this case, | 457 // This browser has no extension service. In this case, |
| 458 // service will be NULL. | 458 // service will be NULL. |
| 459 ExtensionsService* service = | 459 ExtensionService* service = |
| 460 browsing_instance_->profile()->GetExtensionsService(); | 460 browsing_instance_->profile()->GetExtensionService(); |
| 461 if (service && service->is_ready()) | 461 if (service && service->is_ready()) |
| 462 CreateBackgroundHosts(this, service->extensions()); | 462 CreateBackgroundHosts(this, service->extensions()); |
| 463 } | 463 } |
| 464 break; | 464 break; |
| 465 } | 465 } |
| 466 default: | 466 default: |
| 467 ExtensionProcessManager::Observe(type, source, details); | 467 ExtensionProcessManager::Observe(type, source, details); |
| 468 break; | 468 break; |
| 469 } | 469 } |
| 470 } | 470 } |
| OLD | NEW |