diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index cbc681366d09be..dd921fa0d6ca31 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn @@ -3114,8 +3114,6 @@ source_set("browser") { # The Direct Sockets API is not implemented on Android. "direct_sockets/direct_sockets_service_impl.cc", "direct_sockets/direct_sockets_service_impl.h", - "direct_sockets/resolve_host_and_open_socket.cc", - "direct_sockets/resolve_host_and_open_socket.h", # Non-Android platforms that don't presently support # enable_screen_capture, like Fuchsia, nevertheless compile diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.cc b/content/browser/direct_sockets/direct_sockets_service_impl.cc index aefc249270fbd8..97f72dd270528e 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.cc +++ b/content/browser/direct_sockets/direct_sockets_service_impl.cc @@ -5,7 +5,6 @@ #include "content/browser/direct_sockets/direct_sockets_service_impl.h" #include "build/build_config.h" -#include "content/browser/direct_sockets/resolve_host_and_open_socket.h" #include "content/browser/process_lock.h" #include "content/browser/renderer_host/isolated_context_util.h" #include "content/public/browser/browser_thread.h" @@ -15,18 +14,18 @@ #include "content/public/browser/render_process_host.h" #include "content/public/browser/storage_partition.h" #include "content/public/common/content_client.h" -#include "mojo/public/cpp/bindings/message.h" #include "mojo/public/cpp/bindings/pending_receiver.h" -#include "mojo/public/cpp/system/data_pipe.h" +#include "net/base/host_port_pair.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" +#include "net/base/network_anonymization_key.h" #include "net/traffic_annotation/network_traffic_annotation.h" +#include "services/network/public/cpp/simple_host_resolver.h" #include "services/network/public/mojom/network_context.mojom.h" #include "services/network/public/mojom/restricted_udp_socket.mojom.h" #include "services/network/public/mojom/tcp_socket.mojom.h" #include "services/network/public/mojom/udp_socket.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom-shared.h" #include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom.h" #include "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom-shared.h" @@ -98,12 +97,20 @@ content::DirectSocketsDelegate* GetDelegate() { return GetContentClient()->browser()->GetDirectSocketsDelegate(); } +#if BUILDFLAG(ENABLE_MDNS) +bool ResemblesMulticastDNSName(base::StringPiece hostname) { + return base::EndsWith(hostname, ".local") || + base::EndsWith(hostname, ".local."); +} +#endif // !BUILDFLAG(ENABLE_MDNS) + } // namespace DirectSocketsServiceImpl::DirectSocketsServiceImpl( RenderFrameHost* render_frame_host, mojo::PendingReceiver receiver) - : DocumentService(*render_frame_host, std::move(receiver)) {} + : DocumentService(*render_frame_host, std::move(receiver)), + resolver_(network::SimpleHostResolver::Create(GetNetworkContext())) {} DirectSocketsServiceImpl::~DirectSocketsServiceImpl() = default; @@ -145,13 +152,23 @@ void DirectSocketsServiceImpl::OpenTCPSocket( return; } - ResolveHostAndOpenSocket::Create( - std::move(remote_addr), + network::mojom::ResolveHostParametersPtr parameters = + network::mojom::ResolveHostParameters::New(); +#if BUILDFLAG(ENABLE_MDNS) + if (ResemblesMulticastDNSName(remote_addr.host())) { + parameters->source = net::HostResolverSource::MULTICAST_DNS; + } +#endif // !BUILDFLAG(ENABLE_MDNS) + + // Unretained(this) is safe here because the callback will be owned by + // |resolver_| which in turn is owned by |this|. + resolver_->ResolveHost( + network::mojom::HostResolverHost::NewHostPortPair(std::move(remote_addr)), + net::NetworkAnonymizationKey::CreateTransient(), std::move(parameters), base::BindOnce(&DirectSocketsServiceImpl::OnResolveCompleteForTCPSocket, - weak_ptr_factory_.GetWeakPtr(), std::move(options), + base::Unretained(this), std::move(options), std::move(receiver), std::move(observer), - std::move(callback))) - ->Start(GetNetworkContext()); + std::move(callback))); } void DirectSocketsServiceImpl::OpenUDPSocket( @@ -184,13 +201,24 @@ void DirectSocketsServiceImpl::OpenUDPSocket( return; } - ResolveHostAndOpenSocket::Create( - std::move(remote_addr), + network::mojom::ResolveHostParametersPtr parameters = + network::mojom::ResolveHostParameters::New(); +#if BUILDFLAG(ENABLE_MDNS) + if (ResemblesMulticastDNSName(remote_addr.host())) { + parameters->source = net::HostResolverSource::MULTICAST_DNS; + } +#endif // !BUILDFLAG(ENABLE_MDNS) + + // Unretained(this) is safe here because the callback will be owned by + // |resolver_| which in turn is owned by |this|. + resolver_->ResolveHost( + network::mojom::HostResolverHost::NewHostPortPair( + std::move(remote_addr)), + net::NetworkAnonymizationKey::CreateTransient(), std::move(parameters), base::BindOnce(&DirectSocketsServiceImpl::OnResolveCompleteForUDPSocket, - weak_ptr_factory_.GetWeakPtr(), std::move(options), + base::Unretained(this), std::move(options), std::move(receiver), std::move(listener), - std::move(callback))) - ->Start(GetNetworkContext()); + std::move(callback))); } else { // Handle BOUND mode request. DCHECK(options->local_addr); @@ -243,7 +271,9 @@ void DirectSocketsServiceImpl::OnResolveCompleteForTCPSocket( mojo::PendingRemote observer, OpenTCPSocketCallback callback, int result, - const absl::optional& resolved_addresses) { + const net::ResolveErrorInfo&, + const absl::optional& resolved_addresses, + const absl::optional&) { if (result != net::OK) { std::move(callback).Run(result, absl::nullopt, absl::nullopt, mojo::ScopedDataPipeConsumerHandle(), @@ -269,7 +299,9 @@ void DirectSocketsServiceImpl::OnResolveCompleteForUDPSocket( mojo::PendingRemote listener, OpenUDPSocketCallback callback, int result, - const absl::optional& resolved_addresses) { + const net::ResolveErrorInfo&, + const absl::optional& resolved_addresses, + const absl::optional&) { if (result != net::OK) { std::move(callback).Run(result, absl::nullopt, absl::nullopt); return; diff --git a/content/browser/direct_sockets/direct_sockets_service_impl.h b/content/browser/direct_sockets/direct_sockets_service_impl.h index 31794464e89752..4a3f48a3121f9f 100644 --- a/content/browser/direct_sockets/direct_sockets_service_impl.h +++ b/content/browser/direct_sockets/direct_sockets_service_impl.h @@ -5,21 +5,21 @@ #ifndef CONTENT_BROWSER_DIRECT_SOCKETS_DIRECT_SOCKETS_SERVICE_IMPL_H_ #define CONTENT_BROWSER_DIRECT_SOCKETS_DIRECT_SOCKETS_SERVICE_IMPL_H_ -#include "base/memory/raw_ptr.h" -#include "base/memory/weak_ptr.h" #include "content/common/content_export.h" #include "content/public/browser/document_service.h" #include "content/public/browser/render_frame_host.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_remote.h" -#include "mojo/public/cpp/bindings/unique_receiver_set.h" #include "net/base/address_list.h" -#include "net/traffic_annotation/network_traffic_annotation.h" +#include "net/dns/public/host_resolver_results.h" #include "third_party/blink/public/mojom/direct_sockets/direct_sockets.mojom.h" -namespace network::mojom { +namespace network { +class SimpleHostResolver; +namespace mojom { class NetworkContext; -} // namespace network::mojom +} // namespace mojom +} // namespace network namespace content { @@ -63,7 +63,9 @@ class CONTENT_EXPORT DirectSocketsServiceImpl mojo::PendingRemote, OpenTCPSocketCallback, int result, - const absl::optional& resolved_addresses); + const net::ResolveErrorInfo&, + const absl::optional& resolved_addresses, + const absl::optional&); void OnResolveCompleteForUDPSocket( blink::mojom::DirectUDPSocketOptionsPtr, @@ -71,9 +73,11 @@ class CONTENT_EXPORT DirectSocketsServiceImpl mojo::PendingRemote, OpenUDPSocketCallback, int result, - const absl::optional& resolved_addresses); + const net::ResolveErrorInfo&, + const absl::optional& resolved_addresses, + const absl::optional&); - base::WeakPtrFactory weak_ptr_factory_{this}; + std::unique_ptr resolver_; }; } // namespace content diff --git a/content/browser/direct_sockets/resolve_host_and_open_socket.cc b/content/browser/direct_sockets/resolve_host_and_open_socket.cc deleted file mode 100644 index 89d8521bf4f102..00000000000000 --- a/content/browser/direct_sockets/resolve_host_and_open_socket.cc +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "content/browser/direct_sockets/resolve_host_and_open_socket.h" - -#include "base/functional/bind.h" -#include "build/build_config.h" -#include "content/public/browser/render_frame_host.h" -#include "net/base/address_list.h" -#include "net/net_buildflags.h" -#include "services/network/public/mojom/network_context.mojom.h" - -namespace content { -namespace { - -#if BUILDFLAG(ENABLE_MDNS) -bool ResemblesMulticastDNSName(const std::string& hostname) { - return base::EndsWith(hostname, ".local") || - base::EndsWith(hostname, ".local."); -} -#endif // !BUILDFLAG(ENABLE_MDNS) - -} // namespace - -ResolveHostAndOpenSocket::ResolveHostAndOpenSocket(net::HostPortPair addr, - OpenSocketCallback callback) - : addr_(addr), callback_(std::move(callback)) {} - -ResolveHostAndOpenSocket::~ResolveHostAndOpenSocket() = default; - -// static -ResolveHostAndOpenSocket* ResolveHostAndOpenSocket::Create( - net::HostPortPair addr, - OpenSocketCallback callback) { - return new ResolveHostAndOpenSocket(std::move(addr), std::move(callback)); -} - -void ResolveHostAndOpenSocket::Start( - network::mojom::NetworkContext* network_context) { - DCHECK(!receiver_.is_bound()); - DCHECK(!resolver_.is_bound()); - - network_context->CreateHostResolver( - /*config_overrides=*/absl::nullopt, - resolver_.BindNewPipeAndPassReceiver()); - - network::mojom::ResolveHostParametersPtr parameters = - network::mojom::ResolveHostParameters::New(); -#if BUILDFLAG(ENABLE_MDNS) - if (ResemblesMulticastDNSName(addr_.host())) { - parameters->source = net::HostResolverSource::MULTICAST_DNS; - } -#endif // !BUILDFLAG(ENABLE_MDNS) - // Intentionally using a HostPortPair because scheme isn't specified. - resolver_->ResolveHost( - network::mojom::HostResolverHost::NewHostPortPair(addr_), - net::NetworkAnonymizationKey::CreateTransient(), std::move(parameters), - receiver_.BindNewPipeAndPassRemote()); - receiver_.set_disconnect_handler(base::BindOnce( - &ResolveHostAndOpenSocket::OnComplete, base::Unretained(this), - net::ERR_NAME_NOT_RESOLVED, net::ResolveErrorInfo(net::ERR_FAILED), - /*resolved_addresses=*/absl::nullopt, - /*endpoint_results_with_metadata=*/absl::nullopt)); -} - -void ResolveHostAndOpenSocket::OnComplete( - int result, - const net::ResolveErrorInfo& resolve_error_info, - const absl::optional& resolved_addresses, - const absl::optional& - endpoint_results_with_metadata) { - DCHECK(receiver_.is_bound()); - receiver_.reset(); - resolver_.reset(); - - std::move(callback_).Run(result, resolved_addresses); - delete this; -} - -} // namespace content diff --git a/content/browser/direct_sockets/resolve_host_and_open_socket.h b/content/browser/direct_sockets/resolve_host_and_open_socket.h deleted file mode 100644 index 4e25ab23e7ebb9..00000000000000 --- a/content/browser/direct_sockets/resolve_host_and_open_socket.h +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CONTENT_BROWSER_DIRECT_SOCKETS_RESOLVE_HOST_AND_OPEN_SOCKET_H_ -#define CONTENT_BROWSER_DIRECT_SOCKETS_RESOLVE_HOST_AND_OPEN_SOCKET_H_ - -#include "content/common/content_export.h" -#include "mojo/public/cpp/bindings/receiver.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "net/base/address_list.h" -#include "net/base/host_port_pair.h" -#include "net/dns/public/host_resolver_results.h" -#include "services/network/public/cpp/resolve_host_client_base.h" - -namespace network::mojom { -class NetworkContext; -} // namespace network::mojom - -namespace content { - -// Resolves the host/port pair provided on creation. After resolver signals -// completion via OnComplete(), fires the supplied callback and deletes itself. -class CONTENT_EXPORT ResolveHostAndOpenSocket - : public network::ResolveHostClientBase { - public: - using OpenSocketCallback = - base::OnceCallback&)>; - - ~ResolveHostAndOpenSocket() override; - - static ResolveHostAndOpenSocket* Create(net::HostPortPair addr, - OpenSocketCallback); - - void Start(network::mojom::NetworkContext*); - - private: - ResolveHostAndOpenSocket(net::HostPortPair addr, OpenSocketCallback); - - void OnComplete(int result, - const net::ResolveErrorInfo& resolve_error_info, - const absl::optional& resolved_addresses, - const absl::optional& - endpoint_results_with_metadata) override; - - const net::HostPortPair addr_; - - OpenSocketCallback callback_; - - mojo::Receiver receiver_{this}; - mojo::Remote resolver_; -}; - -} // namespace content - -#endif // CONTENT_BROWSER_DIRECT_SOCKETS_RESOLVE_HOST_AND_OPEN_SOCKET_H_