| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ui/browser_window.h" | 7 #include "chrome/browser/ui/browser_window.h" |
| 8 #include "content/browser/browsing_instance.h" | 8 #include "content/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/extension_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/ui/browser.h" | 15 #include "chrome/browser/ui/browser.h" |
| 16 #include "chrome/common/chrome_notification_types.h" |
| 16 #include "chrome/common/extensions/extension.h" | 17 #include "chrome/common/extensions/extension.h" |
| 17 #include "chrome/common/url_constants.h" | 18 #include "chrome/common/url_constants.h" |
| 18 #include "content/browser/site_instance.h" | 19 #include "content/browser/site_instance.h" |
| 19 #include "content/browser/tab_contents/tab_contents.h" | 20 #include "content/browser/tab_contents/tab_contents.h" |
| 20 #include "content/common/notification_service.h" | 21 #include "content/common/notification_service.h" |
| 21 #include "content/common/notification_type.h" | |
| 22 | 22 |
| 23 namespace { | 23 namespace { |
| 24 | 24 |
| 25 // Incognito profiles use this process manager. It is mostly a shim that decides | 25 // Incognito profiles use this process manager. It is mostly a shim that decides |
| 26 // whether to fall back on the original profile's ExtensionProcessManager based | 26 // whether to fall back on the original profile's ExtensionProcessManager based |
| 27 // on whether a given extension uses "split" or "spanning" incognito behavior. | 27 // on whether a given extension uses "split" or "spanning" incognito behavior. |
| 28 class IncognitoExtensionProcessManager : public ExtensionProcessManager { | 28 class IncognitoExtensionProcessManager : public ExtensionProcessManager { |
| 29 public: | 29 public: |
| 30 explicit IncognitoExtensionProcessManager(Profile* profile); | 30 explicit IncognitoExtensionProcessManager(Profile* profile); |
| 31 virtual ~IncognitoExtensionProcessManager() {} | 31 virtual ~IncognitoExtensionProcessManager() {} |
| 32 virtual ExtensionHost* CreateViewHost(const Extension* extension, | 32 virtual ExtensionHost* CreateViewHost(const Extension* extension, |
| 33 const GURL& url, | 33 const GURL& url, |
| 34 Browser* browser, | 34 Browser* browser, |
| 35 ViewType::Type view_type) OVERRIDE; | 35 ViewType::Type view_type) OVERRIDE; |
| 36 virtual void CreateBackgroundHost(const Extension* extension, | 36 virtual void CreateBackgroundHost(const Extension* extension, |
| 37 const GURL& url); | 37 const GURL& url); |
| 38 virtual SiteInstance* GetSiteInstanceForURL(const GURL& url); | 38 virtual SiteInstance* GetSiteInstanceForURL(const GURL& url); |
| 39 virtual RenderProcessHost* GetExtensionProcess(const GURL& url); | 39 virtual RenderProcessHost* GetExtensionProcess(const GURL& url); |
| 40 | 40 |
| 41 private: | 41 private: |
| 42 // NotificationObserver: | 42 // NotificationObserver: |
| 43 virtual void Observe(NotificationType type, | 43 virtual void Observe(int type, |
| 44 const NotificationSource& source, | 44 const NotificationSource& source, |
| 45 const NotificationDetails& details); | 45 const NotificationDetails& details); |
| 46 | 46 |
| 47 // Returns the extension for an URL, which can either be a chrome-extension | 47 // Returns the extension for an URL, which can either be a chrome-extension |
| 48 // URL or a web app URL. | 48 // URL or a web app URL. |
| 49 const Extension* GetExtensionOrAppByURL(const GURL& url); | 49 const Extension* GetExtensionOrAppByURL(const GURL& url); |
| 50 | 50 |
| 51 // Returns true if the extension is allowed to run in incognito mode. | 51 // Returns true if the extension is allowed to run in incognito mode. |
| 52 bool IsIncognitoEnabled(const Extension* extension); | 52 bool IsIncognitoEnabled(const Extension* extension); |
| 53 | 53 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 80 // static | 80 // static |
| 81 ExtensionProcessManager* ExtensionProcessManager::Create(Profile* profile) { | 81 ExtensionProcessManager* ExtensionProcessManager::Create(Profile* profile) { |
| 82 return (profile->IsOffTheRecord()) ? | 82 return (profile->IsOffTheRecord()) ? |
| 83 new IncognitoExtensionProcessManager(profile) : | 83 new IncognitoExtensionProcessManager(profile) : |
| 84 new ExtensionProcessManager(profile); | 84 new ExtensionProcessManager(profile); |
| 85 } | 85 } |
| 86 | 86 |
| 87 ExtensionProcessManager::ExtensionProcessManager(Profile* profile) | 87 ExtensionProcessManager::ExtensionProcessManager(Profile* profile) |
| 88 : browsing_instance_(new BrowsingInstance(profile)) { | 88 : browsing_instance_(new BrowsingInstance(profile)) { |
| 89 Profile* original_profile = profile->GetOriginalProfile(); | 89 Profile* original_profile = profile->GetOriginalProfile(); |
| 90 registrar_.Add(this, NotificationType::EXTENSIONS_READY, | 90 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
| 91 Source<Profile>(original_profile)); | 91 Source<Profile>(original_profile)); |
| 92 registrar_.Add(this, NotificationType::EXTENSION_LOADED, | 92 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
| 93 Source<Profile>(original_profile)); | 93 Source<Profile>(original_profile)); |
| 94 registrar_.Add(this, NotificationType::EXTENSION_UNLOADED, | 94 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 95 Source<Profile>(original_profile)); | 95 Source<Profile>(original_profile)); |
| 96 registrar_.Add(this, NotificationType::EXTENSION_HOST_DESTROYED, | 96 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
| 97 Source<Profile>(profile)); | 97 Source<Profile>(profile)); |
| 98 registrar_.Add(this, NotificationType::RENDERER_PROCESS_TERMINATED, | 98 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
| 99 NotificationService::AllSources()); | 99 NotificationService::AllSources()); |
| 100 registrar_.Add(this, NotificationType::RENDERER_PROCESS_CLOSED, | 100 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 101 NotificationService::AllSources()); | 101 NotificationService::AllSources()); |
| 102 registrar_.Add(this, NotificationType::APP_TERMINATING, | 102 registrar_.Add(this, content::NOTIFICATION_APP_TERMINATING, |
| 103 NotificationService::AllSources()); | 103 NotificationService::AllSources()); |
| 104 } | 104 } |
| 105 | 105 |
| 106 ExtensionProcessManager::~ExtensionProcessManager() { | 106 ExtensionProcessManager::~ExtensionProcessManager() { |
| 107 VLOG_IF(1, g_log_bug53991) << "~ExtensionProcessManager: " << this; | 107 VLOG_IF(1, g_log_bug53991) << "~ExtensionProcessManager: " << this; |
| 108 CloseBackgroundHosts(); | 108 CloseBackgroundHosts(); |
| 109 DCHECK(background_hosts_.empty()); | 109 DCHECK(background_hosts_.empty()); |
| 110 } | 110 } |
| 111 | 111 |
| 112 ExtensionHost* ExtensionProcessManager::CreateViewHost( | 112 ExtensionHost* ExtensionProcessManager::CreateViewHost( |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 } | 262 } |
| 263 | 263 |
| 264 SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { | 264 SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { |
| 265 return browsing_instance_->GetSiteInstanceForURL(url); | 265 return browsing_instance_->GetSiteInstanceForURL(url); |
| 266 } | 266 } |
| 267 | 267 |
| 268 bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const { | 268 bool ExtensionProcessManager::HasExtensionHost(ExtensionHost* host) const { |
| 269 return all_hosts_.find(host) != all_hosts_.end(); | 269 return all_hosts_.find(host) != all_hosts_.end(); |
| 270 } | 270 } |
| 271 | 271 |
| 272 void ExtensionProcessManager::Observe(NotificationType type, | 272 void ExtensionProcessManager::Observe(int type, |
| 273 const NotificationSource& source, | 273 const NotificationSource& source, |
| 274 const NotificationDetails& details) { | 274 const NotificationDetails& details) { |
| 275 switch (type.value) { | 275 switch (type) { |
| 276 case NotificationType::EXTENSIONS_READY: { | 276 case chrome::NOTIFICATION_EXTENSIONS_READY: { |
| 277 CreateBackgroundHosts(this, | 277 CreateBackgroundHosts(this, |
| 278 Source<Profile>(source).ptr()->GetExtensionService()->extensions()); | 278 Source<Profile>(source).ptr()->GetExtensionService()->extensions()); |
| 279 break; | 279 break; |
| 280 } | 280 } |
| 281 | 281 |
| 282 case NotificationType::EXTENSION_LOADED: { | 282 case chrome::NOTIFICATION_EXTENSION_LOADED: { |
| 283 ExtensionService* service = | 283 ExtensionService* service = |
| 284 Source<Profile>(source).ptr()->GetExtensionService(); | 284 Source<Profile>(source).ptr()->GetExtensionService(); |
| 285 if (service->is_ready()) { | 285 if (service->is_ready()) { |
| 286 const Extension* extension = Details<const Extension>(details).ptr(); | 286 const Extension* extension = Details<const Extension>(details).ptr(); |
| 287 ::CreateBackgroundHost(this, extension); | 287 ::CreateBackgroundHost(this, extension); |
| 288 } | 288 } |
| 289 break; | 289 break; |
| 290 } | 290 } |
| 291 | 291 |
| 292 case NotificationType::EXTENSION_UNLOADED: { | 292 case chrome::NOTIFICATION_EXTENSION_UNLOADED: { |
| 293 const Extension* extension = | 293 const Extension* extension = |
| 294 Details<UnloadedExtensionInfo>(details)->extension; | 294 Details<UnloadedExtensionInfo>(details)->extension; |
| 295 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); | 295 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); |
| 296 iter != background_hosts_.end(); ++iter) { | 296 iter != background_hosts_.end(); ++iter) { |
| 297 ExtensionHost* host = *iter; | 297 ExtensionHost* host = *iter; |
| 298 if (host->extension_id() == extension->id()) { | 298 if (host->extension_id() == extension->id()) { |
| 299 delete host; | 299 delete host; |
| 300 // |host| should deregister itself from our structures. | 300 // |host| should deregister itself from our structures. |
| 301 DCHECK(background_hosts_.find(host) == background_hosts_.end()); | 301 DCHECK(background_hosts_.find(host) == background_hosts_.end()); |
| 302 break; | 302 break; |
| 303 } | 303 } |
| 304 } | 304 } |
| 305 break; | 305 break; |
| 306 } | 306 } |
| 307 | 307 |
| 308 case NotificationType::EXTENSION_HOST_DESTROYED: { | 308 case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { |
| 309 ExtensionHost* host = Details<ExtensionHost>(details).ptr(); | 309 ExtensionHost* host = Details<ExtensionHost>(details).ptr(); |
| 310 all_hosts_.erase(host); | 310 all_hosts_.erase(host); |
| 311 background_hosts_.erase(host); | 311 background_hosts_.erase(host); |
| 312 break; | 312 break; |
| 313 } | 313 } |
| 314 | 314 |
| 315 case NotificationType::RENDERER_PROCESS_TERMINATED: | 315 case content::NOTIFICATION_RENDERER_PROCESS_TERMINATED: |
| 316 case NotificationType::RENDERER_PROCESS_CLOSED: { | 316 case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { |
| 317 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); | 317 RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); |
| 318 UnregisterExtensionProcess(host->id()); | 318 UnregisterExtensionProcess(host->id()); |
| 319 break; | 319 break; |
| 320 } | 320 } |
| 321 | 321 |
| 322 case NotificationType::APP_TERMINATING: { | 322 case content::NOTIFICATION_APP_TERMINATING: { |
| 323 // Close background hosts when the last browser is closed so that they | 323 // Close background hosts when the last browser is closed so that they |
| 324 // have time to shutdown various objects on different threads. Our | 324 // have time to shutdown various objects on different threads. Our |
| 325 // destructor is called too late in the shutdown sequence. | 325 // destructor is called too late in the shutdown sequence. |
| 326 CloseBackgroundHosts(); | 326 CloseBackgroundHosts(); |
| 327 break; | 327 break; |
| 328 } | 328 } |
| 329 | 329 |
| 330 default: | 330 default: |
| 331 NOTREACHED(); | 331 NOTREACHED(); |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| 335 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, | 335 void ExtensionProcessManager::OnExtensionHostCreated(ExtensionHost* host, |
| 336 bool is_background) { | 336 bool is_background) { |
| 337 DCHECK_EQ(browsing_instance_->profile(), host->profile()); | 337 DCHECK_EQ(browsing_instance_->profile(), host->profile()); |
| 338 | 338 |
| 339 all_hosts_.insert(host); | 339 all_hosts_.insert(host); |
| 340 if (is_background) | 340 if (is_background) |
| 341 background_hosts_.insert(host); | 341 background_hosts_.insert(host); |
| 342 NotificationService::current()->Notify( | 342 NotificationService::current()->Notify( |
| 343 NotificationType::EXTENSION_HOST_CREATED, | 343 chrome::NOTIFICATION_EXTENSION_HOST_CREATED, |
| 344 Source<ExtensionProcessManager>(this), | 344 Source<ExtensionProcessManager>(this), |
| 345 Details<ExtensionHost>(host)); | 345 Details<ExtensionHost>(host)); |
| 346 } | 346 } |
| 347 | 347 |
| 348 void ExtensionProcessManager::CloseBackgroundHosts() { | 348 void ExtensionProcessManager::CloseBackgroundHosts() { |
| 349 VLOG_IF(1, g_log_bug53991) << "CloseBackgroundHosts: " << this; | 349 VLOG_IF(1, g_log_bug53991) << "CloseBackgroundHosts: " << this; |
| 350 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); | 350 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); |
| 351 iter != background_hosts_.end(); ) { | 351 iter != background_hosts_.end(); ) { |
| 352 ExtensionHostSet::iterator current = iter++; | 352 ExtensionHostSet::iterator current = iter++; |
| 353 delete *current; | 353 delete *current; |
| 354 } | 354 } |
| 355 } | 355 } |
| 356 | 356 |
| 357 // | 357 // |
| 358 // IncognitoExtensionProcessManager | 358 // IncognitoExtensionProcessManager |
| 359 // | 359 // |
| 360 | 360 |
| 361 IncognitoExtensionProcessManager::IncognitoExtensionProcessManager( | 361 IncognitoExtensionProcessManager::IncognitoExtensionProcessManager( |
| 362 Profile* profile) | 362 Profile* profile) |
| 363 : ExtensionProcessManager(profile), | 363 : ExtensionProcessManager(profile), |
| 364 original_manager_(profile->GetOriginalProfile()-> | 364 original_manager_(profile->GetOriginalProfile()-> |
| 365 GetExtensionProcessManager()) { | 365 GetExtensionProcessManager()) { |
| 366 DCHECK(profile->IsOffTheRecord()); | 366 DCHECK(profile->IsOffTheRecord()); |
| 367 | 367 |
| 368 registrar_.Add(this, NotificationType::BROWSER_WINDOW_READY, | 368 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_WINDOW_READY, |
| 369 NotificationService::AllSources()); | 369 NotificationService::AllSources()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 ExtensionHost* IncognitoExtensionProcessManager::CreateViewHost( | 372 ExtensionHost* IncognitoExtensionProcessManager::CreateViewHost( |
| 373 const Extension* extension, | 373 const Extension* extension, |
| 374 const GURL& url, | 374 const GURL& url, |
| 375 Browser* browser, | 375 Browser* browser, |
| 376 ViewType::Type view_type) { | 376 ViewType::Type view_type) { |
| 377 if (extension->incognito_split_mode()) { | 377 if (extension->incognito_split_mode()) { |
| 378 if (IsIncognitoEnabled(extension)) { | 378 if (IsIncognitoEnabled(extension)) { |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 432 } | 432 } |
| 433 | 433 |
| 434 bool IncognitoExtensionProcessManager::IsIncognitoEnabled( | 434 bool IncognitoExtensionProcessManager::IsIncognitoEnabled( |
| 435 const Extension* extension) { | 435 const Extension* extension) { |
| 436 ExtensionService* service = | 436 ExtensionService* service = |
| 437 browsing_instance_->profile()->GetExtensionService(); | 437 browsing_instance_->profile()->GetExtensionService(); |
| 438 return service && service->IsIncognitoEnabled(extension->id()); | 438 return service && service->IsIncognitoEnabled(extension->id()); |
| 439 } | 439 } |
| 440 | 440 |
| 441 void IncognitoExtensionProcessManager::Observe( | 441 void IncognitoExtensionProcessManager::Observe( |
| 442 NotificationType type, | 442 int type, |
| 443 const NotificationSource& source, | 443 const NotificationSource& source, |
| 444 const NotificationDetails& details) { | 444 const NotificationDetails& details) { |
| 445 switch (type.value) { | 445 switch (type) { |
| 446 case NotificationType::BROWSER_WINDOW_READY: { | 446 case chrome::NOTIFICATION_BROWSER_WINDOW_READY: { |
| 447 // We want to spawn our background hosts as soon as the user opens an | 447 // We want to spawn our background hosts as soon as the user opens an |
| 448 // incognito window. Watch for new browsers and create the hosts if | 448 // incognito window. Watch for new browsers and create the hosts if |
| 449 // it matches our profile. | 449 // it matches our profile. |
| 450 Browser* browser = Source<Browser>(source).ptr(); | 450 Browser* browser = Source<Browser>(source).ptr(); |
| 451 if (browser->profile() == browsing_instance_->profile()) { | 451 if (browser->profile() == browsing_instance_->profile()) { |
| 452 // On Chrome OS, a login screen is implemented as a browser. | 452 // On Chrome OS, a login screen is implemented as a browser. |
| 453 // This browser has no extension service. In this case, | 453 // This browser has no extension service. In this case, |
| 454 // service will be NULL. | 454 // service will be NULL. |
| 455 ExtensionService* service = | 455 ExtensionService* service = |
| 456 browsing_instance_->profile()->GetExtensionService(); | 456 browsing_instance_->profile()->GetExtensionService(); |
| 457 if (service && service->is_ready()) | 457 if (service && service->is_ready()) |
| 458 CreateBackgroundHosts(this, service->extensions()); | 458 CreateBackgroundHosts(this, service->extensions()); |
| 459 } | 459 } |
| 460 break; | 460 break; |
| 461 } | 461 } |
| 462 default: | 462 default: |
| 463 ExtensionProcessManager::Observe(type, source, details); | 463 ExtensionProcessManager::Observe(type, source, details); |
| 464 break; | 464 break; |
| 465 } | 465 } |
| 466 } | 466 } |
| OLD | NEW |