0

Add a feature parameter to fork the prefetch process from the renderer

Advantages of forking from the renderer instead of the browser:
- Prioritizes prefetching the native library used by the renderer, which is more critical for page load latency.
- Leverages the native library shared with Chrome, ensuring it is always ordered.
- Reduces the browser process's workload during WebView startup.

Potential drawback:
- If the renderer initialization is delayed, the prefetch operation may also be delayed.

Bug: 395567815
Change-Id: I502ccfe243bbe4f34921468a50b93bf9dc97222c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6299173
Commit-Queue: Ziad Youssef <ziadyoussef@chromium.org>
Reviewed-by: Peter Beverloo <peter@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1425084}
This commit is contained in:
Ziad Youssef
2025-02-26 05:09:01 -08:00
committed by Chromium LUCI CQ
parent 91e09126ff
commit 752649644d
5 changed files with 25 additions and 1 deletions
android_webview
testing/variations

@@ -207,6 +207,10 @@ BASE_FEATURE(kWebViewPrefetchNativeLibrary,
"WebViewPrefetchNativeLibrary", "WebViewPrefetchNativeLibrary",
base::FEATURE_DISABLED_BY_DEFAULT); base::FEATURE_DISABLED_BY_DEFAULT);
// A parameter to trigger the prefetch from the renderer instead of the browser.
const base::FeatureParam<bool> kWebViewPrefetchFromRenderer{
&kWebViewPrefetchNativeLibrary, "WebViewPrefetchFromRenderer", false};
// If enabled TYPE_SCROLLED accessibility events are sent every 100ms when user // If enabled TYPE_SCROLLED accessibility events are sent every 100ms when user
// is scrolling irrespective of GestureScrollUpdate being consumed or not. // is scrolling irrespective of GestureScrollUpdate being consumed or not.
// If disabled events are sent on GSU consumed ack. // If disabled events are sent on GSU consumed ack.

@@ -47,6 +47,7 @@ BASE_DECLARE_FEATURE(kWebViewReduceUAAndroidVersionDeviceModel);
BASE_DECLARE_FEATURE(kWebViewEnableCrash); BASE_DECLARE_FEATURE(kWebViewEnableCrash);
BASE_DECLARE_FEATURE(kWebViewPreloadClasses); BASE_DECLARE_FEATURE(kWebViewPreloadClasses);
BASE_DECLARE_FEATURE(kWebViewPrefetchNativeLibrary); BASE_DECLARE_FEATURE(kWebViewPrefetchNativeLibrary);
extern const base::FeatureParam<bool> kWebViewPrefetchFromRenderer;
BASE_DECLARE_FEATURE(kWebViewSeparateResourceContext); BASE_DECLARE_FEATURE(kWebViewSeparateResourceContext);
BASE_DECLARE_FEATURE(kWebViewDoNotSendAccessibilityEventsOnGSU); BASE_DECLARE_FEATURE(kWebViewDoNotSendAccessibilityEventsOnGSU);
BASE_DECLARE_FEATURE(kWebViewHyperlinkContextMenu); BASE_DECLARE_FEATURE(kWebViewHyperlinkContextMenu);

@@ -399,7 +399,12 @@ public class WebViewChromiumAwInit {
AwFeatureMap.isEnabled(AwFeatures.WEBVIEW_DISABLE_CHIPS)); AwFeatureMap.isEnabled(AwFeatures.WEBVIEW_DISABLE_CHIPS));
}); });
if (AwFeatureMap.isEnabled(AwFeatures.WEBVIEW_PREFETCH_NATIVE_LIBRARY)) { if (AwFeatureMap.isEnabled(AwFeatures.WEBVIEW_PREFETCH_NATIVE_LIBRARY)
&& !AwFeatureMap.getInstance()
.getFieldTrialParamByFeatureAsBoolean(
AwFeatures.WEBVIEW_PREFETCH_NATIVE_LIBRARY,
"WebViewPrefetchFromRenderer",
false)) {
PostTask.postTask( PostTask.postTask(
TaskTraits.BEST_EFFORT, TaskTraits.BEST_EFFORT,
() -> { () -> {

@@ -18,10 +18,12 @@
#include "android_webview/renderer/aw_render_view_ext.h" #include "android_webview/renderer/aw_render_view_ext.h"
#include "android_webview/renderer/aw_url_loader_throttle_provider.h" #include "android_webview/renderer/aw_url_loader_throttle_provider.h"
#include "android_webview/renderer/browser_exposed_renderer_interfaces.h" #include "android_webview/renderer/browser_exposed_renderer_interfaces.h"
#include "base/android/library_loader/library_prefetcher.h"
#include "base/command_line.h" #include "base/command_line.h"
#include "base/i18n/rtl.h" #include "base/i18n/rtl.h"
#include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros.h"
#include "base/strings/string_util.h" #include "base/strings/string_util.h"
#include "base/task/thread_pool.h"
#include "components/android_system_error_page/error_page_populator.h" #include "components/android_system_error_page/error_page_populator.h"
#include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_features.h"
#include "components/cdm/renderer/key_system_support_update.h" #include "components/cdm/renderer/key_system_support_update.h"
@@ -73,6 +75,15 @@ void AwContentRendererClient::RenderThreadStarted() {
browser_interface_broker_ = browser_interface_broker_ =
blink::Platform::Current()->GetBrowserInterfaceBroker(); blink::Platform::Current()->GetBrowserInterfaceBroker();
if (base::FeatureList::IsEnabled(features::kWebViewPrefetchNativeLibrary) &&
features::kWebViewPrefetchFromRenderer.Get()) {
base::ThreadPool::PostTask(
FROM_HERE, base::BindOnce([] {
base::android::NativeLibraryPrefetcher::ForkAndPrefetchNativeLibrary(
false);
}));
}
#if BUILDFLAG(ENABLE_SPELLCHECK) #if BUILDFLAG(ENABLE_SPELLCHECK)
if (!spellcheck_) if (!spellcheck_)
spellcheck_ = std::make_unique<SpellCheck>(this); spellcheck_ = std::make_unique<SpellCheck>(this);

@@ -26352,6 +26352,9 @@
"experiments": [ "experiments": [
{ {
"name": "Enabled", "name": "Enabled",
"params": {
"WebViewPrefetchFromRenderer": "true"
},
"enable_features": [ "enable_features": [
"WebViewPrefetchNativeLibrary" "WebViewPrefetchNativeLibrary"
] ]