Skip to content

Commit

Permalink
Enable link tag and header dns-prefetch and preconnect in WebView.
Browse files Browse the repository at this point in the history
It looks like we never implemented this in WebView. This should improve performance, so add support behind a feature flag.

(cherry picked from commit 79bc505)

Bug: 1410043
Change-Id: I54b6310fbd1750382dbc59006abb386029e16027
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4193142
Reviewed-by: Richard Coles <torne@chromium.org>
Auto-Submit: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: Alex Gough <ajgo@chromium.org>
Reviewed-by: Adam Langley <agl@chromium.org>
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Cr-Original-Commit-Position: refs/heads/main@{#1097584}
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/4204370
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
Reviewed-by: Bo Liu <boliu@chromium.org>
Cr-Commit-Position: refs/branch-heads/5481@{#806}
Cr-Branched-From: 130f3e4-refs/heads/main@{#1084008}
  • Loading branch information
John Abd-El-Malek authored and Chromium LUCI CQ committed Jan 30, 2023
1 parent be6ff44 commit e4b40bb
Show file tree
Hide file tree
Showing 11 changed files with 50 additions and 0 deletions.
1 change: 1 addition & 0 deletions android_webview/browser/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -249,6 +249,7 @@ source_set("browser") {
"//components/metrics:component_metrics",
"//components/minidump_uploader",
"//components/navigation_interception",
"//components/network_hints/browser",
"//components/origin_trials:browser",
"//components/origin_trials:common",
"//components/page_load_metrics/browser",
Expand Down
1 change: 1 addition & 0 deletions android_webview/browser/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ include_rules = [
"+components/leveldb_proto/public",
"+components/minidump_uploader",
"+components/navigation_interception",
"+components/network_hints/browser",
"+components/optimization_guide/core/bloom_filter.h",
"+components/origin_trials",
"+components/page_load_metrics/browser",
Expand Down
3 changes: 3 additions & 0 deletions android_webview/browser/aw_content_browser_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,9 @@ class AwContentBrowserClient : public content::ContentBrowserClient {
content::RenderProcessHost* render_process_host) override;
void BindMediaServiceReceiver(content::RenderFrameHost* render_frame_host,
mojo::GenericPendingReceiver receiver) override;
void RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override;
std::vector<std::unique_ptr<blink::URLLoaderThrottle>>
CreateURLLoaderThrottles(
const network::ResourceRequest& request,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
#include "android_webview/browser/aw_print_manager.h"
#include "android_webview/browser/renderer_host/aw_render_view_host_ext.h"
#include "android_webview/browser/safe_browsing/aw_url_checker_delegate_impl.h"
#include "android_webview/common/aw_features.h"
#include "components/autofill/content/browser/content_autofill_driver_factory.h"
#include "components/cdm/browser/media_drm_storage_impl.h"
#include "components/content_capture/browser/onscreen_content_provider.h"
#include "components/network_hints/browser/simple_network_hints_handler_impl.h"
#include "components/page_load_metrics/browser/metrics_web_contents_observer.h"
#include "components/prefs/pref_service.h"
#include "components/safe_browsing/content/browser/mojo_safe_browsing_impl.h"
Expand All @@ -21,6 +23,7 @@
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/resource_context.h"
#include "media/mojo/buildflags.h"
#include "mojo/public/cpp/bindings/binder_map.h"
#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "services/service_manager/public/cpp/binder_registry.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_registry.h"
Expand Down Expand Up @@ -91,6 +94,13 @@ void MaybeCreateSafeBrowsing(
std::move(receiver)));
}

void BindNetworkHintsHandler(
content::RenderFrameHost* frame_host,
mojo::PendingReceiver<network_hints::mojom::NetworkHintsHandler> receiver) {
network_hints::SimpleNetworkHintsHandlerImpl::Create(frame_host,
std::move(receiver));
}

} // anonymous namespace

void AwContentBrowserClient::BindMediaServiceReceiver(
Expand Down Expand Up @@ -190,4 +200,14 @@ void AwContentBrowserClient::ExposeInterfacesToRenderer(
#endif
}

void AwContentBrowserClient::RegisterBrowserInterfaceBindersForFrame(
content::RenderFrameHost* render_frame_host,
mojo::BinderMapWithContext<content::RenderFrameHost*>* map) {
if (base::FeatureList::IsEnabled(
features::kWebViewEnableDnsPrefetchAndPreconnect)) {
map->Add<network_hints::mojom::NetworkHintsHandler>(
base::BindRepeating(&BindNetworkHintsHandler));
}
}

} // namespace android_webview
5 changes: 5 additions & 0 deletions android_webview/common/aw_features.cc
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,11 @@ BASE_FEATURE(kWebViewEmptyComponentLoaderPolicy,
"WebViewEmptyComponentLoaderPolicy",
base::FEATURE_DISABLED_BY_DEFAULT);

// Enable dns-prefetch and preconnect in link tags and HTTP header.
BASE_FEATURE(kWebViewEnableDnsPrefetchAndPreconnect,
"WebViewEnableDnsPrefetchAndPreconnect",
base::FEATURE_DISABLED_BY_DEFAULT);

// When enabled, passive mixed content (Audio/Video/Image subresources loaded
// over HTTP on HTTPS sites) will be autoupgraded to HTTPS, and the load will be
// blocked if the resource fails to load over HTTPS. This only affects apps that
Expand Down
1 change: 1 addition & 0 deletions android_webview/common/aw_features.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ BASE_DECLARE_FEATURE(kWebViewClientHintsControllerDelegate);
BASE_DECLARE_FEATURE(kWebViewConnectionlessSafeBrowsing);
BASE_DECLARE_FEATURE(kWebViewDisplayCutout);
BASE_DECLARE_FEATURE(kWebViewEmptyComponentLoaderPolicy);
BASE_DECLARE_FEATURE(kWebViewEnableDnsPrefetchAndPreconnect);
BASE_DECLARE_FEATURE(kWebViewEnumerateDevicesCache);
BASE_DECLARE_FEATURE(kWebViewExtraHeadersSameOriginOnly);
BASE_DECLARE_FEATURE(kWebViewForceDarkModeMatchTheme);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ private ProductionSupportedFlagList() {}
"Disable the per-domain blocking for 3D APIs after GPU reset. "
+ "This switch is intended only for tests."),
Flag.baseFeature("NavigationRequestPreconnect"),
Flag.baseFeature("WebViewEnableDnsPrefetchAndPreconnect"),
// Add new commandline switches and features above. The final entry should have a
// trailing comma for cleaner diffs.
};
Expand Down
1 change: 1 addition & 0 deletions android_webview/renderer/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ source_set("renderer") {
"//components/content_capture/renderer",
"//components/js_injection/common",
"//components/js_injection/renderer",
"//components/network_hints/renderer",
"//components/page_load_metrics/renderer",
"//components/power_scheduler",
"//components/resources",
Expand Down
1 change: 1 addition & 0 deletions android_webview/renderer/DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ include_rules = [
"+components/android_system_error_page",
"+components/autofill/content/renderer",
"+components/cdm/renderer",
"+components/network_hints/renderer",
"+components/page_load_metrics/renderer",
"+components/grit",
"+components/printing/common",
Expand Down
14 changes: 14 additions & 0 deletions android_webview/renderer/aw_content_renderer_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <memory>
#include <vector>

#include "android_webview/common/aw_features.h"
#include "android_webview/common/aw_switches.h"
#include "android_webview/common/mojom/frame.mojom.h"
#include "android_webview/common/url_constants.h"
Expand All @@ -25,6 +26,7 @@
#include "base/strings/string_util.h"
#include "components/android_system_error_page/error_page_populator.h"
#include "components/js_injection/renderer/js_communication.h"
#include "components/network_hints/renderer/web_prescient_networking_impl.h"
#include "components/page_load_metrics/renderer/metrics_render_frame_observer.h"
#include "components/printing/renderer/print_render_frame_helper.h"
#include "components/visitedlink/renderer/visitedlink_reader.h"
Expand Down Expand Up @@ -168,6 +170,18 @@ void AwContentRendererClient::RenderFrameCreated(
new page_load_metrics::MetricsRenderFrameObserver(render_frame);
}

std::unique_ptr<blink::WebPrescientNetworking>
AwContentRendererClient::CreatePrescientNetworking(
content::RenderFrame* render_frame) {
if (!base::FeatureList::IsEnabled(
features::kWebViewEnableDnsPrefetchAndPreconnect)) {
return nullptr;
}

return std::make_unique<network_hints::WebPrescientNetworkingImpl>(
render_frame);
}

void AwContentRendererClient::WebViewCreated(
blink::WebView* web_view,
bool was_created_by_renderer,
Expand Down
2 changes: 2 additions & 0 deletions android_webview/renderer/aw_content_renderer_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ class AwContentRendererClient : public content::ContentRendererClient,
blink::WebNavigationType type,
blink::WebNavigationPolicy default_policy,
bool is_redirect) override;
std::unique_ptr<blink::WebPrescientNetworking> CreatePrescientNetworking(
content::RenderFrame* render_frame) override;
std::unique_ptr<blink::URLLoaderThrottleProvider>
CreateURLLoaderThrottleProvider(
blink::URLLoaderThrottleProviderType provider_type) override;
Expand Down

0 comments on commit e4b40bb

Please sign in to comment.