0

Add an experiment to launch a spare renderer when a BrowserContext is created on WebView.

Bug: 326578832

Change-Id: Iede803d042c1cecde1656258b64819f8cc4e458d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5318617
Reviewed-by: Richard (Torne) Coles <torne@chromium.org>
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1265526}
This commit is contained in:
John Abd-El-Malek
2024-02-26 23:29:55 +00:00
committed by Chromium LUCI CQ
parent 4c2a2db0ce
commit aec1edfdc1
6 changed files with 38 additions and 0 deletions
android_webview
browser
java
src
org
chromium
javatests
content/browser/renderer_host
tools/metrics/histograms/metadata/browser

@ -13,6 +13,7 @@
#include "android_webview/browser/aw_browser_process.h"
#include "android_webview/browser_jni_headers/AwBrowserContextStore_jni.h"
#include "base/check_op.h"
#include "base/feature_list.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/memory/raw_ptr.h"
@ -26,6 +27,7 @@
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
namespace android_webview {
@ -36,6 +38,14 @@ constexpr char kProfilePathKey[] = "path";
bool g_initialized = false;
BASE_FEATURE(kCreateSpareRendererOnBrowserContextCreation,
"CreateSpareRendererOnBrowserContextCreation",
base::FEATURE_DISABLED_BY_DEFAULT);
const base::FeatureParam<bool> kCreateSpareRendereForDefaultIfMultiProfile{
&kCreateSpareRendererOnBrowserContextCreation,
"create_spare_renderer_for_default_if_multi_profile", true};
} // namespace
AwBrowserContextStore::AwBrowserContextStore(PrefService* pref_service)
@ -101,6 +111,16 @@ AwBrowserContext* AwBrowserContextStore::Get(const std::string& name,
const bool is_default = name == kDefaultContextName;
entry->instance =
std::make_unique<AwBrowserContext>(name, entry->path, is_default);
// Ensure this code path is only taken if the IO thread is already running,
// as it's needed for launching processes.
if (base::FeatureList::IsEnabled(
kCreateSpareRendererOnBrowserContextCreation) &&
content::BrowserThread::IsThreadInitialized(
content::BrowserThread::IO) &&
(!is_default || kCreateSpareRendereForDefaultIfMultiProfile.Get())) {
content::RenderProcessHost::WarmupSpareRenderProcessHost(
entry->instance.get());
}
}
return entry->instance.get();
}

@ -907,6 +907,7 @@ public final class ProductionSupportedFlagList {
BlinkFeatures.NO_THROTTLING_VISIBLE_AGENT,
"Do not throttle Javascript timers to 1Hz on hidden cross-origin frames that are"
+ " same-agent with a visible frame."),
Flag.baseFeature("CreateSpareRendererOnBrowserContextCreation"),
// Add new commandline switches and features above. The final entry should have a
// trailing comma for cleaner diffs.
};

@ -164,6 +164,7 @@ public class AwContentsClientOnRenderProcessGoneTest extends AwParameterizedTest
@Test
@Feature({"AndroidWebView"})
@CommandLineFlags.Add({"disable-features=CreateSpareRendererOnBrowserContextCreation"})
@SmallTest
@OnlyRunIn(MULTI_PROCESS)
public void testRenderProcessCanNotTerminateBeforeStart() throws Throwable {

@ -325,6 +325,7 @@ public class AwMetricsIntegrationTest extends AwParameterizedTest {
@Test
@MediumTest
@Feature({"AndroidWebView"})
@CommandLineFlags.Add({"disable-features=CreateSpareRendererOnBrowserContextCreation"})
public void testMetadata_stability_rendererLaunchCount() throws Throwable {
EmbeddedTestServer embeddedTestServer =
EmbeddedTestServer.createAndStartServer(

@ -40,7 +40,11 @@ void SpareRenderProcessHostManager::WarmupSpareRenderProcessHost(
return; // Nothing to warm up.
}
bool had_spare_renderer = !!spare_render_process_host_;
CleanupSpareRenderProcessHost();
UMA_HISTOGRAM_BOOLEAN(
"BrowserRenderProcessHost.SpareProcessEvictedOtherSpare",
had_spare_renderer);
// Don't create a spare renderer for a BrowserContext that is in the
// process of shutting down.

@ -1023,6 +1023,17 @@ chromium-metrics-reviews@google.com.
</summary>
</histogram>
<histogram name="BrowserRenderProcessHost.SpareProcessEvictedOtherSpare"
enum="Boolean" expires_after="2024-08-30">
<owner>jam@chromium.org</owner>
<owner>cduvall@chromium.org</owner>
<summary>
Records true if WarmupSpareRenderProcessHost evicted an existing spare
process that had a different BrowserContext, or false if there wasn't an
existing spare process.
</summary>
</histogram>
<histogram name="BrowserRenderProcessHost.SpareProcessMaybeTakeAction"
enum="SpareProcessMaybeTakeAction" expires_after="2024-06-30">
<owner>alexmos@chromium.org</owner>