mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
chrome: Fix request interception with active extension (fixes issue #3444)
Support chaining of proxies in WillCreateURLLoaderFactory.
This commit is contained in:
@ -241,21 +241,65 @@ bool ChromeContentBrowserClientCef::WillCreateURLLoaderFactory(
|
|||||||
bool* bypass_redirect_checks,
|
bool* bypass_redirect_checks,
|
||||||
bool* disable_secure_dns,
|
bool* disable_secure_dns,
|
||||||
network::mojom::URLLoaderFactoryOverridePtr* factory_override) {
|
network::mojom::URLLoaderFactoryOverridePtr* factory_override) {
|
||||||
bool use_proxy = ChromeContentBrowserClient::WillCreateURLLoaderFactory(
|
|
||||||
browser_context, frame, render_process_id, type, request_initiator,
|
|
||||||
navigation_id, ukm_source_id, factory_receiver, header_client,
|
|
||||||
bypass_redirect_checks, disable_secure_dns, factory_override);
|
|
||||||
if (use_proxy) {
|
|
||||||
// The chrome layer will handle the request.
|
|
||||||
return use_proxy;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't intercept requests for Profiles that were not created by CEF.
|
// Don't intercept requests for Profiles that were not created by CEF.
|
||||||
// For example, the User Manager profile created via
|
// For example, the User Manager profile created via
|
||||||
// profiles::CreateSystemProfileForUserManager.
|
// profiles::CreateSystemProfileForUserManager.
|
||||||
auto profile = Profile::FromBrowserContext(browser_context);
|
auto profile = Profile::FromBrowserContext(browser_context);
|
||||||
if (!CefBrowserContext::FromProfile(profile)) {
|
if (!CefBrowserContext::FromProfile(profile)) {
|
||||||
return false;
|
return ChromeContentBrowserClient::WillCreateURLLoaderFactory(
|
||||||
|
browser_context, frame, render_process_id, type, request_initiator,
|
||||||
|
navigation_id, ukm_source_id, factory_receiver, header_client,
|
||||||
|
bypass_redirect_checks, disable_secure_dns, factory_override);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Based on content/browser/devtools/devtools_instrumentation.cc
|
||||||
|
// WillCreateURLLoaderFactoryInternal.
|
||||||
|
network::mojom::URLLoaderFactoryOverridePtr cef_override(
|
||||||
|
network::mojom::URLLoaderFactoryOverride::New());
|
||||||
|
// If caller passed some existing overrides, use those.
|
||||||
|
// Otherwise, use our local var, then if handlers actually
|
||||||
|
// decide to intercept, move it to |factory_override|.
|
||||||
|
network::mojom::URLLoaderFactoryOverridePtr* handler_override =
|
||||||
|
factory_override && *factory_override ? factory_override : &cef_override;
|
||||||
|
network::mojom::URLLoaderFactoryOverride* intercepting_factory =
|
||||||
|
handler_override->get();
|
||||||
|
|
||||||
|
// If we're the first interceptor to install an override, make a
|
||||||
|
// remote/receiver pair, then handle this similarly to appending
|
||||||
|
// a proxy to existing override.
|
||||||
|
if (!intercepting_factory->overriding_factory) {
|
||||||
|
DCHECK(!intercepting_factory->overridden_factory_receiver);
|
||||||
|
intercepting_factory->overridden_factory_receiver =
|
||||||
|
intercepting_factory->overriding_factory
|
||||||
|
.InitWithNewPipeAndPassReceiver();
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO(chrome): Is it necessary to proxy |header_client| callbacks?
|
||||||
|
bool use_proxy = ChromeContentBrowserClient::WillCreateURLLoaderFactory(
|
||||||
|
browser_context, frame, render_process_id, type, request_initiator,
|
||||||
|
navigation_id, ukm_source_id,
|
||||||
|
&(intercepting_factory->overridden_factory_receiver),
|
||||||
|
/*header_client=*/nullptr, bypass_redirect_checks, disable_secure_dns,
|
||||||
|
handler_override);
|
||||||
|
|
||||||
|
if (use_proxy) {
|
||||||
|
DCHECK(intercepting_factory->overriding_factory);
|
||||||
|
DCHECK(intercepting_factory->overridden_factory_receiver);
|
||||||
|
if (!factory_override) {
|
||||||
|
// Not a subresource navigation, so just override the target receiver.
|
||||||
|
mojo::FusePipes(std::move(*factory_receiver),
|
||||||
|
std::move(cef_override->overriding_factory));
|
||||||
|
*factory_receiver = std::move(cef_override->overridden_factory_receiver);
|
||||||
|
} else if (!*factory_override) {
|
||||||
|
// No other overrides, so just returns ours as is.
|
||||||
|
*factory_override = network::mojom::URLLoaderFactoryOverride::New(
|
||||||
|
std::move(cef_override->overriding_factory),
|
||||||
|
std::move(cef_override->overridden_factory_receiver), false);
|
||||||
|
}
|
||||||
|
// ... else things are already taken care of, as handler_override was
|
||||||
|
// pointing to factory override and we've done all magic in-place.
|
||||||
|
DCHECK(!cef_override->overriding_factory);
|
||||||
|
DCHECK(!cef_override->overridden_factory_receiver);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto request_handler = net_service::CreateInterceptedRequestHandler(
|
auto request_handler = net_service::CreateInterceptedRequestHandler(
|
||||||
@ -266,6 +310,7 @@ bool ChromeContentBrowserClientCef::WillCreateURLLoaderFactory(
|
|||||||
net_service::ProxyURLLoaderFactory::CreateProxy(
|
net_service::ProxyURLLoaderFactory::CreateProxy(
|
||||||
browser_context, factory_receiver, header_client,
|
browser_context, factory_receiver, header_client,
|
||||||
std::move(request_handler));
|
std::move(request_handler));
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user