| 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 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 256 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, | 256 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED_DEPRECATED, |
| 257 content::Source<BrowserContext>(original_context)); | 257 content::Source<BrowserContext>(original_context)); |
| 258 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, | 258 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, |
| 259 content::Source<BrowserContext>(context)); | 259 content::Source<BrowserContext>(context)); |
| 260 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, | 260 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, |
| 261 content::Source<BrowserContext>(context)); | 261 content::Source<BrowserContext>(context)); |
| 262 registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, | 262 registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, |
| 263 content::NotificationService::AllSources()); | 263 content::NotificationService::AllSources()); |
| 264 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_CONNECTED, | 264 registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_CONNECTED, |
| 265 content::NotificationService::AllSources()); | 265 content::NotificationService::AllSources()); |
| 266 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, | |
| 267 content::Source<BrowserContext>(context)); | |
| 268 if (context->IsOffTheRecord()) { | |
| 269 registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, | |
| 270 content::Source<BrowserContext>(original_context)); | |
| 271 } | |
| 272 | 266 |
| 273 // Note: event_page_idle_time_ must be sufficiently larger (e.g. 2x) than | 267 // Note: event_page_idle_time_ must be sufficiently larger (e.g. 2x) than |
| 274 // kKeepaliveThrottleIntervalInSeconds in ppapi/proxy/plugin_globals. | 268 // kKeepaliveThrottleIntervalInSeconds in ppapi/proxy/plugin_globals. |
| 275 event_page_idle_time_ = base::TimeDelta::FromSeconds(10); | 269 event_page_idle_time_ = base::TimeDelta::FromSeconds(10); |
| 276 unsigned idle_time_msec = 0; | 270 unsigned idle_time_msec = 0; |
| 277 if (base::StringToUint(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( | 271 if (base::StringToUint(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( |
| 278 extensions::switches::kEventPageIdleTime), &idle_time_msec)) { | 272 extensions::switches::kEventPageIdleTime), &idle_time_msec)) { |
| 279 CHECK_GT(idle_time_msec, 0u); // OnKeepaliveImpulseCheck requires non zero. | 273 CHECK_GT(idle_time_msec, 0u); // OnKeepaliveImpulseCheck requires non zero. |
| 280 event_page_idle_time_ = base::TimeDelta::FromMilliseconds(idle_time_msec); | 274 event_page_idle_time_ = base::TimeDelta::FromMilliseconds(idle_time_msec); |
| 281 } | 275 } |
| (...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 626 new ExtensionMsg_CancelSuspend(extension->id())); | 620 new ExtensionMsg_CancelSuspend(extension->id())); |
| 627 // This increment / decrement is to simulate an instantaneous event. This | 621 // This increment / decrement is to simulate an instantaneous event. This |
| 628 // has the effect of invalidating close_sequence_id, preventing any in | 622 // has the effect of invalidating close_sequence_id, preventing any in |
| 629 // progress closes from completing and starting a new close process if | 623 // progress closes from completing and starting a new close process if |
| 630 // necessary. | 624 // necessary. |
| 631 IncrementLazyKeepaliveCount(extension); | 625 IncrementLazyKeepaliveCount(extension); |
| 632 DecrementLazyKeepaliveCount(extension); | 626 DecrementLazyKeepaliveCount(extension); |
| 633 } | 627 } |
| 634 } | 628 } |
| 635 | 629 |
| 630 void ProcessManager::CloseBackgroundHosts() { |
| 631 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); |
| 632 iter != background_hosts_.end();) { |
| 633 ExtensionHostSet::iterator current = iter++; |
| 634 delete *current; |
| 635 } |
| 636 } |
| 637 |
| 636 content::BrowserContext* ProcessManager::GetBrowserContext() const { | 638 content::BrowserContext* ProcessManager::GetBrowserContext() const { |
| 637 return site_instance_->GetBrowserContext(); | 639 return site_instance_->GetBrowserContext(); |
| 638 } | 640 } |
| 639 | 641 |
| 640 void ProcessManager::SetKeepaliveImpulseCallbackForTesting( | 642 void ProcessManager::SetKeepaliveImpulseCallbackForTesting( |
| 641 const ImpulseCallbackForTesting& callback) { | 643 const ImpulseCallbackForTesting& callback) { |
| 642 keepalive_impulse_callback_for_testing_ = callback; | 644 keepalive_impulse_callback_for_testing_ = callback; |
| 643 } | 645 } |
| 644 | 646 |
| 645 void ProcessManager::SetKeepaliveImpulseDecrementCallbackForTesting( | 647 void ProcessManager::SetKeepaliveImpulseDecrementCallbackForTesting( |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 738 | 740 |
| 739 // RegisterRenderViewHost is called too early (before the process is | 741 // RegisterRenderViewHost is called too early (before the process is |
| 740 // available), so we need to wait until now to notify. | 742 // available), so we need to wait until now to notify. |
| 741 content::NotificationService::current()->Notify( | 743 content::NotificationService::current()->Notify( |
| 742 chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, | 744 chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, |
| 743 content::Source<BrowserContext>(GetBrowserContext()), | 745 content::Source<BrowserContext>(GetBrowserContext()), |
| 744 content::Details<RenderViewHost>(contents->GetRenderViewHost())); | 746 content::Details<RenderViewHost>(contents->GetRenderViewHost())); |
| 745 break; | 747 break; |
| 746 } | 748 } |
| 747 | 749 |
| 748 case chrome::NOTIFICATION_PROFILE_DESTROYED: { | |
| 749 // Close background hosts when the last browser is closed so that they | |
| 750 // have time to shutdown various objects on different threads. Our | |
| 751 // destructor is called too late in the shutdown sequence. | |
| 752 CloseBackgroundHosts(); | |
| 753 break; | |
| 754 } | |
| 755 | |
| 756 default: | 750 default: |
| 757 NOTREACHED(); | 751 NOTREACHED(); |
| 758 } | 752 } |
| 759 } | 753 } |
| 760 | 754 |
| 761 void ProcessManager::OnDevToolsStateChanged( | 755 void ProcessManager::OnDevToolsStateChanged( |
| 762 content::DevToolsAgentHost* agent_host, | 756 content::DevToolsAgentHost* agent_host, |
| 763 bool attached) { | 757 bool attached) { |
| 764 RenderViewHost* rvh = agent_host->GetRenderViewHost(); | 758 RenderViewHost* rvh = agent_host->GetRenderViewHost(); |
| 765 // Ignore unrelated notifications. | 759 // Ignore unrelated notifications. |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 } | 841 } |
| 848 | 842 |
| 849 void ProcessManager::CloseBackgroundHost(ExtensionHost* host) { | 843 void ProcessManager::CloseBackgroundHost(ExtensionHost* host) { |
| 850 CHECK(host->extension_host_type() == | 844 CHECK(host->extension_host_type() == |
| 851 VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); | 845 VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); |
| 852 delete host; | 846 delete host; |
| 853 // |host| should deregister itself from our structures. | 847 // |host| should deregister itself from our structures. |
| 854 CHECK(background_hosts_.find(host) == background_hosts_.end()); | 848 CHECK(background_hosts_.find(host) == background_hosts_.end()); |
| 855 } | 849 } |
| 856 | 850 |
| 857 void ProcessManager::CloseBackgroundHosts() { | |
| 858 for (ExtensionHostSet::iterator iter = background_hosts_.begin(); | |
| 859 iter != background_hosts_.end(); ) { | |
| 860 ExtensionHostSet::iterator current = iter++; | |
| 861 delete *current; | |
| 862 } | |
| 863 } | |
| 864 | |
| 865 void ProcessManager::UnregisterExtension(const std::string& extension_id) { | 851 void ProcessManager::UnregisterExtension(const std::string& extension_id) { |
| 866 // The lazy_keepalive_count may be greater than zero at this point because | 852 // The lazy_keepalive_count may be greater than zero at this point because |
| 867 // RenderViewHosts are still alive. During extension reloading, they will | 853 // RenderViewHosts are still alive. During extension reloading, they will |
| 868 // decrement the lazy_keepalive_count to negative for the new extension | 854 // decrement the lazy_keepalive_count to negative for the new extension |
| 869 // instance when they are destroyed. Since we are erasing the background page | 855 // instance when they are destroyed. Since we are erasing the background page |
| 870 // data for the unloaded extension, unregister the RenderViewHosts too. | 856 // data for the unloaded extension, unregister the RenderViewHosts too. |
| 871 BrowserContext* context = GetBrowserContext(); | 857 BrowserContext* context = GetBrowserContext(); |
| 872 for (ExtensionRenderViews::iterator it = all_extension_views_.begin(); | 858 for (ExtensionRenderViews::iterator it = all_extension_views_.begin(); |
| 873 it != all_extension_views_.end(); ) { | 859 it != all_extension_views_.end(); ) { |
| 874 if (GetExtensionID(it->first) == extension_id) { | 860 if (GetExtensionID(it->first) == extension_id) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 932 SiteInstance* IncognitoProcessManager::GetSiteInstanceForURL(const GURL& url) { | 918 SiteInstance* IncognitoProcessManager::GetSiteInstanceForURL(const GURL& url) { |
| 933 const Extension* extension = | 919 const Extension* extension = |
| 934 extension_registry_->enabled_extensions().GetExtensionOrAppByURL(url); | 920 extension_registry_->enabled_extensions().GetExtensionOrAppByURL(url); |
| 935 if (extension && !IncognitoInfo::IsSplitMode(extension)) | 921 if (extension && !IncognitoInfo::IsSplitMode(extension)) |
| 936 return original_manager_->GetSiteInstanceForURL(url); | 922 return original_manager_->GetSiteInstanceForURL(url); |
| 937 | 923 |
| 938 return ProcessManager::GetSiteInstanceForURL(url); | 924 return ProcessManager::GetSiteInstanceForURL(url); |
| 939 } | 925 } |
| 940 | 926 |
| 941 } // namespace extensions | 927 } // namespace extensions |
| OLD | NEW |