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:

committed by
Chromium LUCI CQ

parent
4c2a2db0ce
commit
aec1edfdc1
android_webview
browser
java
src
org
chromium
android_webview
javatests
src
org
chromium
android_webview
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>
|
||||
|
Reference in New Issue
Block a user