OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 "extensions/browser/process_manager.h" | 5 #include "extensions/browser/process_manager.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 } | 220 } |
221 | 221 |
222 ProcessManager::ProcessManager(BrowserContext* context, | 222 ProcessManager::ProcessManager(BrowserContext* context, |
223 BrowserContext* original_context) | 223 BrowserContext* original_context) |
224 : site_instance_(SiteInstance::Create(context)), | 224 : site_instance_(SiteInstance::Create(context)), |
225 startup_background_hosts_created_(false), | 225 startup_background_hosts_created_(false), |
226 devtools_callback_(base::Bind( | 226 devtools_callback_(base::Bind( |
227 &ProcessManager::OnDevToolsStateChanged, | 227 &ProcessManager::OnDevToolsStateChanged, |
228 base::Unretained(this))), | 228 base::Unretained(this))), |
229 weak_ptr_factory_(this) { | 229 weak_ptr_factory_(this) { |
| 230 LOG(ERROR) << "JAMES new ProcessManager"; |
230 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, | 231 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
231 content::Source<BrowserContext>(original_context)); | 232 content::Source<BrowserContext>(original_context)); |
232 registrar_.Add(this, | 233 registrar_.Add(this, |
233 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, | 234 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, |
234 content::Source<BrowserContext>(original_context)); | 235 content::Source<BrowserContext>(original_context)); |
235 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | 236 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, |
236 content::Source<BrowserContext>(original_context)); | 237 content::Source<BrowserContext>(original_context)); |
237 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, | 238 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
238 content::Source<BrowserContext>(context)); | 239 content::Source<BrowserContext>(context)); |
239 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 240 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
(...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
608 // This increment / decrement is to simulate an instantaneous event. This | 609 // This increment / decrement is to simulate an instantaneous event. This |
609 // has the effect of invalidating close_sequence_id, preventing any in | 610 // has the effect of invalidating close_sequence_id, preventing any in |
610 // progress closes from completing and starting a new close process if | 611 // progress closes from completing and starting a new close process if |
611 // necessary. | 612 // necessary. |
612 IncrementLazyKeepaliveCount(extension); | 613 IncrementLazyKeepaliveCount(extension); |
613 DecrementLazyKeepaliveCount(extension); | 614 DecrementLazyKeepaliveCount(extension); |
614 } | 615 } |
615 } | 616 } |
616 | 617 |
617 void ProcessManager::OnBrowserWindowReady() { | 618 void ProcessManager::OnBrowserWindowReady() { |
| 619 LOG(ERROR) << "JAMES OnBrowserWindowReady"; |
618 // If the extension system isn't ready yet the background hosts will be | 620 // If the extension system isn't ready yet the background hosts will be |
619 // created via NOTIFICATION_EXTENSIONS_READY below. | 621 // created via NOTIFICATION_EXTENSIONS_READY below. |
620 ExtensionSystem* system = ExtensionSystem::Get(GetBrowserContext()); | 622 ExtensionSystem* system = ExtensionSystem::Get(GetBrowserContext()); |
621 if (!system->ready().is_signaled()) | 623 if (!system->ready().is_signaled()) |
622 return; | 624 return; |
623 | 625 |
624 CreateBackgroundHostsForProfileStartup(); | 626 MaybeCreateBackgroundHostsForStartup(); |
625 } | 627 } |
626 | 628 |
627 content::BrowserContext* ProcessManager::GetBrowserContext() const { | 629 content::BrowserContext* ProcessManager::GetBrowserContext() const { |
628 return site_instance_->GetBrowserContext(); | 630 return site_instance_->GetBrowserContext(); |
629 } | 631 } |
630 | 632 |
631 void ProcessManager::SetKeepaliveImpulseCallbackForTesting( | 633 void ProcessManager::SetKeepaliveImpulseCallbackForTesting( |
632 const ImpulseCallbackForTesting& callback) { | 634 const ImpulseCallbackForTesting& callback) { |
633 keepalive_impulse_callback_for_testing_ = callback; | 635 keepalive_impulse_callback_for_testing_ = callback; |
634 } | 636 } |
635 | 637 |
636 void ProcessManager::SetKeepaliveImpulseDecrementCallbackForTesting( | 638 void ProcessManager::SetKeepaliveImpulseDecrementCallbackForTesting( |
637 const ImpulseCallbackForTesting& callback) { | 639 const ImpulseCallbackForTesting& callback) { |
638 keepalive_impulse_decrement_callback_for_testing_ = callback; | 640 keepalive_impulse_decrement_callback_for_testing_ = callback; |
639 } | 641 } |
640 | 642 |
641 void ProcessManager::Observe(int type, | 643 void ProcessManager::Observe(int type, |
642 const content::NotificationSource& source, | 644 const content::NotificationSource& source, |
643 const content::NotificationDetails& details) { | 645 const content::NotificationDetails& details) { |
644 switch (type) { | 646 switch (type) { |
645 case chrome::NOTIFICATION_EXTENSIONS_READY: | 647 case chrome::NOTIFICATION_EXTENSIONS_READY: |
646 case chrome::NOTIFICATION_PROFILE_CREATED: { | 648 case chrome::NOTIFICATION_PROFILE_CREATED: { |
647 // Don't load background hosts now if the loading should be deferred. | 649 if (type == chrome::NOTIFICATION_EXTENSIONS_READY) |
648 // Instead they will be loaded when a browser window for this profile | 650 LOG(ERROR) << "JAMES got extensions_ready"; |
649 // (or an incognito profile from this profile) is ready. | 651 else |
650 if (DeferLoadingBackgroundHosts()) | 652 LOG(ERROR) << "JAMES got profile_created"; |
651 break; | |
652 | 653 |
653 CreateBackgroundHostsForProfileStartup(); | 654 MaybeCreateBackgroundHostsForStartup(); |
654 break; | 655 break; |
655 } | 656 } |
656 | 657 |
657 case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { | 658 case chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED: { |
658 BrowserContext* context = content::Source<BrowserContext>(source).ptr(); | 659 BrowserContext* context = content::Source<BrowserContext>(source).ptr(); |
659 ExtensionSystem* system = ExtensionSystem::Get(context); | 660 ExtensionSystem* system = ExtensionSystem::Get(context); |
660 if (system->ready().is_signaled()) { | 661 if (system->ready().is_signaled()) { |
661 // The extension system is ready, so create the background host. | 662 // The extension system is ready, so create the background host. |
662 const Extension* extension = | 663 const Extension* extension = |
663 content::Details<const Extension>(details).ptr(); | 664 content::Details<const Extension>(details).ptr(); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
735 // RegisterRenderViewHost is called too early (before the process is | 736 // RegisterRenderViewHost is called too early (before the process is |
736 // available), so we need to wait until now to notify. | 737 // available), so we need to wait until now to notify. |
737 content::NotificationService::current()->Notify( | 738 content::NotificationService::current()->Notify( |
738 chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, | 739 chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, |
739 content::Source<BrowserContext>(GetBrowserContext()), | 740 content::Source<BrowserContext>(GetBrowserContext()), |
740 content::Details<RenderViewHost>(contents->GetRenderViewHost())); | 741 content::Details<RenderViewHost>(contents->GetRenderViewHost())); |
741 break; | 742 break; |
742 } | 743 } |
743 | 744 |
744 case chrome::NOTIFICATION_PROFILE_DESTROYED: { | 745 case chrome::NOTIFICATION_PROFILE_DESTROYED: { |
| 746 LOG(ERROR) << "JAMES got profile_destroyed"; |
745 // Close background hosts when the last browser is closed so that they | 747 // Close background hosts when the last browser is closed so that they |
746 // have time to shutdown various objects on different threads. Our | 748 // have time to shutdown various objects on different threads. Our |
747 // destructor is called too late in the shutdown sequence. | 749 // destructor is called too late in the shutdown sequence. |
748 CloseBackgroundHosts(); | 750 CloseBackgroundHosts(); |
749 break; | 751 break; |
750 } | 752 } |
751 | 753 |
752 default: | 754 default: |
753 NOTREACHED(); | 755 NOTREACHED(); |
754 } | 756 } |
(...skipping 16 matching lines...) Expand all Loading... |
771 return; | 773 return; |
772 if (attached) { | 774 if (attached) { |
773 // Keep the lazy background page alive while it's being inspected. | 775 // Keep the lazy background page alive while it's being inspected. |
774 CancelSuspend(extension); | 776 CancelSuspend(extension); |
775 IncrementLazyKeepaliveCount(extension); | 777 IncrementLazyKeepaliveCount(extension); |
776 } else { | 778 } else { |
777 DecrementLazyKeepaliveCount(extension); | 779 DecrementLazyKeepaliveCount(extension); |
778 } | 780 } |
779 } | 781 } |
780 | 782 |
781 void ProcessManager::CreateBackgroundHostsForProfileStartup() { | 783 void ProcessManager::MaybeCreateBackgroundHostsForStartup() { |
782 if (startup_background_hosts_created_ || | 784 if (startup_background_hosts_created_) |
783 !ExtensionsBrowserClient::Get()-> | |
784 IsBackgroundPageAllowed(GetBrowserContext())) { | |
785 return; | 785 return; |
786 } | 786 |
| 787 // The embedder might want to defer background page loading. For example, |
| 788 // Chrome defers background page loading when it is launched to show the app |
| 789 // list, then triggers a load later via OnBrowserWindowReady(). |
| 790 if (ExtensionsBrowserClient::Get()->DeferLoadingBackgroundHosts( |
| 791 GetBrowserContext())) |
| 792 return; |
787 | 793 |
788 const ExtensionSet& enabled_extensions = | 794 const ExtensionSet& enabled_extensions = |
789 ExtensionRegistry::Get(GetBrowserContext())->enabled_extensions(); | 795 ExtensionRegistry::Get(GetBrowserContext())->enabled_extensions(); |
790 for (ExtensionSet::const_iterator extension = enabled_extensions.begin(); | 796 for (ExtensionSet::const_iterator extension = enabled_extensions.begin(); |
791 extension != enabled_extensions.end(); | 797 extension != enabled_extensions.end(); |
792 ++extension) { | 798 ++extension) { |
793 CreateBackgroundHostForExtensionLoad(this, extension->get()); | 799 CreateBackgroundHostForExtensionLoad(this, extension->get()); |
794 | 800 |
795 FOR_EACH_OBSERVER(ProcessManagerObserver, | 801 FOR_EACH_OBSERVER(ProcessManagerObserver, |
796 observer_list_, | 802 observer_list_, |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
931 const Extension* extension = | 937 const Extension* extension = |
932 registry->enabled_extensions().GetExtensionOrAppByURL(url); | 938 registry->enabled_extensions().GetExtensionOrAppByURL(url); |
933 if (extension && !IncognitoInfo::IsSplitMode(extension)) { | 939 if (extension && !IncognitoInfo::IsSplitMode(extension)) { |
934 return original_manager_->GetSiteInstanceForURL(url); | 940 return original_manager_->GetSiteInstanceForURL(url); |
935 } | 941 } |
936 } | 942 } |
937 return ProcessManager::GetSiteInstanceForURL(url); | 943 return ProcessManager::GetSiteInstanceForURL(url); |
938 } | 944 } |
939 | 945 |
940 } // namespace extensions | 946 } // namespace extensions |
OLD | NEW |