diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-05 21:16:52 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-05 21:16:52 +0000 |
commit | 718eab64b07e27c6e495878e3ab6e0f8ed21b6df (patch) | |
tree | 4047e56c4ecdd88eec53dc9fe5895b89b7caa2d9 /chrome/browser | |
parent | 0d54c2a4ed1c2ec19fdb0c98adb061cfeb618899 (diff) | |
download | chromium_src-718eab64b07e27c6e495878e3ab6e0f8ed21b6df.zip chromium_src-718eab64b07e27c6e495878e3ab6e0f8ed21b6df.tar.gz chromium_src-718eab64b07e27c6e495878e3ab6e0f8ed21b6df.tar.bz2 |
Remove RenderProcessHost::is_extension_process
Also move the --process=extension command line flag to --extension-process
BUG=89642
TEST=everything still works
Review URL: http://codereview.chromium.org/8113035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104173 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/chrome_content_browser_client.cc | 28 | ||||
-rw-r--r-- | chrome/browser/chrome_content_browser_client.h | 3 | ||||
-rw-r--r-- | chrome/browser/extensions/app_process_apitest.cc | 67 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_info_map.cc | 16 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_info_map.h | 11 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_process_manager.cc | 23 | ||||
-rw-r--r-- | chrome/browser/extensions/extension_process_manager.h | 5 | ||||
-rw-r--r-- | chrome/browser/memory_details.cc | 3 | ||||
-rw-r--r-- | chrome/browser/metrics/metrics_service.cc | 50 | ||||
-rw-r--r-- | chrome/browser/metrics/metrics_service.h | 9 | ||||
-rw-r--r-- | chrome/browser/renderer_host/chrome_render_view_host_observer.cc | 2 | ||||
-rw-r--r-- | chrome/browser/task_manager/task_manager_resource_providers.cc | 5 |
12 files changed, 143 insertions, 79 deletions
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index efec572..794dfa2 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -267,9 +267,7 @@ bool ChromeContentBrowserClient::IsSuitableHost( return true; bool is_extension_host = - process_host->is_extension_process() || - extension_process_manager->AreBindingsEnabledForProcess( - process_host->id()); + extension_process_manager->IsExtensionProcess(process_host->id()); return site_url.SchemeIs(chrome::kExtensionScheme) == is_extension_host; } @@ -298,8 +296,7 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( std::string process_type = command_line->GetSwitchValueASCII(switches::kProcessType); const CommandLine& browser_command_line = *CommandLine::ForCurrentProcess(); - if (process_type == switches::kExtensionProcess || - process_type == switches::kRendererProcess) { + if (process_type == switches::kRendererProcess) { FilePath user_data_dir = browser_command_line.GetSwitchValuePath(switches::kUserDataDir); if (!user_data_dir.empty()) @@ -314,6 +311,14 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( RenderProcessHost* process = RenderProcessHost::FromID(child_process_id); Profile* profile = Profile::FromBrowserContext(process->browser_context()); + + ExtensionProcessManager* extension_process_manager = + profile->GetExtensionProcessManager(); + if (extension_process_manager->IsExtensionProcess( + process->id())) { + command_line->AppendSwitch(switches::kExtensionProcess); + } + PrefService* prefs = profile->GetPrefs(); // Currently this pref is only registered if applied via a policy. if (prefs->HasPrefPath(prefs::kDisable3DAPIs) && @@ -797,16 +802,19 @@ FilePath ChromeContentBrowserClient::GetDefaultDownloadDirectory() { #if defined(OS_LINUX) int ChromeContentBrowserClient::GetCrashSignalFD( - const std::string& process_type) { - if (process_type == switches::kRendererProcess) - return RendererCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); - - if (process_type == switches::kExtensionProcess) { + const CommandLine& command_line) { + if (command_line.HasSwitch(switches::kExtensionProcess)) { ExtensionCrashHandlerHostLinux* crash_handler = ExtensionCrashHandlerHostLinux::GetInstance(); return crash_handler->GetDeathSignalSocket(); } + std::string process_type = + command_line.GetSwitchValueASCII(switches::kProcessType); + + if (process_type == switches::kRendererProcess) + return RendererCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); + if (process_type == switches::kPluginProcess) return PluginCrashHandlerHostLinux::GetInstance()->GetDeathSignalSocket(); diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index 1a9a97f..e08b1fb 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h @@ -121,8 +121,7 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { virtual FilePath GetDefaultDownloadDirectory() OVERRIDE; #if defined(OS_POSIX) && !defined(OS_MACOSX) - // Can return an optional fd for crash handling, otherwise returns -1. - virtual int GetCrashSignalFD(const std::string& process_type) OVERRIDE; + virtual int GetCrashSignalFD(const CommandLine& command_line) OVERRIDE; #endif #if defined(OS_WIN) virtual const wchar_t* GetResourceDllName() OVERRIDE; diff --git a/chrome/browser/extensions/app_process_apitest.cc b/chrome/browser/extensions/app_process_apitest.cc index 161155b..63d5812 100644 --- a/chrome/browser/extensions/app_process_apitest.cc +++ b/chrome/browser/extensions/app_process_apitest.cc @@ -88,6 +88,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcess) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisablePopupBlocking); + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -102,18 +105,18 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcess) { ui_test_utils::NavigateToURLWithDisposition( browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); - EXPECT_TRUE(browser()->GetTabContentsAt(1)->render_view_host()->process()-> - is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(1)->render_view_host()->process()->id())); EXPECT_FALSE(browser()->GetTabContentsAt(1)->web_ui()); browser()->NewTab(); ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html")); - EXPECT_TRUE(browser()->GetTabContentsAt(2)->render_view_host()->process()-> - is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(2)->render_view_host()->process()->id())); EXPECT_FALSE(browser()->GetTabContentsAt(2)->web_ui()); browser()->NewTab(); ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path3/empty.html")); - EXPECT_FALSE(browser()->GetTabContentsAt(3)->render_view_host()->process()-> - is_extension_process()); + EXPECT_FALSE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(3)->render_view_host()->process()->id())); EXPECT_FALSE(browser()->GetTabContentsAt(3)->web_ui()); // We should have opened 3 new extension tabs. Including the original blank @@ -182,6 +185,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessInstances) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisablePopupBlocking); + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -197,13 +203,13 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, MAYBE_AppProcessInstances) { ui_test_utils::NavigateToURLWithDisposition( browser(), base_url.Resolve("path1/empty.html"), NEW_FOREGROUND_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); - EXPECT_TRUE(browser()->GetTabContentsAt(1)->render_view_host()->process()-> - is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(1)->render_view_host()->process()->id())); EXPECT_FALSE(browser()->GetTabContentsAt(1)->web_ui()); browser()->NewTab(); ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path2/empty.html")); - EXPECT_TRUE(browser()->GetTabContentsAt(2)->render_view_host()->process()-> - is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(2)->render_view_host()->process()->id())); EXPECT_FALSE(browser()->GetTabContentsAt(2)->web_ui()); // We should have opened 2 new extension tabs. Including the original blank @@ -265,6 +271,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisablePopupBlocking); + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -275,19 +284,22 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { // Load an app URL before loading the app. ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); TabContents* contents = browser()->GetTabContentsAt(0); - EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_FALSE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); // Load app and reload page. const Extension* app = LoadExtension(test_data_dir_.AppendASCII("app_process")); ASSERT_TRUE(app); ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); - EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); // Disable app and reload page. DisableExtension(app->id()); ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); - EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_FALSE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); // Enable app and reload via JavaScript. EnableExtension(app->id()); @@ -296,7 +308,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(), L"", L"location.reload();")); observer.Wait(); - EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); // Disable app and reload via JavaScript. DisableExtension(app->id()); @@ -305,7 +318,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadIntoAppProcess) { ASSERT_TRUE(ui_test_utils::ExecuteJavaScript(contents->render_view_host(), L"", L"location.reload();")); observer2.Wait(); - EXPECT_FALSE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_FALSE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); } @@ -318,6 +332,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisablePopupBlocking); + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -333,8 +350,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) { CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION | ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); - EXPECT_FALSE(browser()->GetTabContentsAt(0)->render_view_host()->process()-> - is_extension_process()); + EXPECT_FALSE(extension_process_manager->IsExtensionProcess( + browser()->GetTabContentsAt(0)->render_view_host()->process()->id())); // Wait for popup window to appear. GURL app_url = base_url.Resolve("path1/empty.html"); @@ -348,8 +365,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenAppFromIframe) { ui_test_utils::WaitForNavigation(&newtab->controller()); // Popup window should be in the app's process. - EXPECT_TRUE(last_active_browser->GetTabContentsAt(0)->render_view_host()-> - process()->is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + last_active_browser->GetTabContentsAt(0)->render_view_host()->process()-> + id())); } // Tests that if we have an app process (path1/container.html) with a non-app @@ -363,6 +381,9 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) { CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisablePopupBlocking); + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -380,7 +401,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) { ui_test_utils::BROWSER_TEST_WAIT_FOR_BROWSER); RenderProcessHost* process = browser()->GetTabContentsAt(0)->render_view_host()->process(); - EXPECT_TRUE(process->is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + process->id())); // Wait for popup window to appear. The new Browser may not have been // added with SetLastActive, in which case we need to show it first. @@ -408,6 +430,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, OpenWebPopupFromWebIframe) { } IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadAppAfterCrash) { + ExtensionProcessManager* extension_process_manager = + browser()->profile()->GetExtensionProcessManager(); host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(test_server()->Start()); @@ -418,7 +442,8 @@ IN_PROC_BROWSER_TEST_F(AppApiTest, ReloadAppAfterCrash) { // Load the app, chrome.app.isInstalled should be true. ui_test_utils::NavigateToURL(browser(), base_url.Resolve("path1/empty.html")); TabContents* contents = browser()->GetTabContentsAt(0); - EXPECT_TRUE(contents->render_view_host()->process()->is_extension_process()); + EXPECT_TRUE(extension_process_manager->IsExtensionProcess( + contents->render_view_host()->process()->id())); bool is_installed = false; ASSERT_TRUE(ui_test_utils::ExecuteJavaScriptAndExtractBool( contents->render_view_host(), L"", diff --git a/chrome/browser/extensions/extension_info_map.cc b/chrome/browser/extensions/extension_info_map.cc index 6e9e4aa..21fd0dc 100644 --- a/chrome/browser/extensions/extension_info_map.cc +++ b/chrome/browser/extensions/extension_info_map.cc @@ -95,16 +95,18 @@ bool ExtensionInfoMap::CanCrossIncognito(const Extension* extension) { !extension->incognito_split_mode(); } -// These are duplicated from ExtensionProcessManager :(. -void ExtensionInfoMap::BindingsEnabledForProcess(int host_id) { - extension_bindings_process_ids_.insert(host_id); +// These are duplicated from ExtensionProcessManager so that we can have the +// information on the IO thread :(. +void ExtensionInfoMap::BindingsEnabledForProcess(int render_process_id) { + extension_bindings_process_ids_.insert(render_process_id); } -void ExtensionInfoMap::BindingsDisabledForProcess(int host_id) { - extension_bindings_process_ids_.erase(host_id); +void ExtensionInfoMap::BindingsDisabledForProcess(int render_process_id) { + extension_bindings_process_ids_.erase(render_process_id); } -bool ExtensionInfoMap::AreBindingsEnabledForProcess(int host_id) const { - return extension_bindings_process_ids_.find(host_id) != +bool ExtensionInfoMap::AreBindingsEnabledForProcess( + int render_process_id) const { + return extension_bindings_process_ids_.find(render_process_id) != extension_bindings_process_ids_.end(); } diff --git a/chrome/browser/extensions/extension_info_map.h b/chrome/browser/extensions/extension_info_map.h index 2736165..25cd3b1d 100644 --- a/chrome/browser/extensions/extension_info_map.h +++ b/chrome/browser/extensions/extension_info_map.h @@ -50,14 +50,15 @@ class ExtensionInfoMap : public base::RefCountedThreadSafe<ExtensionInfoMap> { // sub-profile (incognito to original profile, or vice versa). bool CanCrossIncognito(const Extension* extension); - // Registers a RenderProcessHost with |host_id| as hosting an extension. - void BindingsEnabledForProcess(int host_id); + // Registers a RenderProcessHost with |render_process_id| as hosting an + // extension. + void BindingsEnabledForProcess(int render_process_id); - // Unregisters the RenderProcessHost with |host_id|. - void BindingsDisabledForProcess(int host_id); + // Unregisters the RenderProcessHost with |render_process_id|. + void BindingsDisabledForProcess(int render_process_id); // True if this process host is hosting an extension. - bool AreBindingsEnabledForProcess(int host_id) const; + bool AreBindingsEnabledForProcess(int render_process_id) const; private: // Extra dynamic data related to an extension. diff --git a/chrome/browser/extensions/extension_process_manager.cc b/chrome/browser/extensions/extension_process_manager.cc index f31ac69..600eeeb 100644 --- a/chrome/browser/extensions/extension_process_manager.cc +++ b/chrome/browser/extensions/extension_process_manager.cc @@ -239,8 +239,8 @@ void ExtensionProcessManager::RegisterExtensionSiteInstance( } int site_instance_id = site_instance->id(); - int host_id = site_instance->GetProcess()->id(); - process_ids_[host_id].insert(site_instance_id); + int render_process_id = site_instance->GetProcess()->id(); + process_ids_[render_process_id].insert(site_instance_id); // Register process hosting extensions that have access to extension bindings // with the ExtensionInfoMap on the IO thread. @@ -254,7 +254,7 @@ void ExtensionProcessManager::RegisterExtensionSiteInstance( BrowserThread::IO, FROM_HERE, base::Bind(&ExtensionInfoMap::BindingsEnabledForProcess, profile->GetExtensionInfoMap(), - host_id)); + render_process_id)); } SiteInstanceIDMap::const_iterator it = extension_ids_.find(site_instance_id); @@ -275,8 +275,8 @@ void ExtensionProcessManager::UnregisterExtensionSiteInstance( extension_ids_.erase(it++); } if (site_instance->HasProcess()) { - int host_id = site_instance->GetProcess()->id(); - ProcessIDMap::iterator host = process_ids_.find(host_id); + int render_process_id = site_instance->GetProcess()->id(); + ProcessIDMap::iterator host = process_ids_.find(render_process_id); if (host != process_ids_.end()) { host->second.erase(site_instance_id); if (host->second.empty()) { @@ -287,15 +287,20 @@ void ExtensionProcessManager::UnregisterExtensionSiteInstance( BrowserThread::IO, FROM_HERE, base::Bind(&ExtensionInfoMap::BindingsDisabledForProcess, profile->GetExtensionInfoMap(), - host_id)); + render_process_id)); } } } } -bool ExtensionProcessManager::AreBindingsEnabledForProcess(int host_id) { - ProcessIDMap::iterator it = process_ids_.find(host_id); - if (process_ids_.find(host_id) == process_ids_.end()) +bool ExtensionProcessManager::IsExtensionProcess(int render_process_id) { + return process_ids_.find(render_process_id) != process_ids_.end(); +} + +bool ExtensionProcessManager::AreBindingsEnabledForProcess( + int render_process_id) { + ProcessIDMap::iterator it = process_ids_.find(render_process_id); + if (it == process_ids_.end()) return false; Profile* profile = diff --git a/chrome/browser/extensions/extension_process_manager.h b/chrome/browser/extensions/extension_process_manager.h index b8219a3..73b1cdf 100644 --- a/chrome/browser/extensions/extension_process_manager.h +++ b/chrome/browser/extensions/extension_process_manager.h @@ -76,9 +76,12 @@ class ExtensionProcessManager : public NotificationObserver { // Unregisters the extension associated with |site_instance|. void UnregisterExtensionSiteInstance(SiteInstance* site_instance); + // True if this process host is hosting an extension. + bool IsExtensionProcess(int render_process_id); + // True if this process host is hosting an extension with extension bindings // enabled. - bool AreBindingsEnabledForProcess(int host_id); + bool AreBindingsEnabledForProcess(int render_process_id); // Returns the extension process that |url| is associated with if it exists. // This is not valid for hosted apps without the background permission, since diff --git a/chrome/browser/memory_details.cc b/chrome/browser/memory_details.cc index f8adcf9..e228faa 100644 --- a/chrome/browser/memory_details.cc +++ b/chrome/browser/memory_details.cc @@ -177,7 +177,8 @@ void MemoryDetails::CollectChildInfoOnUIThread() { } TabContents* contents = host_delegate->GetAsTabContents(); if (!contents) { - if (host->process()->is_extension_process()) { + if (extension_process_manager->IsExtensionProcess( + host->process()->id())) { const Extension* extension = extension_service->GetExtensionByURL(url); if (extension) { diff --git a/chrome/browser/metrics/metrics_service.cc b/chrome/browser/metrics/metrics_service.cc index 88a82ab..2d21539 100644 --- a/chrome/browser/metrics/metrics_service.cc +++ b/chrome/browser/metrics/metrics_service.cc @@ -156,6 +156,7 @@ #include "base/values.h" #include "chrome/browser/bookmarks/bookmark_model.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/extensions/extension_process_manager.h" #include "chrome/browser/memory_details.h" #include "chrome/browser/metrics/histogram_synchronizer.h" #include "chrome/browser/metrics/metrics_log.h" @@ -524,16 +525,9 @@ void MetricsService::Observe(int type, case content::NOTIFICATION_RENDERER_PROCESS_CLOSED: { RenderProcessHost::RendererClosedDetails* process_details = Details<RenderProcessHost::RendererClosedDetails>(details).ptr(); - if (process_details->status == - base::TERMINATION_STATUS_PROCESS_CRASHED || - process_details->status == - base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { - if (process_details->was_extension_renderer) { - LogExtensionRendererCrash(); - } else { - LogRendererCrash(); - } - } + RenderProcessHost* host = Source<RenderProcessHost>(source).ptr(); + LogRendererCrash( + host, process_details->status, process_details->was_alive); } break; @@ -1241,12 +1235,36 @@ void MetricsService::LogLoadStarted() { // might be lost due to a crash :-(. } -void MetricsService::LogRendererCrash() { - IncrementPrefValue(prefs::kStabilityRendererCrashCount); -} - -void MetricsService::LogExtensionRendererCrash() { - IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); +void MetricsService::LogRendererCrash(RenderProcessHost* host, + base::TerminationStatus status, + bool was_alive) { + Profile* profile = Profile::FromBrowserContext(host->browser_context()); + ExtensionProcessManager* extension_process_manager = + profile->GetExtensionProcessManager(); + bool was_extension_process = extension_process_manager ? + extension_process_manager->IsExtensionProcess(host->id()) : + false; + if (status == base::TERMINATION_STATUS_PROCESS_CRASHED || + status == base::TERMINATION_STATUS_ABNORMAL_TERMINATION) { + if (was_extension_process) + IncrementPrefValue(prefs::kStabilityExtensionRendererCrashCount); + else + IncrementPrefValue(prefs::kStabilityRendererCrashCount); + + UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashes", + was_extension_process ? 2 : 1); + if (was_alive) { + UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildCrashesWasAlive", + was_extension_process ? 2 : 1); + } + } else if (status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED) { + UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKills", + was_extension_process ? 2 : 1); + if (was_alive) { + UMA_HISTOGRAM_PERCENTAGE("BrowserRenderProcessHost.ChildKillsWasAlive", + was_extension_process ? 2 : 1); + } + } } void MetricsService::LogRendererHang() { diff --git a/chrome/browser/metrics/metrics_service.h b/chrome/browser/metrics/metrics_service.h index dc781e4..c5a0b76 100644 --- a/chrome/browser/metrics/metrics_service.h +++ b/chrome/browser/metrics/metrics_service.h @@ -16,6 +16,7 @@ #include "base/basictypes.h" #include "base/gtest_prod_util.h" #include "base/memory/scoped_ptr.h" +#include "base/process_util.h" #include "chrome/browser/io_thread.h" #include "chrome/common/metrics_helpers.h" #include "content/common/notification_observer.h" @@ -33,6 +34,7 @@ class MetricsLogBase; class MetricsReportingScheduler; class PrefService; class Profile; +class RenderProcessHost; class TemplateURLService; namespace base { @@ -253,10 +255,9 @@ class MetricsService : public NotificationObserver, void IncrementLongPrefsValue(const char* path); // Records a renderer process crash. - void LogRendererCrash(); - - // Records an extension renderer process crash. - void LogExtensionRendererCrash(); + void LogRendererCrash(RenderProcessHost* host, + base::TerminationStatus status, + bool was_alive); // Records a renderer process hang. void LogRendererHang(); diff --git a/chrome/browser/renderer_host/chrome_render_view_host_observer.cc b/chrome/browser/renderer_host/chrome_render_view_host_observer.cc index 6d1a8e27..74f7676c 100644 --- a/chrome/browser/renderer_host/chrome_render_view_host_observer.cc +++ b/chrome/browser/renderer_host/chrome_render_view_host_observer.cc @@ -72,8 +72,6 @@ void ChromeRenderViewHostObserver::InitRenderViewHostForExtensions() { profile->GetExtensionProcessManager(); CHECK(process_manager); - site_instance->GetProcess()->mark_is_extension_process(); - // Register the association between extension and SiteInstance with // ExtensionProcessManager. // TODO(creis): Use this to replace SetInstalledAppForRenderer. diff --git a/chrome/browser/task_manager/task_manager_resource_providers.cc b/chrome/browser/task_manager/task_manager_resource_providers.cc index 9118f61..29431a5 100644 --- a/chrome/browser/task_manager/task_manager_resource_providers.cc +++ b/chrome/browser/task_manager/task_manager_resource_providers.cc @@ -257,8 +257,11 @@ string16 TaskManagerTabContentsResource::GetTitle() const { // was installed as an app.) ExtensionService* extensions_service = tab_contents_->profile()->GetExtensionService(); + ExtensionProcessManager* extension_process_manager = + tab_contents_->profile()->GetExtensionProcessManager(); bool is_app = extensions_service->IsInstalledApp(url) && - contents->GetRenderProcessHost()->is_extension_process(); + extension_process_manager->IsExtensionProcess( + contents->GetRenderProcessHost()->id()); int message_id = GetMessagePrefixID( is_app, |