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:

committed by
Chromium LUCI CQ

parent
91e09126ff
commit
752649644d
android_webview
common
glue
java
src
com
android
webview
chromium
renderer
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"
|
||||||
]
|
]
|
||||||
|
Reference in New Issue
Block a user