summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-05 21:16:52 +0000
committerjochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-05 21:16:52 +0000
commit718eab64b07e27c6e495878e3ab6e0f8ed21b6df (patch)
tree4047e56c4ecdd88eec53dc9fe5895b89b7caa2d9 /chrome/browser
parent0d54c2a4ed1c2ec19fdb0c98adb061cfeb618899 (diff)
downloadchromium_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.cc28
-rw-r--r--chrome/browser/chrome_content_browser_client.h3
-rw-r--r--chrome/browser/extensions/app_process_apitest.cc67
-rw-r--r--chrome/browser/extensions/extension_info_map.cc16
-rw-r--r--chrome/browser/extensions/extension_info_map.h11
-rw-r--r--chrome/browser/extensions/extension_process_manager.cc23
-rw-r--r--chrome/browser/extensions/extension_process_manager.h5
-rw-r--r--chrome/browser/memory_details.cc3
-rw-r--r--chrome/browser/metrics/metrics_service.cc50
-rw-r--r--chrome/browser/metrics/metrics_service.h9
-rw-r--r--chrome/browser/renderer_host/chrome_render_view_host_observer.cc2
-rw-r--r--chrome/browser/task_manager/task_manager_resource_providers.cc5
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,