diff options
author | rockot@google.com <rockot@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-08 19:48:24 +0000 |
---|---|---|
committer | rockot@google.com <rockot@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-08 19:48:24 +0000 |
commit | 069b0203a8374b8c9b4e4df3e75b16724d99eaf2 (patch) | |
tree | 5eab9caa4b38fc054f0bb026235b865b44c6e59d /chrome | |
parent | 98f49e49ef42b91b0e6c05c9c9f2132fb7e5fcc9 (diff) | |
download | chromium_src-069b0203a8374b8c9b4e4df3e75b16724d99eaf2.zip chromium_src-069b0203a8374b8c9b4e4df3e75b16724d99eaf2.tar.gz chromium_src-069b0203a8374b8c9b4e4df3e75b16724d99eaf2.tar.bz2 |
Revert 233956 "Move ExtensionProcessManager to src/extensions, p..."
Compile error, runtime.h has moved?
> Move ExtensionProcessManager to src/extensions, part 4
>
> * Move c/b/extensions/extension_process_manager.h to
> extensions/browser/process_manager.h
> * Rename ExtensionsProcessManager to ProcessManager
> * Place it in the "extensions" namespace
>
> BUG=313481
> TEST=browser_tests, unit_tests
> R=miket@chromium.org
> TBR=sky@chromium.org for mechanical header file move affecting chrome/browser/
>
> Review URL: https://codereview.chromium.org/62713003
TBR=jamescook@chromium.org
Review URL: https://codereview.chromium.org/66213006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@233959 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
68 files changed, 1302 insertions, 233 deletions
diff --git a/chrome/browser/apps/window_controls_browsertest.cc b/chrome/browser/apps/window_controls_browsertest.cc index 7da2e46..4d534a8 100644 --- a/chrome/browser/apps/window_controls_browsertest.cc +++ b/chrome/browser/apps/window_controls_browsertest.cc @@ -3,12 +3,12 @@ // found in the LICENSE file. #include "chrome/browser/apps/app_browsertest_util.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/web_contents_view.h" #include "content/public/test/browser_test_utils.h" -#include "extensions/browser/process_manager.h" class WindowControlsTest : public extensions::PlatformAppBrowserTest { protected: @@ -22,7 +22,7 @@ class WindowControlsTest : public extensions::PlatformAppBrowserTest { content::WebContents* WindowControlsTest::GetWebContentsForExtensionWindow( const extensions::Extension* extension) { - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profile())->process_manager(); // Lookup render view host for background page. @@ -32,9 +32,9 @@ content::WebContents* WindowControlsTest::GetWebContentsForExtensionWindow( extension_host->render_view_host(); // Go through all active views, looking for the first window of the extension - const extensions::ProcessManager::ViewSet all_views = + const ExtensionProcessManager::ViewSet all_views = process_manager->GetAllViews(); - extensions::ProcessManager::ViewSet::const_iterator it = all_views.begin(); + ExtensionProcessManager::ViewSet::const_iterator it = all_views.begin(); for (; it != all_views.end(); ++it) { content::RenderViewHost* host = *it; diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index b692a77..b6db935 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -32,6 +32,7 @@ #include "chrome/browser/content_settings/tab_specific_content_settings.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_tab_util.h" @@ -76,7 +77,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/process_type.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/manifest.h" #include "extensions/common/view_type.h" #include "ui/gfx/codec/png_codec.h" @@ -522,9 +522,9 @@ void TabCountChangeObserver::CheckTabCount() { delete this; } -bool DidExtensionViewsStopLoading(extensions::ProcessManager* manager) { - extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); - for (extensions::ProcessManager::ViewSet::const_iterator iter = +bool DidExtensionViewsStopLoading(ExtensionProcessManager* manager) { + ExtensionProcessManager::ViewSet all_views = manager->GetAllViews(); + for (ExtensionProcessManager::ViewSet::const_iterator iter = all_views.begin(); iter != all_views.end(); ++iter) { if ((*iter)->IsLoading()) @@ -591,7 +591,7 @@ void ExtensionUninstallObserver::Observe( } ExtensionReadyNotificationObserver::ExtensionReadyNotificationObserver( - extensions::ProcessManager* manager, ExtensionService* service, + ExtensionProcessManager* manager, ExtensionService* service, AutomationProvider* automation, IPC::Message* reply_message) : manager_(manager), service_(service), @@ -691,7 +691,7 @@ void ExtensionUnloadNotificationObserver::Observe( } ExtensionsUpdatedObserver::ExtensionsUpdatedObserver( - extensions::ProcessManager* manager, AutomationProvider* automation, + ExtensionProcessManager* manager, AutomationProvider* automation, IPC::Message* reply_message) : manager_(manager), automation_(automation->AsWeakPtr()), reply_message_(reply_message), updater_finished_(false) { diff --git a/chrome/browser/automation/automation_provider_observers.h b/chrome/browser/automation/automation_provider_observers.h index 03b7808..f7dd78b 100644 --- a/chrome/browser/automation/automation_provider_observers.h +++ b/chrome/browser/automation/automation_provider_observers.h @@ -53,6 +53,7 @@ class AutomationProvider; class BalloonCollection; class Browser; +class ExtensionProcessManager; class ExtensionService; class Notification; class Profile; @@ -77,7 +78,6 @@ class WebContents; namespace extensions { class Extension; -class ProcessManager; } namespace history { @@ -347,7 +347,7 @@ class ExtensionReadyNotificationObserver : public content::NotificationObserver { public: // Creates an observer that replies using the JSON automation interface. - ExtensionReadyNotificationObserver(extensions::ProcessManager* manager, + ExtensionReadyNotificationObserver(ExtensionProcessManager* manager, ExtensionService* service, AutomationProvider* automation, IPC::Message* reply_message); @@ -362,7 +362,7 @@ class ExtensionReadyNotificationObserver void Init(); content::NotificationRegistrar registrar_; - extensions::ProcessManager* manager_; + ExtensionProcessManager* manager_; ExtensionService* service_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; @@ -399,7 +399,7 @@ class ExtensionUnloadNotificationObserver // observer waits until all updated extensions have actually been loaded. class ExtensionsUpdatedObserver : public content::NotificationObserver { public: - ExtensionsUpdatedObserver(extensions::ProcessManager* manager, + ExtensionsUpdatedObserver(ExtensionProcessManager* manager, AutomationProvider* automation, IPC::Message* reply_message); virtual ~ExtensionsUpdatedObserver(); @@ -416,7 +416,7 @@ class ExtensionsUpdatedObserver : public content::NotificationObserver { void MaybeReply(); content::NotificationRegistrar registrar_; - extensions::ProcessManager* manager_; + ExtensionProcessManager* manager_; base::WeakPtr<AutomationProvider> automation_; scoped_ptr<IPC::Message> reply_message_; bool updater_finished_; diff --git a/chrome/browser/automation/automation_util.cc b/chrome/browser/automation/automation_util.cc index 3d162eb..7b42e6c 100644 --- a/chrome/browser/automation/automation_util.cc +++ b/chrome/browser/automation/automation_util.cc @@ -17,6 +17,7 @@ #include "base/values.h" #include "chrome/browser/automation/automation_provider.h" #include "chrome/browser/automation/automation_provider_json.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" @@ -33,7 +34,6 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "net/cookies/canonical_cookie.h" #include "net/cookies/cookie_constants.h" diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index b05a8bc..389e86f 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -54,6 +54,7 @@ #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_tab_util.h" @@ -137,7 +138,6 @@ #include "content/public/common/geoposition.h" #include "content/public/common/ssl_status.h" #include "content/public/common/webplugininfo.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "extensions/common/permissions/permission_set.h" #include "extensions/common/url_pattern.h" @@ -2259,13 +2259,13 @@ void TestingAutomationProvider::GetBrowserInfo( ProfileManager* profile_manager = g_browser_process->profile_manager(); std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles()); for (size_t i = 0; i < profiles.size(); ++i) { - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profiles[i])->process_manager(); if (!process_manager) continue; - const extensions::ProcessManager::ViewSet view_set = + const ExtensionProcessManager::ViewSet view_set = process_manager->GetAllViews(); - for (extensions::ProcessManager::ViewSet::const_iterator jt = + for (ExtensionProcessManager::ViewSet::const_iterator jt = view_set.begin(); jt != view_set.end(); ++jt) { content::RenderViewHost* render_view_host = *jt; @@ -3443,7 +3443,7 @@ void TestingAutomationProvider::InstallExtension( ExtensionService* service = extensions::ExtensionSystem::Get( browser->profile())->extension_service(); - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser->profile())->process_manager(); if (service && manager) { // The observer will delete itself when done. @@ -3656,7 +3656,7 @@ void TestingAutomationProvider::SetExtensionStateById( ExtensionService* service = extensions::ExtensionSystem::Get( browser->profile())->extension_service(); - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser->profile())->process_manager(); if (!service) { AutomationJSONReply(this, reply_message) @@ -3887,7 +3887,7 @@ void TestingAutomationProvider::UpdateExtensionsNow( return; } - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser->profile())->process_manager(); if (!manager) { AutomationJSONReply(this, reply_message).SendError( diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index b994e24..f12cd1e 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -36,6 +36,7 @@ #include "chrome/browser/extensions/browser_permissions_policy_delegate.h" #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/extensions/extension_info_map.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_web_ui.h" @@ -129,7 +130,6 @@ #include "content/public/common/child_process_host.h" #include "content/public/common/content_descriptors.h" #include "content/public/common/url_utils.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "extensions/common/constants.h" #include "extensions/common/switches.h" @@ -1222,9 +1222,9 @@ bool ChromeContentBrowserClient::ShouldTryToUseExistingProcessHost( std::vector<Profile*> profiles = g_browser_process->profile_manager()-> GetLoadedProfiles(); for (size_t i = 0; i < profiles.size(); ++i) { - extensions::ProcessManager* epm = + ExtensionProcessManager* epm = extensions::ExtensionSystem::Get(profiles[i])->process_manager(); - for (extensions::ProcessManager::const_iterator iter = + for (ExtensionProcessManager::const_iterator iter = epm->background_hosts().begin(); iter != epm->background_hosts().end(); ++iter) { const extensions::ExtensionHost* host = *iter; diff --git a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc index e805607..6d7956f 100644 --- a/chrome/browser/chromeos/file_manager/file_browser_handlers.cc +++ b/chrome/browser/chromeos/file_manager/file_browser_handlers.cc @@ -50,7 +50,7 @@ int ExtractProcessFromExtensionId(Profile* profile, const std::string& extension_id) { GURL extension_url = Extension::GetBaseURLFromExtensionId(extension_id); - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(profile)->process_manager(); SiteInstance* site_instance = manager->GetSiteInstanceForURL(extension_url); diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc index b609723..f7867e9 100644 --- a/chrome/browser/devtools/devtools_sanity_browsertest.cc +++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc @@ -245,11 +245,11 @@ class DevToolsExtensionTest : public DevToolsSanityTest, base::MessageLoop::current()->PostDelayedTask( FROM_HERE, timeout.callback(), TestTimeouts::action_timeout()); - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())-> process_manager(); - extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); - for (extensions::ProcessManager::ViewSet::const_iterator iter = + ExtensionProcessManager::ViewSet all_views = manager->GetAllViews(); + for (ExtensionProcessManager::ViewSet::const_iterator iter = all_views.begin(); iter != all_views.end();) { if (!(*iter)->IsLoading()) diff --git a/chrome/browser/extensions/alert_apitest.cc b/chrome/browser/extensions/alert_apitest.cc index 8d55c18..f91d9b8 100644 --- a/chrome/browser/extensions/alert_apitest.cc +++ b/chrome/browser/extensions/alert_apitest.cc @@ -5,6 +5,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_modal_dialogs/app_modal_dialog.h" @@ -12,7 +13,6 @@ #include "chrome/common/extensions/extension.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/render_view_host.h" -#include "extensions/browser/process_manager.h" IN_PROC_BROWSER_TEST_F(ExtensionApiTest, AlertBasic) { ASSERT_TRUE(RunExtensionTest("alert")) << message_; diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc index 3dba5f2..fb46466 100644 --- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc +++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc @@ -473,7 +473,7 @@ ItemInspectViewList DeveloperPrivateGetItemsInfoFunction:: ItemInspectViewList result; // Get the extension process's active views. - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = ExtensionSystem::Get(GetProfile())->process_manager(); GetInspectablePagesForExtensionProcess( extension, diff --git a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc index 5840e05..7eaae89 100644 --- a/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc +++ b/chrome/browser/extensions/api/extension_action/browser_action_apitest.cc @@ -612,7 +612,7 @@ IN_PROC_BROWSER_TEST_F(BrowserActionApiTest, DISABLED_CloseBackgroundPage) { const Extension* extension = GetSingleLoadedExtension(); // There is a background page and a browser action with no badge text. - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); ASSERT_TRUE(manager->GetBackgroundHostForExtension(extension->id())); ExtensionAction* action = GetBrowserAction(*extension); diff --git a/chrome/browser/extensions/api/management/management_browsertest.cc b/chrome/browser/extensions/api/management/management_browsertest.cc index b76c39b..f0036ff 100644 --- a/chrome/browser/extensions/api/management/management_browsertest.cc +++ b/chrome/browser/extensions/api/management/management_browsertest.cc @@ -46,7 +46,7 @@ class ExtensionManagementTest : public ExtensionBrowserTest { // Test that the extension's version from the manifest and reported by the // background page is correct. This is to ensure that the processes are in // sync with the Extension. - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())-> process_manager(); extensions::ExtensionHost* ext_host = @@ -138,7 +138,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, MAYBE_InstallRequiresConfirm) { // Tests that disabling and re-enabling an extension works. IN_PROC_BROWSER_TEST_F(ExtensionManagementTest, DisableEnable) { - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); ExtensionService* service = extensions::ExtensionSystem::Get( browser()->profile())->extension_service(); diff --git a/chrome/browser/extensions/api/messaging/extension_message_port.cc b/chrome/browser/extensions/api/messaging/extension_message_port.cc index a04237d..9e0ca61 100644 --- a/chrome/browser/extensions/api/messaging/extension_message_port.cc +++ b/chrome/browser/extensions/api/messaging/extension_message_port.cc @@ -5,12 +5,12 @@ #include "chrome/browser/extensions/api/messaging/extension_message_port.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/background_info.h" #include "chrome/common/extensions/extension_messages.h" #include "content/public/browser/render_process_host.h" -#include "extensions/browser/process_manager.h" namespace extensions { @@ -56,7 +56,7 @@ void ExtensionMessagePort::DispatchOnMessage(const Message& message, void ExtensionMessagePort::IncrementLazyKeepaliveCount() { Profile* profile = Profile::FromBrowserContext(process_->GetBrowserContext()); - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = ExtensionSystem::Get(profile)->process_manager(); ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); if (host && BackgroundInfo::HasLazyBackgroundPage(host->extension())) @@ -70,7 +70,7 @@ void ExtensionMessagePort::IncrementLazyKeepaliveCount() { void ExtensionMessagePort::DecrementLazyKeepaliveCount() { Profile* profile = Profile::FromBrowserContext(process_->GetBrowserContext()); - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = ExtensionSystem::Get(profile)->process_manager(); ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id_); if (host && host == background_host_ptr_) diff --git a/chrome/browser/extensions/api/messaging/message_service.cc b/chrome/browser/extensions/api/messaging/message_service.cc index 7cf8190..fb557c3 100644 --- a/chrome/browser/extensions/api/messaging/message_service.cc +++ b/chrome/browser/extensions/api/messaging/message_service.cc @@ -17,6 +17,7 @@ #include "chrome/browser/extensions/api/messaging/incognito_connectability.h" #include "chrome/browser/extensions/api/messaging/native_message_port.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_tab_util.h" @@ -36,7 +37,6 @@ #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" #include "extensions/browser/lazy_background_task_queue.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_handlers/incognito_info.h" #include "net/base/completion_callback.h" diff --git a/chrome/browser/extensions/api/runtime/runtime_api.cc b/chrome/browser/extensions/api/runtime/runtime_api.cc index 21fa8ae0..3411a03 100644 --- a/chrome/browser/extensions/api/runtime/runtime_api.cc +++ b/chrome/browser/extensions/api/runtime/runtime_api.cc @@ -13,6 +13,7 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/updater/extension_updater.h" @@ -30,7 +31,6 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "extensions/browser/lazy_background_task_queue.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/error_utils.h" #include "url/gurl.h" #include "webkit/browser/fileapi/isolated_context.h" diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc index b8bdaf2..4268a39 100644 --- a/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc +++ b/chrome/browser/extensions/api/system_indicator/system_indicator_apitest.cc @@ -7,11 +7,11 @@ #include "chrome/browser/extensions/extension_action.h" #include "chrome/browser/extensions/extension_action_manager.h" #include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/lazy_background_page_test_util.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/extensions/extension.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/switches.h" class SystemIndicatorApiTest : public ExtensionApiTest { @@ -60,7 +60,7 @@ IN_PROC_BROWSER_TEST_F(SystemIndicatorApiTest, SystemIndicator) { ASSERT_TRUE(extension) << message_; // Lazy Background Page has been shut down. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); diff --git a/chrome/browser/extensions/api/system_storage/system_storage_eject_apitest.cc b/chrome/browser/extensions/api/system_storage/system_storage_eject_apitest.cc index 8e67fe6..f366321 100644 --- a/chrome/browser/extensions/api/system_storage/system_storage_eject_apitest.cc +++ b/chrome/browser/extensions/api/system_storage/system_storage_eject_apitest.cc @@ -10,6 +10,7 @@ #include "chrome/browser/extensions/api/system_storage/storage_api_test_util.h" #include "chrome/browser/extensions/api/system_storage/storage_info_provider.h" #include "chrome/browser/extensions/extension_apitest.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/storage_monitor/storage_info.h" @@ -18,7 +19,6 @@ #include "chrome/common/extensions/extension.h" #include "content/public/browser/render_view_host.h" #include "content/public/test/test_utils.h" -#include "extensions/browser/process_manager.h" namespace { diff --git a/chrome/browser/extensions/browsertest_util.cc b/chrome/browser/extensions/browsertest_util.cc index b65be05..7a09359 100644 --- a/chrome/browser/extensions/browsertest_util.cc +++ b/chrome/browser/extensions/browsertest_util.cc @@ -5,9 +5,9 @@ #include "chrome/browser/extensions/browsertest_util.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "content/public/test/browser_test_utils.h" -#include "extensions/browser/process_manager.h" #include "testing/gtest/include/gtest/gtest.h" namespace extensions { @@ -16,7 +16,7 @@ namespace browsertest_util { std::string ExecuteScriptInBackgroundPage(Profile* profile, const std::string& extension_id, const std::string& script) { - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(profile)->process_manager(); extensions::ExtensionHost* host = manager->GetBackgroundHostForExtension(extension_id); diff --git a/chrome/browser/extensions/chrome_notification_observer.cc b/chrome/browser/extensions/chrome_notification_observer.cc index af7f796..9327e52 100644 --- a/chrome/browser/extensions/chrome_notification_observer.cc +++ b/chrome/browser/extensions/chrome_notification_observer.cc @@ -6,16 +6,16 @@ #include "base/logging.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "content/public/browser/notification_service.h" -#include "extensions/browser/process_manager.h" namespace extensions { ChromeNotificationObserver::ChromeNotificationObserver() { - // Notifications for extensions::ProcessManager + // Notifications for ExtensionProcessManager registrar_.Add(this, chrome::NOTIFICATION_BROWSER_WINDOW_READY, content::NotificationService::AllSources()); } @@ -29,7 +29,7 @@ void ChromeNotificationObserver::OnBrowserWindowReady(Browser* browser) { // Inform the process manager for this profile that the window is ready. // We continue to observe the notification in case browser windows open for // a related incognito profile or other regular profiles. - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = ExtensionSystem::Get(profile)->process_manager(); if (!manager) // Tests may not have a process manager. return; @@ -42,7 +42,7 @@ void ChromeNotificationObserver::OnBrowserWindowReady(Browser* browser) { // non-incognito window opened. if (profile->IsOffTheRecord()) { Profile* original_profile = profile->GetOriginalProfile(); - extensions::ProcessManager* original_manager = + ExtensionProcessManager* original_manager = ExtensionSystem::Get(original_profile)->process_manager(); DCHECK(original_manager); DCHECK_EQ(original_profile, original_manager->GetBrowserContext()); diff --git a/chrome/browser/extensions/devtools_util.cc b/chrome/browser/extensions/devtools_util.cc index 5b35dfd..987fe9e 100644 --- a/chrome/browser/extensions/devtools_util.cc +++ b/chrome/browser/extensions/devtools_util.cc @@ -6,11 +6,11 @@ #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/extension.h" #include "extensions/browser/lazy_background_task_queue.h" -#include "extensions/browser/process_manager.h" namespace extensions { namespace devtools_util { diff --git a/chrome/browser/extensions/event_router.cc b/chrome/browser/extensions/event_router.cc index 8995bfa..abd05d0 100644 --- a/chrome/browser/extensions/event_router.cc +++ b/chrome/browser/extensions/event_router.cc @@ -19,6 +19,7 @@ #include "chrome/browser/extensions/api/web_request/web_request_api.h" #include "chrome/browser/extensions/event_names.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_util.h" @@ -34,7 +35,6 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/render_process_host.h" #include "extensions/browser/lazy_background_task_queue.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/extension_api.h" #include "extensions/common/extension_urls.h" #include "extensions/common/manifest_handlers/incognito_info.h" @@ -699,7 +699,7 @@ void EventRouter::IncrementInFlightEvents(Profile* profile, // Only increment in-flight events if the lazy background page is active, // because that's the only time we'll get an ACK. if (BackgroundInfo::HasLazyBackgroundPage(extension)) { - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = ExtensionSystem::Get(profile)->process_manager(); ExtensionHost* host = pm->GetBackgroundHostForExtension(extension->id()); if (host) @@ -709,7 +709,7 @@ void EventRouter::IncrementInFlightEvents(Profile* profile, void EventRouter::OnEventAck(Profile* profile, const std::string& extension_id) { - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = ExtensionSystem::Get(profile)->process_manager(); ExtensionHost* host = pm->GetBackgroundHostForExtension(extension_id); // The event ACK is routed to the background host, so this should never be diff --git a/chrome/browser/extensions/extension_bindings_apitest.cc b/chrome/browser/extensions/extension_bindings_apitest.cc index fb5c114..2fbaeb8 100644 --- a/chrome/browser/extensions/extension_bindings_apitest.cc +++ b/chrome/browser/extensions/extension_bindings_apitest.cc @@ -7,12 +7,12 @@ #include "chrome/browser/extensions/api/permissions/permissions_api.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/ui/browser.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/test/browser_test_utils.h" -#include "extensions/browser/process_manager.h" namespace extensions { namespace { @@ -42,7 +42,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, LastError) { test_data_dir_.AppendASCII("browsertest").AppendASCII("last_error"))); // Get the ExtensionHost that is hosting our background page. - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); extensions::ExtensionHost* host = FindHostWithPath(manager, "/bg.html", 1); diff --git a/chrome/browser/extensions/extension_browsertest.cc b/chrome/browser/extensions/extension_browsertest.cc index d64b755..7497884 100644 --- a/chrome/browser/extensions/extension_browsertest.cc +++ b/chrome/browser/extensions/extension_browsertest.cc @@ -557,17 +557,15 @@ void ExtensionBrowserTest::NavigateInRenderer(content::WebContents* contents, } extensions::ExtensionHost* ExtensionBrowserTest::FindHostWithPath( - extensions::ProcessManager* manager, + ExtensionProcessManager* manager, const std::string& path, int expected_hosts) { extensions::ExtensionHost* host = NULL; int num_hosts = 0; - extensions::ProcessManager::ExtensionHostSet background_hosts = + ExtensionProcessManager::ExtensionHostSet background_hosts = manager->background_hosts(); - for (extensions::ProcessManager::const_iterator iter = - background_hosts.begin(); - iter != background_hosts.end(); - ++iter) { + for (ExtensionProcessManager::const_iterator iter = background_hosts.begin(); + iter != background_hosts.end(); ++iter) { if ((*iter)->GetURL().path() == path) { EXPECT_FALSE(host); host = *iter; diff --git a/chrome/browser/extensions/extension_browsertest.h b/chrome/browser/extensions/extension_browsertest.h index d1183cf..ff930ea 100644 --- a/chrome/browser/extensions/extension_browsertest.h +++ b/chrome/browser/extensions/extension_browsertest.h @@ -22,14 +22,11 @@ #include "content/public/browser/web_contents.h" #include "extensions/common/manifest.h" +class ExtensionProcessManager; class ExtensionService; class ExtensionSet; class Profile; -namespace extensions { -class ProcessManager; -} - // Base class for extension browser tests. Provides utilities for loading, // unloading, and installing extensions. class ExtensionBrowserTest : virtual public InProcessBrowserTest { @@ -265,11 +262,9 @@ class ExtensionBrowserTest : virtual public InProcessBrowserTest { // Looks for an ExtensionHost whose URL has the given path component // (including leading slash). Also verifies that the expected number of hosts // are loaded. - extensions::ExtensionHost* FindHostWithPath( - extensions::ProcessManager* manager, - const std::string& path, - int expected_hosts); - + extensions::ExtensionHost* FindHostWithPath(ExtensionProcessManager* manager, + const std::string& path, + int expected_hosts); // Returns // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(), // extension_id, script). diff --git a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc index f5eac57..4ee676a 100644 --- a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc +++ b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc @@ -5,6 +5,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/notifications/balloon.h" @@ -23,7 +24,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/common/result_codes.h" -#include "extensions/browser/process_manager.h" #include "ui/message_center/message_center.h" #include "ui/message_center/message_center_switches.h" #include "ui/message_center/message_center_util.h" @@ -51,7 +51,7 @@ class ExtensionCrashRecoveryTestBase : public ExtensionBrowserTest { return browser()->profile()->GetExtensionService(); } - extensions::ProcessManager* GetProcessManager() { + ExtensionProcessManager* GetExtensionProcessManager() { return extensions::ExtensionSystem::Get(browser()->profile())-> process_manager(); } @@ -60,14 +60,14 @@ class ExtensionCrashRecoveryTestBase : public ExtensionBrowserTest { const Extension* extension = GetExtensionService()->GetExtensionById(extension_id, false); ASSERT_TRUE(extension); - extensions::ExtensionHost* extension_host = GetProcessManager()-> + extensions::ExtensionHost* extension_host = GetExtensionProcessManager()-> GetBackgroundHostForExtension(extension_id); ASSERT_TRUE(extension_host); base::KillProcess(extension_host->render_process_host()->GetHandle(), content::RESULT_CODE_KILLED, false); ASSERT_TRUE(WaitForExtensionCrash(extension_id)); - ASSERT_FALSE(GetProcessManager()-> + ASSERT_FALSE(GetExtensionProcessManager()-> GetBackgroundHostForExtension(extension_id)); // Wait for extension crash balloon to appear. @@ -78,12 +78,12 @@ class ExtensionCrashRecoveryTestBase : public ExtensionBrowserTest { const Extension* extension = GetExtensionService()->extensions()->GetByID(extension_id); ASSERT_TRUE(extension); - extensions::ExtensionHost* extension_host = GetProcessManager()-> + extensions::ExtensionHost* extension_host = GetExtensionProcessManager()-> GetBackgroundHostForExtension(extension_id); ASSERT_TRUE(extension_host); - extensions::ProcessManager::ViewSet all_views = - GetProcessManager()->GetAllViews(); - extensions::ProcessManager::ViewSet::const_iterator it = + ExtensionProcessManager::ViewSet all_views = + GetExtensionProcessManager()->GetAllViews(); + ExtensionProcessManager::ViewSet::const_iterator it = all_views.find(extension_host->host_contents()->GetRenderViewHost()); ASSERT_FALSE(it == all_views.end()); ASSERT_TRUE(extension_host->IsRenderViewLive()); diff --git a/chrome/browser/extensions/extension_function_dispatcher.cc b/chrome/browser/extensions/extension_function_dispatcher.cc index d05bcc8..9fc3be3 100644 --- a/chrome/browser/extensions/extension_function_dispatcher.cc +++ b/chrome/browser/extensions/extension_function_dispatcher.cc @@ -322,7 +322,7 @@ void ExtensionFunctionDispatcher::DispatchWithCallback( // TODO(yzshen): There is some shared logic between this method and // DispatchOnIOThread(). It is nice to deduplicate. ExtensionService* service = profile()->GetExtensionService(); - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profile())->process_manager(); extensions::ProcessMap* process_map = service->process_map(); if (!service || !process_map) diff --git a/chrome/browser/extensions/extension_host.cc b/chrome/browser/extensions/extension_host.cc index 77aee96..4379dcb 100644 --- a/chrome/browser/extensions/extension_host.cc +++ b/chrome/browser/extensions/extension_host.cc @@ -18,6 +18,7 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/error_console/error_console.h" #include "chrome/browser/extensions/event_router.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_tab_util.h" @@ -51,7 +52,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view.h" #include "extensions/browser/extension_error.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "extensions/common/extension_urls.h" #include "grit/browser_resources.h" @@ -480,13 +480,15 @@ void ExtensionHost::CloseContents(WebContents* contents) { } void ExtensionHost::WillRunJavaScriptDialog() { - ProcessManager* pm = ExtensionSystem::Get(profile_)->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile_)->process_manager(); if (pm) pm->IncrementLazyKeepaliveCount(extension()); } void ExtensionHost::DidCloseJavaScriptDialog() { - ProcessManager* pm = ExtensionSystem::Get(profile_)->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile_)->process_manager(); if (pm) pm->DecrementLazyKeepaliveCount(extension()); } @@ -571,13 +573,15 @@ void ExtensionHost::OnEventAck() { } void ExtensionHost::OnIncrementLazyKeepaliveCount() { - ProcessManager* pm = ExtensionSystem::Get(profile_)->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile_)->process_manager(); if (pm) pm->IncrementLazyKeepaliveCount(extension()); } void ExtensionHost::OnDecrementLazyKeepaliveCount() { - ProcessManager* pm = ExtensionSystem::Get(profile_)->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile_)->process_manager(); if (pm) pm->DecrementLazyKeepaliveCount(extension()); } diff --git a/chrome/browser/extensions/extension_host_factory.cc b/chrome/browser/extensions/extension_host_factory.cc index bf464c2..96c86f3 100644 --- a/chrome/browser/extensions/extension_host_factory.cc +++ b/chrome/browser/extensions/extension_host_factory.cc @@ -5,13 +5,13 @@ #include "chrome/browser/extensions/extension_host_factory.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/url_constants.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/manifest_handlers/incognito_info.h" #include "extensions/common/view_type.h" @@ -34,7 +34,7 @@ ExtensionHost* CreateViewHostForExtension(const Extension* extension, DCHECK(profile); // A NULL browser may only be given for dialogs. DCHECK(browser || view_type == VIEW_TYPE_EXTENSION_DIALOG); - ProcessManager* pm = + ExtensionProcessManager* pm = ExtensionSystem::Get(profile)->process_manager(); content::SiteInstance* site_instance = pm->GetSiteInstanceForURL(url); ExtensionHost* host = diff --git a/chrome/browser/extensions/extension_info_map.cc b/chrome/browser/extensions/extension_info_map.cc index 26361cf..4d4fb22 100644 --- a/chrome/browser/extensions/extension_info_map.cc +++ b/chrome/browser/extensions/extension_info_map.cc @@ -90,7 +90,7 @@ base::Time ExtensionInfoMap::GetInstallTime( bool ExtensionInfoMap::IsIncognitoEnabled( const std::string& extension_id) const { - // Keep in sync with duplicate in extensions/browser/process_manager.cc. + // Keep in sync with duplicate in extension_process_manager.cc. ExtraDataMap::const_iterator iter = extra_data_.find(extension_id); if (iter != extra_data_.end()) return iter->second.incognito_enabled; diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc new file mode 100644 index 0000000..b11eecf --- /dev/null +++ b/chrome/browser/extensions/extension_process_manager.cc @@ -0,0 +1,853 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_process_manager.h" + +#include "base/bind.h" +#include "base/command_line.h" +#include "base/lazy_instance.h" +#include "base/logging.h" +#include "base/message_loop/message_loop.h" +#include "base/metrics/histogram.h" +#include "base/stl_util.h" +#include "base/strings/string_number_conversions.h" +#include "base/time/time.h" +#include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/extensions/api/runtime/runtime_api.h" +#include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_service.h" +#include "chrome/browser/extensions/extension_system.h" +#include "chrome/browser/extensions/extension_util.h" +#include "chrome/common/extensions/background_info.h" +#include "chrome/common/extensions/extension.h" +#include "chrome/common/extensions/extension_messages.h" +#include "content/public/browser/browser_context.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/devtools_agent_host.h" +#include "content/public/browser/devtools_manager.h" +#include "content/public/browser/notification_service.h" +#include "content/public/browser/render_process_host.h" +#include "content/public/browser/render_view_host.h" +#include "content/public/browser/site_instance.h" +#include "content/public/browser/web_contents.h" +#include "content/public/browser/web_contents_delegate.h" +#include "content/public/browser/web_contents_observer.h" +#include "content/public/browser/web_contents_user_data.h" +#include "content/public/common/renderer_preferences.h" +#include "extensions/browser/extensions_browser_client.h" +#include "extensions/browser/view_type_utils.h" +#include "extensions/common/manifest_handlers/incognito_info.h" +#include "extensions/common/switches.h" + +#if defined(OS_MACOSX) +#include "chrome/browser/extensions/extension_host_mac.h" +#endif + +using content::BrowserContext; +using content::RenderViewHost; +using content::SiteInstance; +using content::WebContents; +using extensions::BackgroundInfo; +using extensions::BackgroundManifestHandler; +using extensions::Extension; +using extensions::ExtensionHost; +using extensions::ExtensionsBrowserClient; +using extensions::ExtensionSystem; + +class RenderViewHostDestructionObserver; +DEFINE_WEB_CONTENTS_USER_DATA_KEY(RenderViewHostDestructionObserver); + +namespace { + +std::string GetExtensionID(RenderViewHost* render_view_host) { + // This works for both apps and extensions because the site has been + // normalized to the extension URL for apps. + if (!render_view_host->GetSiteInstance()) + return std::string(); + + return render_view_host->GetSiteInstance()->GetSiteURL().host(); +} + +void OnRenderViewHostUnregistered(BrowserContext* context, + RenderViewHost* render_view_host) { + content::NotificationService::current()->Notify( + chrome::NOTIFICATION_EXTENSION_VIEW_UNREGISTERED, + content::Source<BrowserContext>(context), + content::Details<RenderViewHost>(render_view_host)); +} + +// Incognito profiles use this process manager. It is mostly a shim that decides +// whether to fall back on the original profile's ExtensionProcessManager based +// on whether a given extension uses "split" or "spanning" incognito behavior. +class IncognitoExtensionProcessManager : public ExtensionProcessManager { + public: + IncognitoExtensionProcessManager(BrowserContext* incognito_context, + BrowserContext* original_context); + virtual ~IncognitoExtensionProcessManager(); + virtual ExtensionHost* CreateBackgroundHost(const Extension* extension, + const GURL& url) OVERRIDE; + virtual SiteInstance* GetSiteInstanceForURL(const GURL& url) OVERRIDE; + + private: + // Returns true if the extension is allowed to run in incognito mode. + bool IsIncognitoEnabled(const Extension* extension); + + ExtensionProcessManager* original_manager_; + + DISALLOW_COPY_AND_ASSIGN(IncognitoExtensionProcessManager); +}; + +static void CreateBackgroundHostForExtensionLoad( + ExtensionProcessManager* manager, const Extension* extension) { + DVLOG(1) << "CreateBackgroundHostForExtensionLoad"; + if (BackgroundInfo::HasPersistentBackgroundPage(extension)) + manager->CreateBackgroundHost(extension, + BackgroundInfo::GetBackgroundURL(extension)); +} + +} // namespace + +class RenderViewHostDestructionObserver + : public content::WebContentsObserver, + public content::WebContentsUserData<RenderViewHostDestructionObserver> { + public: + virtual ~RenderViewHostDestructionObserver() {} + + private: + explicit RenderViewHostDestructionObserver(WebContents* web_contents) + : WebContentsObserver(web_contents) { + BrowserContext* context = web_contents->GetBrowserContext(); + process_manager_ = + ExtensionSystem::GetForBrowserContext(context)->process_manager(); + } + + friend class content::WebContentsUserData<RenderViewHostDestructionObserver>; + + // content::WebContentsObserver overrides. + virtual void RenderViewDeleted(RenderViewHost* render_view_host) OVERRIDE { + process_manager_->UnregisterRenderViewHost(render_view_host); + } + + ExtensionProcessManager* process_manager_; + + DISALLOW_COPY_AND_ASSIGN(RenderViewHostDestructionObserver); +}; + +struct ExtensionProcessManager::BackgroundPageData { + // The count of things keeping the lazy background page alive. + int lazy_keepalive_count; + + // This is used with the ShouldSuspend message, to ensure that the extension + // remained idle between sending the message and receiving the ack. + int close_sequence_id; + + // True if the page responded to the ShouldSuspend message and is currently + // dispatching the suspend event. During this time any events that arrive will + // cancel the suspend process and an onSuspendCanceled event will be + // dispatched to the page. + bool is_closing; + + // Keeps track of when this page was last suspended. Used for perf metrics. + linked_ptr<base::ElapsedTimer> since_suspended; + + BackgroundPageData() + : lazy_keepalive_count(0), close_sequence_id(0), is_closing(false) {} +}; + +// +// ExtensionProcessManager +// + +// static +ExtensionProcessManager* ExtensionProcessManager::Create( + BrowserContext* context) { + if (context->IsOffTheRecord()) { + BrowserContext* original_context = + ExtensionsBrowserClient::Get()->GetOriginalContext(context); + return new IncognitoExtensionProcessManager(context, original_context); + } + return new ExtensionProcessManager(context, context); +} + +ExtensionProcessManager::ExtensionProcessManager( + BrowserContext* context, + BrowserContext* original_context) + : site_instance_(SiteInstance::Create(context)), + defer_background_host_creation_(false), + startup_background_hosts_created_(false), + devtools_callback_(base::Bind( + &ExtensionProcessManager::OnDevToolsStateChanged, + base::Unretained(this))), + weak_ptr_factory_(this) { + registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, + content::Source<BrowserContext>(original_context)); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, + content::Source<BrowserContext>(original_context)); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, + content::Source<BrowserContext>(original_context)); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED, + content::Source<BrowserContext>(context)); + registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE, + content::Source<BrowserContext>(context)); + registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED, + content::NotificationService::AllSources()); + registrar_.Add(this, content::NOTIFICATION_WEB_CONTENTS_CONNECTED, + content::NotificationService::AllSources()); + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED, + content::Source<BrowserContext>(original_context)); + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, + content::Source<BrowserContext>(context)); + if (context->IsOffTheRecord()) { + registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, + content::Source<BrowserContext>(original_context)); + } + + event_page_idle_time_ = base::TimeDelta::FromSeconds(10); + unsigned idle_time_sec = 0; + if (base::StringToUint(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + extensions::switches::kEventPageIdleTime), &idle_time_sec)) { + event_page_idle_time_ = base::TimeDelta::FromSeconds(idle_time_sec); + } + event_page_suspending_time_ = base::TimeDelta::FromSeconds(5); + unsigned suspending_time_sec = 0; + if (base::StringToUint(CommandLine::ForCurrentProcess()->GetSwitchValueASCII( + extensions::switches::kEventPageSuspendingTime), + &suspending_time_sec)) { + event_page_suspending_time_ = + base::TimeDelta::FromSeconds(suspending_time_sec); + } + + content::DevToolsManager::GetInstance()->AddAgentStateCallback( + devtools_callback_); +} + +ExtensionProcessManager::~ExtensionProcessManager() { + CloseBackgroundHosts(); + DCHECK(background_hosts_.empty()); + content::DevToolsManager::GetInstance()->RemoveAgentStateCallback( + devtools_callback_); +} + +const ExtensionProcessManager::ViewSet +ExtensionProcessManager::GetAllViews() const { + ViewSet result; + for (ExtensionRenderViews::const_iterator iter = + all_extension_views_.begin(); + iter != all_extension_views_.end(); ++iter) { + result.insert(iter->first); + } + return result; +} + +ExtensionHost* ExtensionProcessManager::CreateBackgroundHost( + const Extension* extension, const GURL& url) { + DVLOG(1) << "CreateBackgroundHost " << url.spec(); + // Hosted apps are taken care of from BackgroundContentsService. Ignore them + // here. + if (extension->is_hosted_app()) + return NULL; + + // Don't create multiple background hosts for an extension. + if (ExtensionHost* host = GetBackgroundHostForExtension(extension->id())) + return host; // TODO(kalman): return NULL here? It might break things... + + ExtensionHost* host = +#if defined(OS_MACOSX) + new extensions::ExtensionHostMac( + extension, GetSiteInstanceForURL(url), url, + extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); +#else + new ExtensionHost(extension, GetSiteInstanceForURL(url), url, + extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); +#endif + + host->CreateRenderViewSoon(); + OnBackgroundHostCreated(host); + return host; +} + +ExtensionHost* ExtensionProcessManager::GetBackgroundHostForExtension( + const std::string& extension_id) { + for (ExtensionHostSet::iterator iter = background_hosts_.begin(); + iter != background_hosts_.end(); ++iter) { + ExtensionHost* host = *iter; + if (host->extension_id() == extension_id) + return host; + } + return NULL; +} + +std::set<RenderViewHost*> + ExtensionProcessManager::GetRenderViewHostsForExtension( + const std::string& extension_id) { + std::set<RenderViewHost*> result; + + SiteInstance* site_instance = GetSiteInstanceForURL( + Extension::GetBaseURLFromExtensionId(extension_id)); + if (!site_instance) + return result; + + // Gather up all the views for that site. + for (ExtensionRenderViews::iterator view = all_extension_views_.begin(); + view != all_extension_views_.end(); ++view) { + if (view->first->GetSiteInstance() == site_instance) + result.insert(view->first); + } + + return result; +} + +const Extension* ExtensionProcessManager::GetExtensionForRenderViewHost( + RenderViewHost* render_view_host) { + if (!render_view_host->GetSiteInstance()) + return NULL; + + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + if (!service) + return NULL; + + return service->extensions()->GetByID(GetExtensionID(render_view_host)); +} + +void ExtensionProcessManager::UnregisterRenderViewHost( + RenderViewHost* render_view_host) { + ExtensionRenderViews::iterator view = + all_extension_views_.find(render_view_host); + if (view == all_extension_views_.end()) + return; + + OnRenderViewHostUnregistered(GetBrowserContext(), render_view_host); + extensions::ViewType view_type = view->second; + all_extension_views_.erase(view); + + // Keepalive count, balanced in RegisterRenderViewHost. + if (view_type != extensions::VIEW_TYPE_INVALID && + view_type != extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { + const Extension* extension = GetExtensionForRenderViewHost( + render_view_host); + if (extension) + DecrementLazyKeepaliveCount(extension); + } +} + +void ExtensionProcessManager::RegisterRenderViewHost( + RenderViewHost* render_view_host) { + const Extension* extension = GetExtensionForRenderViewHost( + render_view_host); + if (!extension) + return; + + WebContents* web_contents = WebContents::FromRenderViewHost(render_view_host); + all_extension_views_[render_view_host] = + extensions::GetViewType(web_contents); + + // Keep the lazy background page alive as long as any non-background-page + // extension views are visible. Keepalive count balanced in + // UnregisterRenderViewHost. + IncrementLazyKeepaliveCountForView(render_view_host); +} + +SiteInstance* ExtensionProcessManager::GetSiteInstanceForURL(const GURL& url) { + return site_instance_->GetRelatedSiteInstance(url); +} + +bool ExtensionProcessManager::IsBackgroundHostClosing( + const std::string& extension_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + return (host && background_page_data_[extension_id].is_closing); +} + +int ExtensionProcessManager::GetLazyKeepaliveCount(const Extension* extension) { + if (!BackgroundInfo::HasLazyBackgroundPage(extension)) + return 0; + + return background_page_data_[extension->id()].lazy_keepalive_count; +} + +int ExtensionProcessManager::IncrementLazyKeepaliveCount( + const Extension* extension) { + if (!BackgroundInfo::HasLazyBackgroundPage(extension)) + return 0; + + int& count = background_page_data_[extension->id()].lazy_keepalive_count; + if (++count == 1) + OnLazyBackgroundPageActive(extension->id()); + + return count; +} + +int ExtensionProcessManager::DecrementLazyKeepaliveCount( + const Extension* extension) { + if (!BackgroundInfo::HasLazyBackgroundPage(extension)) + return 0; + + int& count = background_page_data_[extension->id()].lazy_keepalive_count; + DCHECK_GT(count, 0); + + // If we reach a zero keepalive count when the lazy background page is about + // to be closed, incrementing close_sequence_id will cancel the close + // sequence and cause the background page to linger. So check is_closing + // before initiating another close sequence. + if (--count == 0 && !background_page_data_[extension->id()].is_closing) { + base::MessageLoop::current()->PostDelayedTask( + FROM_HERE, + base::Bind(&ExtensionProcessManager::OnLazyBackgroundPageIdle, + weak_ptr_factory_.GetWeakPtr(), extension->id(), + ++background_page_data_[extension->id()].close_sequence_id), + event_page_idle_time_); + } + + return count; +} + +void ExtensionProcessManager::IncrementLazyKeepaliveCountForView( + RenderViewHost* render_view_host) { + WebContents* web_contents = + WebContents::FromRenderViewHost(render_view_host); + extensions::ViewType view_type = extensions::GetViewType(web_contents); + if (view_type != extensions::VIEW_TYPE_INVALID && + view_type != extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { + const Extension* extension = GetExtensionForRenderViewHost( + render_view_host); + if (extension) + IncrementLazyKeepaliveCount(extension); + } +} + +void ExtensionProcessManager::OnLazyBackgroundPageIdle( + const std::string& extension_id, int sequence_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + if (host && !background_page_data_[extension_id].is_closing && + sequence_id == background_page_data_[extension_id].close_sequence_id) { + // Tell the renderer we are about to close. This is a simple ping that the + // renderer will respond to. The purpose is to control sequencing: if the + // extension remains idle until the renderer responds with an ACK, then we + // know that the extension process is ready to shut down. If our + // close_sequence_id has already changed, then we would ignore the + // ShouldSuspendAck, so we don't send the ping. + host->render_view_host()->Send(new ExtensionMsg_ShouldSuspend( + extension_id, sequence_id)); + } +} + +void ExtensionProcessManager::OnLazyBackgroundPageActive( + const std::string& extension_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + if (host && !background_page_data_[extension_id].is_closing) { + // Cancel the current close sequence by changing the close_sequence_id, + // which causes us to ignore the next ShouldSuspendAck. + ++background_page_data_[extension_id].close_sequence_id; + } +} + +void ExtensionProcessManager::OnShouldSuspendAck( + const std::string& extension_id, int sequence_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + if (host && + sequence_id == background_page_data_[extension_id].close_sequence_id) { + host->render_view_host()->Send(new ExtensionMsg_Suspend(extension_id)); + } +} + +void ExtensionProcessManager::OnSuspendAck(const std::string& extension_id) { + background_page_data_[extension_id].is_closing = true; + int sequence_id = background_page_data_[extension_id].close_sequence_id; + base::MessageLoop::current()->PostDelayedTask( + FROM_HERE, + base::Bind(&ExtensionProcessManager::CloseLazyBackgroundPageNow, + weak_ptr_factory_.GetWeakPtr(), extension_id, sequence_id), + event_page_suspending_time_); +} + +void ExtensionProcessManager::CloseLazyBackgroundPageNow( + const std::string& extension_id, int sequence_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + if (host && + sequence_id == background_page_data_[extension_id].close_sequence_id) { + ExtensionHost* host = GetBackgroundHostForExtension(extension_id); + if (host) + CloseBackgroundHost(host); + } +} + +void ExtensionProcessManager::OnNetworkRequestStarted( + RenderViewHost* render_view_host) { + ExtensionHost* host = GetBackgroundHostForExtension( + GetExtensionID(render_view_host)); + if (host && host->render_view_host() == render_view_host) + IncrementLazyKeepaliveCount(host->extension()); +} + +void ExtensionProcessManager::OnNetworkRequestDone( + RenderViewHost* render_view_host) { + ExtensionHost* host = GetBackgroundHostForExtension( + GetExtensionID(render_view_host)); + if (host && host->render_view_host() == render_view_host) + DecrementLazyKeepaliveCount(host->extension()); +} + +void ExtensionProcessManager::CancelSuspend(const Extension* extension) { + bool& is_closing = background_page_data_[extension->id()].is_closing; + ExtensionHost* host = GetBackgroundHostForExtension(extension->id()); + if (host && is_closing) { + is_closing = false; + host->render_view_host()->Send( + new ExtensionMsg_CancelSuspend(extension->id())); + // This increment / decrement is to simulate an instantaneous event. This + // has the effect of invalidating close_sequence_id, preventing any in + // progress closes from completing and starting a new close process if + // necessary. + IncrementLazyKeepaliveCount(extension); + DecrementLazyKeepaliveCount(extension); + } +} + +void ExtensionProcessManager::DeferBackgroundHostCreation(bool defer) { + bool previous = defer_background_host_creation_; + defer_background_host_creation_ = defer; + + // If we were deferred, and we switch to non-deferred, then create the + // background hosts. + if (previous && !defer_background_host_creation_) + CreateBackgroundHostsForProfileStartup(); +} + +void ExtensionProcessManager::OnBrowserWindowReady() { + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + // On Chrome OS, a login screen is implemented as a browser. + // This browser has no extension service. In this case, + // service will be NULL. + if (!service || !service->is_ready()) + return; + + CreateBackgroundHostsForProfileStartup(); +} + +content::BrowserContext* ExtensionProcessManager::GetBrowserContext() const { + return site_instance_->GetBrowserContext(); +} + +void ExtensionProcessManager::Observe( + int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) { + switch (type) { + case chrome::NOTIFICATION_EXTENSIONS_READY: + case chrome::NOTIFICATION_PROFILE_CREATED: { + CreateBackgroundHostsForProfileStartup(); + break; + } + + case chrome::NOTIFICATION_EXTENSION_LOADED: { + BrowserContext* context = content::Source<BrowserContext>(source).ptr(); + ExtensionService* service = + ExtensionSystem::GetForBrowserContext(context)->extension_service(); + if (service->is_ready()) { + const Extension* extension = + content::Details<const Extension>(details).ptr(); + CreateBackgroundHostForExtensionLoad(this, extension); + } + break; + } + + case chrome::NOTIFICATION_EXTENSION_UNLOADED: { + const Extension* extension = + content::Details<extensions::UnloadedExtensionInfo>( + details)->extension; + for (ExtensionHostSet::iterator iter = background_hosts_.begin(); + iter != background_hosts_.end(); ++iter) { + ExtensionHost* host = *iter; + if (host->extension_id() == extension->id()) { + CloseBackgroundHost(host); + break; + } + } + UnregisterExtension(extension->id()); + break; + } + + case chrome::NOTIFICATION_EXTENSION_HOST_DESTROYED: { + ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); + if (background_hosts_.erase(host)) { + ClearBackgroundPageData(host->extension()->id()); + background_page_data_[host->extension()->id()].since_suspended.reset( + new base::ElapsedTimer()); + } + break; + } + + case chrome::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE: { + ExtensionHost* host = content::Details<ExtensionHost>(details).ptr(); + if (host->extension_host_type() == + extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) { + CloseBackgroundHost(host); + } + break; + } + + case content::NOTIFICATION_RENDER_VIEW_HOST_CHANGED: { + // We get this notification both for new WebContents and when one + // has its RenderViewHost replaced (e.g. when a user does a cross-site + // navigation away from an extension URL). For the replaced case, we must + // unregister the old RVH so it doesn't count as an active view that would + // keep the event page alive. + WebContents* contents = content::Source<WebContents>(source).ptr(); + if (contents->GetBrowserContext() != GetBrowserContext()) + break; + + typedef std::pair<RenderViewHost*, RenderViewHost*> RVHPair; + RVHPair* switched_details = content::Details<RVHPair>(details).ptr(); + if (switched_details->first) + UnregisterRenderViewHost(switched_details->first); + + // The above will unregister a RVH when it gets swapped out with a new + // one. However we need to watch the WebContents to know when a RVH is + // deleted because the WebContents has gone away. + RenderViewHostDestructionObserver::CreateForWebContents(contents); + RegisterRenderViewHost(switched_details->second); + break; + } + + case content::NOTIFICATION_WEB_CONTENTS_CONNECTED: { + WebContents* contents = content::Source<WebContents>(source).ptr(); + if (contents->GetBrowserContext() != GetBrowserContext()) + break; + const Extension* extension = GetExtensionForRenderViewHost( + contents->GetRenderViewHost()); + if (!extension) + return; + + // RegisterRenderViewHost is called too early (before the process is + // available), so we need to wait until now to notify. + content::NotificationService::current()->Notify( + chrome::NOTIFICATION_EXTENSION_VIEW_REGISTERED, + content::Source<BrowserContext>(GetBrowserContext()), + content::Details<RenderViewHost>(contents->GetRenderViewHost())); + break; + } + + case chrome::NOTIFICATION_PROFILE_DESTROYED: { + // Close background hosts when the last browser is closed so that they + // have time to shutdown various objects on different threads. Our + // destructor is called too late in the shutdown sequence. + CloseBackgroundHosts(); + break; + } + + default: + NOTREACHED(); + } +} + +void ExtensionProcessManager::OnDevToolsStateChanged( + content::DevToolsAgentHost* agent_host, bool attached) { + RenderViewHost* rvh = agent_host->GetRenderViewHost(); + // Ignore unrelated notifications. + if (!rvh || + rvh->GetSiteInstance()->GetProcess()->GetBrowserContext() != + GetBrowserContext()) + return; + if (extensions::GetViewType(WebContents::FromRenderViewHost(rvh)) != + extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE) + return; + const Extension* extension = GetExtensionForRenderViewHost(rvh); + if (!extension) + return; + if (attached) { + // Keep the lazy background page alive while it's being inspected. + CancelSuspend(extension); + IncrementLazyKeepaliveCount(extension); + } else { + DecrementLazyKeepaliveCount(extension); + } +} + +void ExtensionProcessManager::CreateBackgroundHostsForProfileStartup() { + if (startup_background_hosts_created_) + return; + + // Don't load background hosts now if the loading should be deferred. + // Instead they will be loaded when a browser window for this profile + // (or an incognito profile from this profile) is ready, or when + // DeferBackgroundHostCreation is called with false. + if (DeferLoadingBackgroundHosts()) + return; + + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + DCHECK(service); + for (ExtensionSet::const_iterator extension = service->extensions()->begin(); + extension != service->extensions()->end(); ++extension) { + CreateBackgroundHostForExtensionLoad(this, extension->get()); + + extensions::RuntimeEventRouter::DispatchOnStartupEvent( + GetBrowserContext(), (*extension)->id()); + } + startup_background_hosts_created_ = true; + + // Background pages should only be loaded once. To prevent any further loads + // occurring, we remove the notification listeners. + BrowserContext* original_context = + ExtensionsBrowserClient::Get()->GetOriginalContext(GetBrowserContext()); + if (registrar_.IsRegistered( + this, + chrome::NOTIFICATION_PROFILE_CREATED, + content::Source<BrowserContext>(original_context))) { + registrar_.Remove(this, + chrome::NOTIFICATION_PROFILE_CREATED, + content::Source<BrowserContext>(original_context)); + } + if (registrar_.IsRegistered( + this, + chrome::NOTIFICATION_EXTENSIONS_READY, + content::Source<BrowserContext>(original_context))) { + registrar_.Remove(this, + chrome::NOTIFICATION_EXTENSIONS_READY, + content::Source<BrowserContext>(original_context)); + } +} + +void ExtensionProcessManager::OnBackgroundHostCreated(ExtensionHost* host) { + DCHECK_EQ(GetBrowserContext(), host->browser_context()); + background_hosts_.insert(host); + + if (BackgroundInfo::HasLazyBackgroundPage(host->extension())) { + linked_ptr<base::ElapsedTimer> since_suspended( + background_page_data_[host->extension()->id()]. + since_suspended.release()); + if (since_suspended.get()) { + UMA_HISTOGRAM_LONG_TIMES("Extensions.EventPageIdleTime", + since_suspended->Elapsed()); + } + } +} + +void ExtensionProcessManager::CloseBackgroundHost(ExtensionHost* host) { + CHECK(host->extension_host_type() == + extensions::VIEW_TYPE_EXTENSION_BACKGROUND_PAGE); + delete host; + // |host| should deregister itself from our structures. + CHECK(background_hosts_.find(host) == background_hosts_.end()); +} + +void ExtensionProcessManager::CloseBackgroundHosts() { + for (ExtensionHostSet::iterator iter = background_hosts_.begin(); + iter != background_hosts_.end(); ) { + ExtensionHostSet::iterator current = iter++; + delete *current; + } +} + +void ExtensionProcessManager::UnregisterExtension( + const std::string& extension_id) { + // The lazy_keepalive_count may be greater than zero at this point because + // RenderViewHosts are still alive. During extension reloading, they will + // decrement the lazy_keepalive_count to negative for the new extension + // instance when they are destroyed. Since we are erasing the background page + // data for the unloaded extension, unregister the RenderViewHosts too. + BrowserContext* context = GetBrowserContext(); + for (ExtensionRenderViews::iterator it = all_extension_views_.begin(); + it != all_extension_views_.end(); ) { + if (GetExtensionID(it->first) == extension_id) { + OnRenderViewHostUnregistered(context, it->first); + all_extension_views_.erase(it++); + } else { + ++it; + } + } + + background_page_data_.erase(extension_id); +} + +void ExtensionProcessManager::ClearBackgroundPageData( + const std::string& extension_id) { + background_page_data_.erase(extension_id); + + // Re-register all RenderViews for this extension. We do this to restore + // the lazy_keepalive_count (if any) to properly reflect the number of open + // views. + for (ExtensionRenderViews::const_iterator it = all_extension_views_.begin(); + it != all_extension_views_.end(); ++it) { + if (GetExtensionID(it->first) == extension_id) + IncrementLazyKeepaliveCountForView(it->first); + } +} + +bool ExtensionProcessManager::DeferLoadingBackgroundHosts() const { + // Don't load background hosts now if the loading should be deferred. + if (defer_background_host_creation_) + return true; + + // The extensions embedder may have special rules about background hosts. + return ExtensionsBrowserClient::Get()->DeferLoadingBackgroundHosts( + GetBrowserContext()); +} + +// +// IncognitoExtensionProcessManager +// + +IncognitoExtensionProcessManager::IncognitoExtensionProcessManager( + BrowserContext* incognito_context, + BrowserContext* original_context) + : ExtensionProcessManager(incognito_context, original_context), + original_manager_(extensions::ExtensionSystem::GetForBrowserContext( + original_context)->process_manager()) { + DCHECK(incognito_context->IsOffTheRecord()); + + // The original profile will have its own ExtensionProcessManager to + // load the background pages of the spanning extensions. This process + // manager need only worry about the split mode extensions, which is handled + // in the NOTIFICATION_BROWSER_WINDOW_READY notification handler. + registrar_.Remove(this, chrome::NOTIFICATION_EXTENSIONS_READY, + content::Source<BrowserContext>(original_context)); + registrar_.Remove(this, chrome::NOTIFICATION_PROFILE_CREATED, + content::Source<BrowserContext>(original_context)); +} + +IncognitoExtensionProcessManager::~IncognitoExtensionProcessManager() { + // TODO(yoz): This cleanup code belongs in the MenuManager. + // Remove "incognito" "split" mode context menu items. + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + if (service) + service->menu_manager()->RemoveAllIncognitoContextItems(); +} + +ExtensionHost* IncognitoExtensionProcessManager::CreateBackgroundHost( + const Extension* extension, const GURL& url) { + if (extensions::IncognitoInfo::IsSplitMode(extension)) { + if (IsIncognitoEnabled(extension)) + return ExtensionProcessManager::CreateBackgroundHost(extension, url); + } else { + // Do nothing. If an extension is spanning, then its original-profile + // background page is shared with incognito, so we don't create another. + } + return NULL; +} + +SiteInstance* IncognitoExtensionProcessManager::GetSiteInstanceForURL( + const GURL& url) { + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + if (service) { + const Extension* extension = + service->extensions()->GetExtensionOrAppByURL(url); + if (extension && + !extensions::IncognitoInfo::IsSplitMode(extension)) { + return original_manager_->GetSiteInstanceForURL(url); + } + } + return ExtensionProcessManager::GetSiteInstanceForURL(url); +} + +bool IncognitoExtensionProcessManager::IsIncognitoEnabled( + const Extension* extension) { + // Keep in sync with duplicate in extension_info_map.cc. + ExtensionService* service = ExtensionSystem::GetForBrowserContext( + GetBrowserContext())->extension_service(); + return extension_util::IsIncognitoEnabled(extension->id(), service); +} diff --git a/chrome/browser/extensions/extension_process_manager.h b/chrome/browser/extensions/extension_process_manager.h new file mode 100644 index 0000000..a2fefb1 --- /dev/null +++ b/chrome/browser/extensions/extension_process_manager.h @@ -0,0 +1,221 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_ +#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_ + +#include <map> +#include <set> +#include <string> + +#include "base/callback.h" +#include "base/compiler_specific.h" +#include "base/memory/ref_counted.h" +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "content/public/browser/notification_observer.h" +#include "content/public/browser/notification_registrar.h" +#include "extensions/common/view_type.h" + +class GURL; + +namespace content { +class BrowserContext; +class DevToolsAgentHost; +class RenderViewHost; +class SiteInstance; +}; + +namespace extensions { +class Extension; +class ExtensionHost; +} + +// Manages dynamic state of running Chromium extensions. There is one instance +// of this class per Profile. OTR Profiles have a separate instance that keeps +// track of split-mode extensions only. +class ExtensionProcessManager : public content::NotificationObserver { + public: + typedef std::set<extensions::ExtensionHost*> ExtensionHostSet; + typedef ExtensionHostSet::const_iterator const_iterator; + + static ExtensionProcessManager* Create(content::BrowserContext* context); + virtual ~ExtensionProcessManager(); + + const ExtensionHostSet& background_hosts() const { + return background_hosts_; + } + + typedef std::set<content::RenderViewHost*> ViewSet; + const ViewSet GetAllViews() const; + + // Creates a new UI-less extension instance. Like CreateViewHost, but not + // displayed anywhere. + virtual extensions::ExtensionHost* CreateBackgroundHost( + const extensions::Extension* extension, + const GURL& url); + + // Gets the ExtensionHost for the background page for an extension, or NULL if + // the extension isn't running or doesn't have a background page. + extensions::ExtensionHost* GetBackgroundHostForExtension( + const std::string& extension_id); + + // Returns the SiteInstance that the given URL belongs to. + // TODO(aa): This only returns correct results for extensions and packaged + // apps, not hosted apps. + virtual content::SiteInstance* GetSiteInstanceForURL(const GURL& url); + + // Unregisters a RenderViewHost as hosting any extension. + void UnregisterRenderViewHost(content::RenderViewHost* render_view_host); + + // Returns all RenderViewHosts that are registered for the specified + // extension. + std::set<content::RenderViewHost*> GetRenderViewHostsForExtension( + const std::string& extension_id); + + // Returns the extension associated with the specified RenderViewHost, or + // NULL. + const extensions::Extension* GetExtensionForRenderViewHost( + content::RenderViewHost* render_view_host); + + // Returns true if the (lazy) background host for the given extension has + // already been sent the unload event and is shutting down. + bool IsBackgroundHostClosing(const std::string& extension_id); + + // Getter and setter for the lazy background page's keepalive count. This is + // the count of how many outstanding "things" are keeping the page alive. + // When this reaches 0, we will begin the process of shutting down the page. + // "Things" include pending events, resource loads, and API calls. + int GetLazyKeepaliveCount(const extensions::Extension* extension); + int IncrementLazyKeepaliveCount(const extensions::Extension* extension); + int DecrementLazyKeepaliveCount(const extensions::Extension* extension); + + void IncrementLazyKeepaliveCountForView( + content::RenderViewHost* render_view_host); + + // Handles a response to the ShouldSuspend message, used for lazy background + // pages. + void OnShouldSuspendAck(const std::string& extension_id, int sequence_id); + + // Same as above, for the Suspend message. + void OnSuspendAck(const std::string& extension_id); + + // Tracks network requests for a given RenderViewHost, used to know + // when network activity is idle for lazy background pages. + void OnNetworkRequestStarted(content::RenderViewHost* render_view_host); + void OnNetworkRequestDone(content::RenderViewHost* render_view_host); + + // Prevents |extension|'s background page from being closed and sends the + // onSuspendCanceled() event to it. + void CancelSuspend(const extensions::Extension* extension); + + // If |defer| is true background host creation is to be deferred until this is + // called again with |defer| set to false, at which point all deferred + // background hosts will be created. Defaults to false. + void DeferBackgroundHostCreation(bool defer); + + // Ensures background hosts are loaded for a new browser window. + void OnBrowserWindowReady(); + + // Gets the BrowserContext associated with site_instance_ and all other + // related SiteInstances. + content::BrowserContext* GetBrowserContext() const; + + protected: + // If |context| is incognito pass the master context as |original_context|. + // Otherwise pass the same context for both. + ExtensionProcessManager(content::BrowserContext* context, + content::BrowserContext* original_context); + + // Called on browser shutdown to close our extension hosts. + void CloseBackgroundHosts(); + + // content::NotificationObserver: + virtual void Observe(int type, + const content::NotificationSource& source, + const content::NotificationDetails& details) OVERRIDE; + + // Load all background pages once the profile data is ready and the pages + // should be loaded. + void CreateBackgroundHostsForProfileStartup(); + + content::NotificationRegistrar registrar_; + + // The set of ExtensionHosts running viewless background extensions. + ExtensionHostSet background_hosts_; + + // A SiteInstance related to the SiteInstance for all extensions in + // this profile. We create it in such a way that a new + // browsing instance is created. This controls process grouping. + scoped_refptr<content::SiteInstance> site_instance_; + + private: + friend class ExtensionProcessManagerTest; + + // Extra information we keep for each extension's background page. + struct BackgroundPageData; + typedef std::string ExtensionId; + typedef std::map<ExtensionId, BackgroundPageData> BackgroundPageDataMap; + typedef std::map<content::RenderViewHost*, + extensions::ViewType> ExtensionRenderViews; + + // Called just after |host| is created so it can be registered in our lists. + void OnBackgroundHostCreated(extensions::ExtensionHost* host); + + // Close the given |host| iff it's a background page. + void CloseBackgroundHost(extensions::ExtensionHost* host); + + // These are called when the extension transitions between idle and active. + // They control the process of closing the background page when idle. + void OnLazyBackgroundPageIdle(const std::string& extension_id, + int sequence_id); + void OnLazyBackgroundPageActive(const std::string& extension_id); + void CloseLazyBackgroundPageNow(const std::string& extension_id, + int sequence_id); + + // Potentially registers a RenderViewHost, if it is associated with an + // extension. Does nothing if this is not an extension renderer. + void RegisterRenderViewHost(content::RenderViewHost* render_view_host); + + // Unregister RenderViewHosts and clear background page data for an extension + // which has been unloaded. + void UnregisterExtension(const std::string& extension_id); + + // Clears background page data for this extension. + void ClearBackgroundPageData(const std::string& extension_id); + + // Returns true if loading background pages should be deferred. + bool DeferLoadingBackgroundHosts() const; + + void OnDevToolsStateChanged(content::DevToolsAgentHost*, bool attached); + + // Contains all active extension-related RenderViewHost instances for all + // extensions. We also keep a cache of the host's view type, because that + // information is not accessible at registration/deregistration time. + ExtensionRenderViews all_extension_views_; + + BackgroundPageDataMap background_page_data_; + + // The time to delay between an extension becoming idle and + // sending a ShouldSuspend message; read from command-line switch. + base::TimeDelta event_page_idle_time_; + + // The time to delay between sending a ShouldSuspend message and + // sending a Suspend message; read from command-line switch. + base::TimeDelta event_page_suspending_time_; + + // If true, then creation of background hosts is suspended. + bool defer_background_host_creation_; + + // True if we have created the startup set of background hosts. + bool startup_background_hosts_created_; + + base::Callback<void(content::DevToolsAgentHost*, bool)> devtools_callback_; + + base::WeakPtrFactory<ExtensionProcessManager> weak_ptr_factory_; + + DISALLOW_COPY_AND_ASSIGN(ExtensionProcessManager); +}; + +#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PROCESS_MANAGER_H_ diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/extension_process_manager_browsertest.cc index af7c908..b4de778 100644 --- a/chrome/browser/extensions/process_manager_browsertest.cc +++ b/chrome/browser/extensions/extension_process_manager_browsertest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "extensions/browser/process_manager.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/browser_action_test_util.h" #include "chrome/browser/extensions/extension_browsertest.h" @@ -12,17 +12,19 @@ #include "content/public/browser/notification_service.h" #include "content/public/test/test_utils.h" -namespace extensions { +using extensions::Extension; +using extensions::ExtensionSystem; // Exists as a browser test because ExtensionHosts are hard to create without // a real browser. -typedef ExtensionBrowserTest ProcessManagerBrowserTest; +typedef ExtensionBrowserTest ExtensionProcessManagerBrowserTest; // Test that basic extension loading creates the appropriate ExtensionHosts // and background pages. -IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionProcessManagerBrowserTest, ExtensionHostCreation) { - ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile())->process_manager(); // We start with no background hosts. ASSERT_EQ(0u, pm->background_hosts().size()); @@ -61,9 +63,10 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, // background page and that clicking on the action creates the appropriate // ExtensionHost. // Disabled due to flake, see http://crbug.com/315242 -IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, +IN_PROC_BROWSER_TEST_F(ExtensionProcessManagerBrowserTest, DISABLED_PopupHostCreation) { - ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager(); + ExtensionProcessManager* pm = + ExtensionSystem::Get(profile())->process_manager(); // Load an extension with the ability to open a popup but no background // page. @@ -101,5 +104,3 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, EXPECT_FALSE(pm->IsBackgroundHostClosing(popup->id())); EXPECT_EQ(0, pm->GetLazyKeepaliveCount(popup.get())); } - -} // namespace extensions diff --git a/chrome/browser/extensions/process_manager_unittest.cc b/chrome/browser/extensions/extension_process_manager_unittest.cc index 9ad05db..c8ca541 100644 --- a/chrome/browser/extensions/process_manager_unittest.cc +++ b/chrome/browser/extensions/extension_process_manager_unittest.cc @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "extensions/browser/process_manager.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_error_reporter.h" @@ -15,15 +15,8 @@ using content::SiteInstance; -namespace extensions { - -// TODO(jamescook): Convert this from TestingProfile to TestBrowserContext and -// move to extensions/browser. This is dependent on ExtensionPrefs being -// converted and ExtensionSystem being converted or eliminated. -// http://crbug.com/315855 - // make the test a PlatformTest to setup autorelease pools properly on mac -class ProcessManagerTest : public testing::Test { +class ExtensionProcessManagerTest : public testing::Test { public: static void SetUpTestCase() { ExtensionErrorReporter::Init(false); // no noisy errors @@ -35,20 +28,20 @@ class ProcessManagerTest : public testing::Test { // Returns true if the notification |type| is registered for |manager| with // source |profile|. Pass NULL for |profile| for all sources. - static bool IsRegistered(ProcessManager* manager, - int type, - TestingProfile* profile) { + static bool IsRegistered(ExtensionProcessManager* manager, + int type, + TestingProfile* profile) { return manager->registrar_.IsRegistered( manager, type, content::Source<Profile>(profile)); } }; // Test that notification registration works properly. -TEST_F(ProcessManagerTest, ExtensionNotificationRegistration) { +TEST_F(ExtensionProcessManagerTest, ExtensionNotificationRegistration) { // Test for a normal profile. scoped_ptr<TestingProfile> original_profile(new TestingProfile); - scoped_ptr<ProcessManager> manager1( - ProcessManager::Create(original_profile.get())); + scoped_ptr<ExtensionProcessManager> manager1( + ExtensionProcessManager::Create(original_profile.get())); EXPECT_EQ(original_profile.get(), manager1->GetBrowserContext()); EXPECT_EQ(0u, manager1->background_hosts().size()); @@ -72,8 +65,8 @@ TEST_F(ProcessManagerTest, ExtensionNotificationRegistration) { builder.SetIncognito(); scoped_ptr<TestingProfile> incognito_profile = builder.Build(); incognito_profile->SetOriginalProfile(original_profile.get()); - scoped_ptr<ProcessManager> manager2( - ProcessManager::Create(incognito_profile.get())); + scoped_ptr<ExtensionProcessManager> manager2( + ExtensionProcessManager::Create(incognito_profile.get())); EXPECT_EQ(incognito_profile.get(), manager2->GetBrowserContext()); EXPECT_EQ(0u, manager2->background_hosts().size()); @@ -109,15 +102,17 @@ TEST_F(ProcessManagerTest, ExtensionNotificationRegistration) { // Test that extensions get grouped in the right SiteInstance (and therefore // process) based on their URLs. -TEST_F(ProcessManagerTest, ProcessGrouping) { +TEST_F(ExtensionProcessManagerTest, ProcessGrouping) { // Extensions in different profiles should always be different SiteInstances. // Note: we don't initialize these, since we're not testing that // functionality. This means we can get away with a NULL UserScriptMaster. TestingProfile profile1; - scoped_ptr<ProcessManager> manager1(ProcessManager::Create(&profile1)); + scoped_ptr<ExtensionProcessManager> manager1( + ExtensionProcessManager::Create(&profile1)); TestingProfile profile2; - scoped_ptr<ProcessManager> manager2(ProcessManager::Create(&profile2)); + scoped_ptr<ExtensionProcessManager> manager2( + ExtensionProcessManager::Create(&profile2)); // Extensions with common origins ("scheme://id/") should be grouped in the // same SiteInstance. @@ -139,5 +134,3 @@ TEST_F(ProcessManagerTest, ProcessGrouping) { manager2->GetSiteInstanceForURL(ext1_url1); EXPECT_NE(site11, other_profile_site); } - -} // namespace extensions diff --git a/chrome/browser/extensions/extension_service.cc b/chrome/browser/extensions/extension_service.cc index ec17272..60520c9 100644 --- a/chrome/browser/extensions/extension_service.cc +++ b/chrome/browser/extensions/extension_service.cc @@ -44,6 +44,7 @@ #include "chrome/browser/extensions/extension_error_ui.h" #include "chrome/browser/extensions/extension_host.h" #include "chrome/browser/extensions/extension_install_ui.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_sorting.h" #include "chrome/browser/extensions/extension_special_storage_policy.h" #include "chrome/browser/extensions/extension_sync_service.h" @@ -90,7 +91,6 @@ #include "content/public/browser/site_instance.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/url_data_source.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #include "extensions/common/error_utils.h" #include "extensions/common/extensions_client.h" @@ -690,7 +690,7 @@ void ExtensionService::ReloadExtension(const std::string extension_id) { // the inspector and hang onto a cookie for it, so that we can reattach // later. // TODO(yoz): this is not incognito-safe! - extensions::ProcessManager* manager = system_->process_manager(); + ExtensionProcessManager* manager = system_->process_manager(); extensions::ExtensionHost* host = manager->GetBackgroundHostForExtension(extension_id); if (host && DevToolsAgentHost::HasFor(host->render_view_host())) { @@ -2652,7 +2652,7 @@ bool ExtensionService::ShouldEnableOnInstall(const Extension* extension) { } bool ExtensionService::IsExtensionIdle(const std::string& extension_id) const { - extensions::ProcessManager* process_manager = system_->process_manager(); + ExtensionProcessManager* process_manager = system_->process_manager(); DCHECK(process_manager); extensions::ExtensionHost* host = process_manager->GetBackgroundHostForExtension(extension_id); diff --git a/chrome/browser/extensions/extension_service.h b/chrome/browser/extensions/extension_service.h index 1d07aee..b6c03a5 100644 --- a/chrome/browser/extensions/extension_service.h +++ b/chrome/browser/extensions/extension_service.h @@ -22,6 +22,7 @@ #include "chrome/browser/extensions/extension_function_histogram_value.h" #include "chrome/browser/extensions/extension_icon_manager.h" #include "chrome/browser/extensions/extension_prefs.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_sync_service.h" #include "chrome/browser/extensions/extensions_quota_service.h" #include "chrome/browser/extensions/external_provider_interface.h" @@ -38,7 +39,6 @@ #include "content/public/browser/devtools_agent_host.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/manifest.h" #include "extensions/common/one_shot_event.h" diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc index e4258f7..ce4aded 100644 --- a/chrome/browser/extensions/extension_service_unittest.cc +++ b/chrome/browser/extensions/extension_service_unittest.cc @@ -573,10 +573,10 @@ void ExtensionServiceTestBase::InitializeEmptyExtensionService() { InitializeExtensionService(CreateDefaultInitParams()); } -void ExtensionServiceTestBase::InitializeProcessManager() { +void ExtensionServiceTestBase::InitializeExtensionProcessManager() { static_cast<extensions::TestExtensionSystem*>( ExtensionSystem::Get(profile_.get()))-> - CreateProcessManager(); + CreateExtensionProcessManager(); } void ExtensionServiceTestBase::InitializeExtensionServiceWithUpdater() { @@ -3031,7 +3031,7 @@ TEST_F(ExtensionServiceTest, LoadExtensionsWithPlugins) { InitPluginService(); InitializeEmptyExtensionService(); - InitializeProcessManager(); + InitializeExtensionProcessManager(); service_->set_show_extensions_prompts(true); // Start by canceling any install prompts. @@ -3986,7 +3986,7 @@ TEST_F(ExtensionServiceTest, ReloadExtensions) { // Tests reloading an extension. TEST_F(ExtensionServiceTest, ReloadExtension) { InitializeEmptyExtensionService(); - InitializeProcessManager(); + InitializeExtensionProcessManager(); // Simple extension that should install without error. const char* extension_id = "behllobkkfkfnphdnhnkndlbkcpglgmj"; @@ -5440,7 +5440,7 @@ TEST_F(ExtensionServiceTest, GetSyncDataFilter) { TEST_F(ExtensionServiceTest, GetSyncExtensionDataUserSettings) { InitializeEmptyExtensionService(); - InitializeProcessManager(); + InitializeExtensionProcessManager(); InitializeExtensionSyncService(); InstallCRX(data_dir_.AppendASCII("good.crx"), INSTALL_NEW); const Extension* extension = service_->GetInstalledExtension(good_crx); @@ -5740,7 +5740,7 @@ TEST_F(ExtensionServiceTest, ProcessSyncDataWrongType) { TEST_F(ExtensionServiceTest, ProcessSyncDataSettings) { InitializeEmptyExtensionService(); - InitializeProcessManager(); + InitializeExtensionProcessManager(); InitializeExtensionSyncService(); TestSyncProcessorStub processor; extension_sync_service_->MergeDataAndStartSyncing( diff --git a/chrome/browser/extensions/extension_service_unittest.h b/chrome/browser/extensions/extension_service_unittest.h index 44a1d43..f58bdc4 100644 --- a/chrome/browser/extensions/extension_service_unittest.h +++ b/chrome/browser/extensions/extension_service_unittest.h @@ -54,7 +54,7 @@ class ExtensionServiceTestBase : public testing::Test { void InitializeEmptyExtensionService(); - void InitializeProcessManager(); + void InitializeExtensionProcessManager(); void InitializeExtensionServiceWithUpdater(); diff --git a/chrome/browser/extensions/extension_system.cc b/chrome/browser/extensions/extension_system.cc index f5a4ae5..b7099d2 100644 --- a/chrome/browser/extensions/extension_system.cc +++ b/chrome/browser/extensions/extension_system.cc @@ -21,6 +21,7 @@ #include "chrome/browser/extensions/extension_pref_value_map.h" #include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_prefs.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system_factory.h" #include "chrome/browser/extensions/extension_util.h" @@ -42,7 +43,6 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/url_data_source.h" #include "extensions/browser/lazy_background_task_queue.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #include "extensions/common/manifest.h" @@ -307,7 +307,7 @@ ExtensionSystemImpl::ExtensionSystemImpl(Profile* profile) shared_ = ExtensionSystemSharedFactory::GetForProfile(profile); if (profile->IsOffTheRecord()) { - process_manager_.reset(ProcessManager::Create(profile)); + extension_process_manager_.reset(ExtensionProcessManager::Create(profile)); } else { shared_->InitPrefs(); } @@ -317,7 +317,7 @@ ExtensionSystemImpl::~ExtensionSystemImpl() { } void ExtensionSystemImpl::Shutdown() { - process_manager_.reset(); + extension_process_manager_.reset(); } void ExtensionSystemImpl::InitForRegularProfile( @@ -327,12 +327,13 @@ void ExtensionSystemImpl::InitForRegularProfile( if (user_script_master() || extension_service()) return; // Already initialized. - // The ExtensionInfoMap needs to be created before the ProcessManager. + // The ExtensionInfoMap needs to be created before the + // ExtensionProcessManager. shared_->info_map(); - process_manager_.reset(ProcessManager::Create(profile_)); + extension_process_manager_.reset(ExtensionProcessManager::Create(profile_)); - process_manager_->DeferBackgroundHostCreation( + extension_process_manager_->DeferBackgroundHostCreation( defer_background_creation); shared_->Init(extensions_enabled); @@ -350,8 +351,8 @@ UserScriptMaster* ExtensionSystemImpl::user_script_master() { return shared_->user_script_master(); } -ProcessManager* ExtensionSystemImpl::process_manager() { - return process_manager_.get(); +ExtensionProcessManager* ExtensionSystemImpl::process_manager() { + return extension_process_manager_.get(); } StateStore* ExtensionSystemImpl::state_store() { diff --git a/chrome/browser/extensions/extension_system.h b/chrome/browser/extensions/extension_system.h index 93be7be..663c176 100644 --- a/chrome/browser/extensions/extension_system.h +++ b/chrome/browser/extensions/extension_system.h @@ -14,6 +14,7 @@ #include "extensions/common/one_shot_event.h" class ExtensionInfoMap; +class ExtensionProcessManager; class ExtensionService; class Profile; @@ -38,7 +39,6 @@ class ExtensionWarningService; class LazyBackgroundTaskQueue; class ManagementPolicy; class NavigationObserver; -class ProcessManager; class StandardManagementPolicyProvider; class StateStore; class UserScriptMaster; @@ -68,8 +68,8 @@ class ExtensionSystem : public BrowserContextKeyedService { // Component extensions are always enabled, external and user extensions // are controlled by |extensions_enabled|. If |defer_background_creation| is // true, then creation of background extension RenderViews will be deferred - // until extensions::ProcessManager::DeferBackgroundHostCreation is called - // with |defer| set to false. + // until ExtensionProcessManager::DeferBackgroundHostCreation is called with + // |defer| set to false. virtual void InitForRegularProfile(bool extensions_enabled, bool defer_background_creation) = 0; @@ -84,8 +84,8 @@ class ExtensionSystem : public BrowserContextKeyedService { // The UserScriptMaster is created at startup. virtual UserScriptMaster* user_script_master() = 0; - // The ProcessManager is created at startup. - virtual ProcessManager* process_manager() = 0; + // The ExtensionProcessManager is created at startup. + virtual ExtensionProcessManager* process_manager() = 0; // The StateStore is created at startup. virtual StateStore* state_store() = 0; @@ -149,7 +149,7 @@ class ExtensionSystemImpl : public ExtensionSystem { virtual ExtensionService* extension_service() OVERRIDE; // shared virtual ManagementPolicy* management_policy() OVERRIDE; // shared virtual UserScriptMaster* user_script_master() OVERRIDE; // shared - virtual ProcessManager* process_manager() OVERRIDE; + virtual ExtensionProcessManager* process_manager() OVERRIDE; virtual StateStore* state_store() OVERRIDE; // shared virtual StateStore* rules_store() OVERRIDE; // shared virtual LazyBackgroundTaskQueue* lazy_background_task_queue() @@ -221,7 +221,7 @@ class ExtensionSystemImpl : public ExtensionSystem { // ExtensionService depends on StateStore and Blacklist. scoped_ptr<ExtensionService> extension_service_; scoped_ptr<ManagementPolicy> management_policy_; - // extension_info_map_ needs to outlive process_manager_. + // extension_info_map_ needs to outlive extension_process_manager_. scoped_refptr<ExtensionInfoMap> extension_info_map_; scoped_ptr<ExtensionWarningService> extension_warning_service_; scoped_ptr<ExtensionWarningBadgeService> extension_warning_badge_service_; @@ -239,11 +239,11 @@ class ExtensionSystemImpl : public ExtensionSystem { Shared* shared_; - // |process_manager_| must be destroyed before the Profile's |io_data_|. While - // |process_manager_| still lives, we handle incoming resource requests from - // extension processes and those require access to the ResourceContext owned - // by |io_data_|. - scoped_ptr<ProcessManager> process_manager_; + // |extension_process_manager_| must be destroyed before the Profile's + // |io_data_|. While |extension_process_manager_| still lives, we handle + // incoming resource requests from extension processes and those require + // access to the ResourceContext owned by |io_data_|. + scoped_ptr<ExtensionProcessManager> extension_process_manager_; DISALLOW_COPY_AND_ASSIGN(ExtensionSystemImpl); }; diff --git a/chrome/browser/extensions/extension_test_notification_observer.cc b/chrome/browser/extensions/extension_test_notification_observer.cc index 77c140d..f8b7a6d 100644 --- a/chrome/browser/extensions/extension_test_notification_observer.cc +++ b/chrome/browser/extensions/extension_test_notification_observer.cc @@ -4,6 +4,7 @@ #include "chrome/browser/extensions/extension_test_notification_observer.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile_manager.h" @@ -14,7 +15,6 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/render_view_host.h" #include "content/public/test/test_utils.h" -#include "extensions/browser/process_manager.h" using extensions::Extension; @@ -99,10 +99,10 @@ bool ExtensionTestNotificationObserver::WaitForPageActionVisibilityChangeTo( } bool ExtensionTestNotificationObserver::WaitForExtensionViewsToLoad() { - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(GetProfile())->process_manager(); - extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); - for (extensions::ProcessManager::ViewSet::const_iterator iter = + ExtensionProcessManager::ViewSet all_views = manager->GetAllViews(); + for (ExtensionProcessManager::ViewSet::const_iterator iter = all_views.begin(); iter != all_views.end();) { if (!(*iter)->IsLoading()) { diff --git a/chrome/browser/extensions/gpu_browsertest.cc b/chrome/browser/extensions/gpu_browsertest.cc index b22722a..ff34a35 100644 --- a/chrome/browser/extensions/gpu_browsertest.cc +++ b/chrome/browser/extensions/gpu_browsertest.cc @@ -8,10 +8,10 @@ #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/ui/browser.h" #include "content/public/browser/render_view_host.h" -#include "extensions/browser/process_manager.h" #include "webkit/common/webpreferences.h" // Tests that GPU acceleration is disabled for extension background @@ -22,7 +22,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionBrowserTest, WebKitPrefsBackgroundPage) { .AppendASCII("behllobkkfkfnphdnhnkndlbkcpglgmj") .AppendASCII("1.0.0.0"))); - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); extensions::ExtensionHost* host = FindHostWithPath(manager, "/backgroundpage.html", 1); diff --git a/chrome/browser/extensions/gtalk_extension_browsertest.cc b/chrome/browser/extensions/gtalk_extension_browsertest.cc index b2c720f..694765d 100644 --- a/chrome/browser/extensions/gtalk_extension_browsertest.cc +++ b/chrome/browser/extensions/gtalk_extension_browsertest.cc @@ -7,6 +7,7 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" @@ -17,7 +18,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test_utils.h" -#include "extensions/browser/process_manager.h" using content::RenderViewHost; using content::WebContents; @@ -25,7 +25,7 @@ using extensions::Extension; class GtalkExtensionTest : public ExtensionBrowserTest { protected: - extensions::ProcessManager* GetProcessManager() { + ExtensionProcessManager* GetExtensionProcessManager() { return extensions::ExtensionSystem::Get(browser()->profile())-> process_manager(); } @@ -54,10 +54,10 @@ class GtalkExtensionTest : public ExtensionBrowserTest { } std::vector<RenderViewHost*> GetMatchingViews(std::string url_query) { - extensions::ProcessManager* manager = GetProcessManager(); - extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); + ExtensionProcessManager* manager = GetExtensionProcessManager(); + ExtensionProcessManager::ViewSet all_views = manager->GetAllViews(); std::vector<RenderViewHost*> matching_views; - for (extensions::ProcessManager::ViewSet::const_iterator iter = + for (ExtensionProcessManager::ViewSet::const_iterator iter = all_views.begin(); iter != all_views.end(); ++iter) { WebContents* web_contents = WebContents::FromRenderViewHost(*iter); std::string url = web_contents->GetURL().spec(); diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc index f526a74..bb99cf1 100644 --- a/chrome/browser/extensions/lazy_background_page_apitest.cc +++ b/chrome/browser/extensions/lazy_background_page_apitest.cc @@ -104,7 +104,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BrowserActionCreateTab) { ASSERT_TRUE(LoadExtensionAndWait("browser_action_create_tab")); // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); int num_tabs_before = browser()->tab_strip_model()->count(); @@ -128,7 +128,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, ASSERT_TRUE(LoadExtensionAndWait("browser_action_with_callback")); // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); int num_tabs_before = browser()->tab_strip_model()->count(); @@ -151,7 +151,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, BroadcastEvent) { ASSERT_TRUE(extension); // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); int num_page_actions = browser()->window()->GetLocationBar()-> @@ -182,7 +182,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Filters) { ASSERT_TRUE(extension); // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); @@ -201,7 +201,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnInstalled) { EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); // Lazy Background Page has been shut down. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); } @@ -224,7 +224,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForView) { // Lazy Background Page still exists, because the extension created a new tab // to an extension page. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); @@ -252,7 +252,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, WaitForRequest) { EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); // Lazy Background Page still exists, because the extension started a request. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); extensions::ExtensionHost* host = pm->GetBackgroundHostForExtension(last_loaded_extension_id()); @@ -293,7 +293,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, MAYBE_WaitForNTP) { // Lazy Background Page still exists, because the extension created a new tab // to an extension page. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); @@ -329,9 +329,9 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, MAYBE_IncognitoSplitMode) { } // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); - extensions::ProcessManager* pmi = + ExtensionProcessManager* pmi = extensions::ExtensionSystem::Get(incognito_browser->profile())-> process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); @@ -388,7 +388,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, Messaging) { ASSERT_TRUE(LoadExtensionAndWait("messaging")); // Lazy Background Page doesn't exist yet. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); EXPECT_EQ(1, browser()->tab_strip_model()->count()); @@ -420,7 +420,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, OnUnload) { ASSERT_TRUE(LoadExtensionAndWait("on_unload")); // Lazy Background Page has been shut down. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); @@ -483,7 +483,7 @@ IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, UpdateExtensionsPage) { // Lazy Background Page still exists, because the extension created a new tab // to an extension page. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); EXPECT_TRUE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); diff --git a/chrome/browser/extensions/notifications_apitest.cc b/chrome/browser/extensions/notifications_apitest.cc index b86ffd0..dab664a 100644 --- a/chrome/browser/extensions/notifications_apitest.cc +++ b/chrome/browser/extensions/notifications_apitest.cc @@ -4,13 +4,13 @@ #include "chrome/browser/extensions/extension_apitest.h" -#include "chrome/browser/extensions/lazy_background_page_test_util.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/desktop_notification_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" +#include "chrome/browser/extensions/extension_process_manager.h" +#include "chrome/browser/extensions/lazy_background_page_test_util.h" #include "chrome/common/extensions/extension.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/switches.h" #include "ui/message_center/message_center_switches.h" #include "ui/message_center/message_center_util.h" @@ -77,7 +77,7 @@ IN_PROC_BROWSER_TEST_F(NotificationIdleTest, MAYBE_NotificationsAllowUnload) { ASSERT_TRUE(extension) << message_; // Lazy Background Page has been shut down. - extensions::ProcessManager* pm = + ExtensionProcessManager* pm = extensions::ExtensionSystem::Get(profile())->process_manager(); EXPECT_FALSE(pm->GetBackgroundHostForExtension(last_loaded_extension_id())); } diff --git a/chrome/browser/extensions/process_management_browsertest.cc b/chrome/browser/extensions/process_management_browsertest.cc index de2e749..e607d26 100644 --- a/chrome/browser/extensions/process_management_browsertest.cc +++ b/chrome/browser/extensions/process_management_browsertest.cc @@ -5,6 +5,7 @@ #include "base/strings/utf_string_conversions.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" @@ -17,7 +18,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/switches.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -140,7 +140,7 @@ IN_PROC_BROWSER_TEST_F(ProcessManagementTest, MAYBE_ProcessOverflow) { browser()->tab_strip_model()->GetWebContentsAt(8)->GetRenderProcessHost(); // Get extension processes. - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(browser()->profile())-> process_manager(); content::RenderProcessHost* extension1_host = @@ -232,9 +232,9 @@ IN_PROC_BROWSER_TEST_F(ProcessManagementTest, MAYBE_ExtensionProcessBalancing) { std::set<int> process_ids; Profile* profile = browser()->profile(); - extensions::ProcessManager* epm = extensions::ExtensionSystem::Get(profile)-> + ExtensionProcessManager* epm = extensions::ExtensionSystem::Get(profile)-> process_manager(); - for (extensions::ProcessManager::const_iterator iter = + for (ExtensionProcessManager::const_iterator iter = epm->background_hosts().begin(); iter != epm->background_hosts().end(); ++iter) { process_ids.insert((*iter)->render_process_host()->GetID()); diff --git a/chrome/browser/extensions/process_map.h b/chrome/browser/extensions/process_map.h index 440e7a9..73439ad 100644 --- a/chrome/browser/extensions/process_map.h +++ b/chrome/browser/extensions/process_map.h @@ -53,7 +53,7 @@ namespace extensions { // extensions (not hosted apps), and you are on the UI thread, and you don't // care about incognito version of this extension (or vice versa if you're in // an incognito profile) then use -// extensions::ProcessManager::GetSiteInstanceForURL()->[Has|Get]Process(). +// ExtensionProcessManager::GetSiteInstanceForURL()->[Has|Get]Process(). // // 3. The process ids contained in this class are *not limited* to the Profile // you got this map from. They can also be associated with that profile's diff --git a/chrome/browser/extensions/suggest_permission_util.cc b/chrome/browser/extensions/suggest_permission_util.cc index 7eb1e10..cd9e1db 100644 --- a/chrome/browser/extensions/suggest_permission_util.cc +++ b/chrome/browser/extensions/suggest_permission_util.cc @@ -4,12 +4,12 @@ #include "chrome/browser/extensions/suggest_permission_util.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/common/extensions/extension.h" #include "chrome/common/extensions/extension_messages.h" #include "content/public/browser/render_view_host.h" #include "content/public/common/console_message_level.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/permissions/permissions_info.h" using content::CONSOLE_MESSAGE_LEVEL_WARNING; @@ -47,7 +47,7 @@ void SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission, void SuggestAPIPermissionInDevToolsConsole(APIPermission::ID permission, const Extension* extension, Profile* profile) { - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profile)->process_manager(); std::set<content::RenderViewHost*> views = diff --git a/chrome/browser/extensions/test_extension_system.cc b/chrome/browser/extensions/test_extension_system.cc index e6d448d..a628a9f 100644 --- a/chrome/browser/extensions/test_extension_system.cc +++ b/chrome/browser/extensions/test_extension_system.cc @@ -14,6 +14,7 @@ #include "chrome/browser/extensions/extension_pref_value_map_factory.h" #include "chrome/browser/extensions/extension_prefs.h" #include "chrome/browser/extensions/extension_prefs_factory.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/management_policy.h" @@ -24,7 +25,6 @@ #include "chrome/browser/value_store/testing_value_store.h" #include "chrome/common/chrome_switches.h" #include "content/public/browser/browser_thread.h" -#include "extensions/browser/process_manager.h" using content::BrowserThread; @@ -41,15 +41,16 @@ TestExtensionSystem::~TestExtensionSystem() { } void TestExtensionSystem::Shutdown() { - process_manager_.reset(); + extension_process_manager_.reset(); } -void TestExtensionSystem::CreateProcessManager() { - process_manager_.reset(ProcessManager::Create(profile_)); +void TestExtensionSystem::CreateExtensionProcessManager() { + extension_process_manager_.reset(ExtensionProcessManager::Create(profile_)); } -void TestExtensionSystem::SetProcessManager(ProcessManager* manager) { - process_manager_.reset(manager); +void TestExtensionSystem::SetExtensionProcessManager( + ExtensionProcessManager* manager) { + extension_process_manager_.reset(manager); } ExtensionPrefs* TestExtensionSystem::CreateExtensionPrefs( @@ -120,8 +121,8 @@ UserScriptMaster* TestExtensionSystem::user_script_master() { return NULL; } -ProcessManager* TestExtensionSystem::process_manager() { - return process_manager_.get(); +ExtensionProcessManager* TestExtensionSystem::process_manager() { + return extension_process_manager_.get(); } StateStore* TestExtensionSystem::state_store() { diff --git a/chrome/browser/extensions/test_extension_system.h b/chrome/browser/extensions/test_extension_system.h index 7c5cc9a..cab117b 100644 --- a/chrome/browser/extensions/test_extension_system.h +++ b/chrome/browser/extensions/test_extension_system.h @@ -44,12 +44,13 @@ class TestExtensionSystem : public ExtensionSystem { const base::FilePath& install_directory, bool autoupdate_enabled); - // Creates a ProcessManager. If not invoked, the ProcessManager is NULL. - void CreateProcessManager(); + // Creates an ExtensionProcessManager. If not invoked, the + // ExtensionProcessManager is NULL. + void CreateExtensionProcessManager(); - // Allows the ProcessManager to be overriden, for example by a stub - // implementation. Takes ownership of |manager|. - void SetProcessManager(ProcessManager* manager); + // Allows the ExtensionProcessManager to be overriden, for example by a + // stub implementation. Takes ownership of |manager|. + void SetExtensionProcessManager(ExtensionProcessManager* manager); void CreateSocketManager(); @@ -59,7 +60,7 @@ class TestExtensionSystem : public ExtensionSystem { virtual ExtensionService* extension_service() OVERRIDE; virtual ManagementPolicy* management_policy() OVERRIDE; virtual UserScriptMaster* user_script_master() OVERRIDE; - virtual ProcessManager* process_manager() OVERRIDE; + virtual ExtensionProcessManager* process_manager() OVERRIDE; virtual StateStore* state_store() OVERRIDE; virtual StateStore* rules_store() OVERRIDE; TestingValueStore* value_store() { return value_store_; } @@ -91,7 +92,7 @@ class TestExtensionSystem : public ExtensionSystem { standard_management_policy_provider_; scoped_ptr<ManagementPolicy> management_policy_; scoped_ptr<ExtensionService> extension_service_; - scoped_ptr<ProcessManager> process_manager_; + scoped_ptr<ExtensionProcessManager> extension_process_manager_; scoped_refptr<ExtensionInfoMap> info_map_; scoped_ptr<ErrorConsole> error_console_; OneShotEvent ready_; diff --git a/chrome/browser/extensions/window_open_apitest.cc b/chrome/browser/extensions/window_open_apitest.cc index 81a9c3f..5cee30e 100644 --- a/chrome/browser/extensions/window_open_apitest.cc +++ b/chrome/browser/extensions/window_open_apitest.cc @@ -8,6 +8,7 @@ #include "base/strings/stringprintf.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/extension_test_message_listener.h" #include "chrome/browser/profiles/profile.h" @@ -25,7 +26,6 @@ #include "content/public/browser/web_contents.h" #include "content/public/common/result_codes.h" #include "content/public/test/browser_test_utils.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/switches.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc index 7c6780c..4002c20 100644 --- a/chrome/browser/memory_details.cc +++ b/chrome/browser/memory_details.cc @@ -10,6 +10,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/extensions/extension.h" @@ -25,7 +26,6 @@ #include "content/public/browser/render_widget_host_iterator.h" #include "content/public/browser/web_contents.h" #include "content/public/common/bindings_policy.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc index b5dc439..ffb7959 100644 --- a/chrome/browser/net/chrome_network_delegate.cc +++ b/chrome/browser/net/chrome_network_delegate.cc @@ -26,6 +26,7 @@ #include "chrome/browser/extensions/api/web_request/web_request_api.h" #include "chrome/browser/extensions/event_router_forwarder.h" #include "chrome/browser/extensions/extension_info_map.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/google/google_util.h" #include "chrome/browser/net/chrome_network_data_saving_metrics.h" @@ -40,7 +41,6 @@ #include "content/public/browser/browser_thread.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/resource_request_info.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #include "net/base/host_port_pair.h" #include "net/base/net_errors.h" @@ -169,7 +169,7 @@ void ForceGoogleSafeSearchCallbackWrapper( enum RequestStatus { REQUEST_STARTED, REQUEST_DONE }; -// Notifies the extensions::ProcessManager that a request has started or stopped +// Notifies the ExtensionProcessManager that a request has started or stopped // for a particular RenderView. void NotifyEPMRequestStatus(RequestStatus status, void* profile_id, @@ -180,10 +180,10 @@ void NotifyEPMRequestStatus(RequestStatus status, if (!g_browser_process->profile_manager()->IsValidProfile(profile)) return; - extensions::ProcessManager* process_manager = + ExtensionProcessManager* extension_process_manager = extensions::ExtensionSystem::Get(profile)->process_manager(); // This may be NULL in unit tests. - if (!process_manager) + if (!extension_process_manager) return; // Will be NULL if the request was not issued on behalf of a renderer (e.g. a @@ -192,9 +192,9 @@ void NotifyEPMRequestStatus(RequestStatus status, RenderViewHost::FromID(process_id, render_view_id); if (render_view_host) { if (status == REQUEST_STARTED) { - process_manager->OnNetworkRequestStarted(render_view_host); + extension_process_manager->OnNetworkRequestStarted(render_view_host); } else if (status == REQUEST_DONE) { - process_manager->OnNetworkRequestDone(render_view_host); + extension_process_manager->OnNetworkRequestDone(render_view_host); } else { NOTREACHED(); } diff --git a/chrome/browser/policy/policy_browsertest.cc b/chrome/browser/policy/policy_browsertest.cc index 89088f1a..85d113b 100644 --- a/chrome/browser/policy/policy_browsertest.cc +++ b/chrome/browser/policy/policy_browsertest.cc @@ -35,6 +35,7 @@ #include "chrome/browser/download/download_prefs.h" #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/extensions/unpacked_installer.h" @@ -113,7 +114,6 @@ #include "content/public/test/test_utils.h" #include "content/test/net/url_request_failed_job.h" #include "content/test/net/url_request_mock_http_job.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #include "grit/generated_resources.h" #include "net/base/net_errors.h" @@ -1555,10 +1555,10 @@ IN_PROC_BROWSER_TEST_F(PolicyTest, ExtensionInstallForcelist) { // Wait until any background pages belonging to force-installed extensions // have been loaded. - extensions::ProcessManager* manager = + ExtensionProcessManager* manager = extensions::ExtensionSystem::Get(browser()->profile())->process_manager(); - extensions::ProcessManager::ViewSet all_views = manager->GetAllViews(); - for (extensions::ProcessManager::ViewSet::const_iterator iter = + ExtensionProcessManager::ViewSet all_views = manager->GetAllViews(); + for (ExtensionProcessManager::ViewSet::const_iterator iter = all_views.begin(); iter != all_views.end();) { if (!(*iter)->IsLoading()) { diff --git a/chrome/browser/renderer_host/chrome_render_message_filter.cc b/chrome/browser/renderer_host/chrome_render_message_filter.cc index da6dbba..37c7f14 100644 --- a/chrome/browser/renderer_host/chrome_render_message_filter.cc +++ b/chrome/browser/renderer_host/chrome_render_message_filter.cc @@ -23,6 +23,7 @@ #include "chrome/browser/extensions/api/activity_log_private/activity_log_private_api.h" #include "chrome/browser/extensions/api/messaging/message_service.h" #include "chrome/browser/extensions/event_router.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/google/google_util.h" #include "chrome/browser/net/chrome_url_request_context.h" @@ -38,7 +39,6 @@ #include "content/public/browser/notification_service.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/resource_dispatcher_host.h" -#include "extensions/browser/process_manager.h" #include "extensions/common/constants.h" #if defined(USE_TCMALLOC) diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc index 58e267f..f6c7bce 100644 --- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc @@ -10,6 +10,7 @@ #include "base/values.h" #include "chrome/browser/extensions/event_router.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" @@ -22,7 +23,6 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/common/console_message_level.h" -#include "extensions/browser/process_manager.h" #include "net/base/network_change_notifier.h" using extensions::EventRouter; @@ -48,7 +48,7 @@ void WarnIfMissingPauseOrResumeListener( if (has_onpause == has_onresume) return; - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = ExtensionSystem::Get(profile)->process_manager(); extensions::ExtensionHost* host = process_manager->GetBackgroundHostForExtension(extension_id); diff --git a/chrome/browser/task_manager/extension_process_resource_provider.cc b/chrome/browser/task_manager/extension_process_resource_provider.cc index 4a0ab96..121ae0f 100644 --- a/chrome/browser/task_manager/extension_process_resource_provider.cc +++ b/chrome/browser/task_manager/extension_process_resource_provider.cc @@ -10,6 +10,7 @@ #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/devtools/devtools_window.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" @@ -23,7 +24,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/site_instance.h" #include "content/public/browser/web_contents.h" -#include "extensions/browser/process_manager.h" #include "extensions/browser/view_type_utils.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" @@ -150,7 +150,7 @@ void ExtensionProcessResource::SetSupportNetworkUsage() { const Extension* ExtensionProcessResource::GetExtension() const { Profile* profile = Profile::FromBrowserContext( render_view_host_->GetProcess()->GetBrowserContext()); - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profile)->process_manager(); return process_manager->GetExtensionForRenderViewHost(render_view_host_); } @@ -213,13 +213,12 @@ void ExtensionProcessResourceProvider::StartUpdating() { } for (size_t i = 0; i < profiles.size(); ++i) { - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profiles[i])->process_manager(); if (process_manager) { - const extensions::ProcessManager::ViewSet all_views = + const ExtensionProcessManager::ViewSet all_views = process_manager->GetAllViews(); - extensions::ProcessManager::ViewSet::const_iterator jt = - all_views.begin(); + ExtensionProcessManager::ViewSet::const_iterator jt = all_views.begin(); for (; jt != all_views.end(); ++jt) { content::RenderViewHost* rvh = *jt; // Don't add dead extension processes. diff --git a/chrome/browser/task_manager/task_manager.cc b/chrome/browser/task_manager/task_manager.cc index b10876e..ca2f8b5 100644 --- a/chrome/browser/task_manager/task_manager.cc +++ b/chrome/browser/task_manager/task_manager.cc @@ -16,6 +16,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/task_manager/background_resource_provider.h" diff --git a/chrome/browser/translate/translate_manager_browsertest.cc b/chrome/browser/translate/translate_manager_browsertest.cc index afffdda..6317ad5 100644 --- a/chrome/browser/translate/translate_manager_browsertest.cc +++ b/chrome/browser/translate/translate_manager_browsertest.cc @@ -1331,7 +1331,7 @@ TEST_F(TranslateManagerBrowserTest, BeforeTranslateExtraButtons) { static_cast<TestingProfile*>(web_contents()->GetBrowserContext()); static_cast<extensions::TestExtensionSystem*>( extensions::ExtensionSystem::Get(test_profile))-> - CreateProcessManager(); + CreateExtensionProcessManager(); test_profile->ForceIncognito(true); for (int i = 0; i < 8; ++i) { SCOPED_TRACE(::testing::Message() << "Iteration " << i << diff --git a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc index 16415f7..5fa4264 100644 --- a/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc +++ b/chrome/browser/ui/ash/launcher/app_shortcut_launcher_item_controller.cc @@ -8,6 +8,7 @@ #include "ash/launcher/launcher_model.h" #include "ash/shell.h" #include "ash/wm/window_util.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/extensions/extension_system.h" #include "chrome/browser/favicon/favicon_tab_helper.h" #include "chrome/browser/ui/ash/launcher/chrome_launcher_app_menu_item.h" @@ -24,7 +25,6 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/extensions/manifest_handlers/app_launch_info.h" #include "content/public/browser/web_contents.h" -#include "extensions/browser/process_manager.h" #include "ui/aura/window.h" #include "ui/events/event.h" #include "ui/views/corewm/window_animations.h" diff --git a/chrome/browser/ui/gtk/notifications/balloon_view_gtk.cc b/chrome/browser/ui/gtk/notifications/balloon_view_gtk.cc index 4457382..c74bef7 100644 --- a/chrome/browser/ui/gtk/notifications/balloon_view_gtk.cc +++ b/chrome/browser/ui/gtk/notifications/balloon_view_gtk.cc @@ -15,6 +15,7 @@ #include "base/strings/string_util.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/extensions/extension_host.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/notification.h" @@ -34,7 +35,6 @@ #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/browser/web_contents.h" -#include "extensions/browser/process_manager.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ui/base/gtk/gtk_hig_constants.h" diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc index 0d5b9a9..6761fcb 100644 --- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc +++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc @@ -418,7 +418,7 @@ bool StartupBrowserCreatorImpl::Launch(Profile* profile, #if defined(ENABLE_EXTENSIONS) // If we deferred creation of background extension hosts, we want to create // them now that the session (if any) has been restored. - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = extensions::ExtensionSystem::Get(profile)->process_manager(); process_manager->DeferBackgroundHostCreation(false); #endif diff --git a/chrome/browser/ui/views/select_file_dialog_extension.cc b/chrome/browser/ui/views/select_file_dialog_extension.cc index 67c0bfd..3257bab 100644 --- a/chrome/browser/ui/views/select_file_dialog_extension.cc +++ b/chrome/browser/ui/views/select_file_dialog_extension.cc @@ -163,8 +163,7 @@ void SelectFileDialogExtension::ExtensionTerminated( // reload the extension at all - when we try to open the extension the next // time, the extension subsystem would automatically reload it for us. At // this time though this is broken because of some faulty wiring in - // extensions::ProcessManager::CreateViewHost. Once that is fixed, remove - // this. + // ExtensionProcessManager::CreateViewHost. Once that is fixed, remove this. if (profile_) { base::MessageLoop::current()->PostTask( FROM_HERE, diff --git a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc index 9d4f05d..42a5684 100644 --- a/chrome/browser/ui/webui/extensions/extension_settings_handler.cc +++ b/chrome/browser/ui/webui/extensions/extension_settings_handler.cc @@ -1077,7 +1077,7 @@ ExtensionSettingsHandler::GetInspectablePagesForExtension( std::vector<ExtensionPage> result; // Get the extension process's active views. - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = ExtensionSystem::Get(extension_service_->profile())->process_manager(); GetInspectablePagesForExtensionProcess( extension, @@ -1104,7 +1104,7 @@ ExtensionSettingsHandler::GetInspectablePagesForExtension( // shell windows for incognito processes. if (extension_service_->profile()->HasOffTheRecordProfile() && IncognitoInfo::IsSplitMode(extension)) { - extensions::ProcessManager* process_manager = + ExtensionProcessManager* process_manager = ExtensionSystem::Get(extension_service_->profile()-> GetOffTheRecordProfile())->process_manager(); GetInspectablePagesForExtensionProcess( diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index a39a539..22596bf 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi @@ -727,6 +727,8 @@ 'browser/extensions/extension_prefs.h', 'browser/extensions/extension_prefs_factory.cc', 'browser/extensions/extension_prefs_factory.h', + 'browser/extensions/extension_process_manager.cc', + 'browser/extensions/extension_process_manager.h', 'browser/extensions/extension_protocols.cc', 'browser/extensions/extension_protocols.h', 'browser/extensions/extension_renderer_state.cc', diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index 03a8288..dbbedf75 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi @@ -1236,6 +1236,7 @@ 'browser/extensions/extension_loading_browsertest.cc', 'browser/extensions/extension_messages_apitest.cc', 'browser/extensions/extension_override_apitest.cc', + 'browser/extensions/extension_process_manager_browsertest.cc', 'browser/extensions/extension_resource_request_policy_apitest.cc', 'browser/extensions/extension_startup_browsertest.cc', 'browser/extensions/extension_storage_apitest.cc', @@ -1254,7 +1255,6 @@ 'browser/extensions/page_action_browsertest.cc', 'browser/extensions/plugin_apitest.cc', 'browser/extensions/process_management_browsertest.cc', - 'browser/extensions/process_manager_browsertest.cc', 'browser/extensions/requirements_checker_browsertest.cc', 'browser/extensions/sandboxed_pages_apitest.cc', 'browser/extensions/shared_module_apitest.cc', diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 6984399..30c8cfa 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi @@ -888,6 +888,7 @@ 'browser/extensions/extension_pref_value_map_unittest.cc', 'browser/extensions/extension_prefs_unittest.cc', 'browser/extensions/extension_prefs_unittest.h', + 'browser/extensions/extension_process_manager_unittest.cc', 'browser/extensions/extension_protocols_unittest.cc', 'browser/extensions/extension_service_unittest.cc', 'browser/extensions/extension_service_unittest.h', @@ -906,7 +907,6 @@ 'browser/extensions/pack_extension_unittest.cc', 'browser/extensions/page_action_controller_unittest.cc', 'browser/extensions/permissions_updater_unittest.cc', - 'browser/extensions/process_manager_unittest.cc', 'browser/extensions/process_map_unittest.cc', 'browser/extensions/sandboxed_unpacker_unittest.cc', 'browser/extensions/script_badge_controller_unittest.cc', diff --git a/chrome/test/data/extensions/api_test/media_galleries/common/common_injected.js b/chrome/test/data/extensions/api_test/media_galleries/common/common_injected.js index 43266d1..4362b37 100644 --- a/chrome/test/data/extensions/api_test/media_galleries/common/common_injected.js +++ b/chrome/test/data/extensions/api_test/media_galleries/common/common_injected.js @@ -163,8 +163,8 @@ function runReadGalleriesTest(expectedGalleryCount, expectSucceed, } } -// Create a dummy window to prevent the ProcessManager from suspending the -// chrome-test app. Needed because the writer.onerror and writer.onwriteend +// Create a dummy window to prevent the ExtensionProcessManager from suspending +// the chrome-test app. Needed because the writer.onerror and writer.onwriteend // events do not qualify as pending callbacks, so the app looks dormant. function CreateDummyWindowToPreventSleep() { chrome.app.runtime.onLaunched.addListener(function() { diff --git a/chrome/test/data/extensions/api_test/media_galleries/picasa/test.js b/chrome/test/data/extensions/api_test/media_galleries/picasa/test.js index 4a82827..cb6aaa4 100644 --- a/chrome/test/data/extensions/api_test/media_galleries/picasa/test.js +++ b/chrome/test/data/extensions/api_test/media_galleries/picasa/test.js @@ -216,8 +216,8 @@ chrome.test.runTests([ getTest(Folder2ListingTest), ]); -// Create a dummy window to prevent the ProcessManager from suspending the -// chrome-test app. Needed because the FileReader events do not qualify as +// Create a dummy window to prevent the ExtensionProcessManager from suspending +// the chrome-test app. Needed because the FileReader events do not qualify as // pending callbacks, so the app looks dormant. chrome.app.runtime.onLaunched.addListener(function() { chrome.app.window.create('dummy.html', { |