Diff
Modified: trunk/Source/WTF/ChangeLog (279482 => 279483)
--- trunk/Source/WTF/ChangeLog 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WTF/ChangeLog 2021-07-01 20:56:00 UTC (rev 279483)
@@ -1,3 +1,14 @@
+2021-07-01 Youenn Fablet <you...@apple.com>
+
+ Disable relay for UDP sockets when not needed
+ https://bugs.webkit.org/show_bug.cgi?id=227253
+ <rdar://problem/79912154>
+
+ Reviewed by Eric Carlson.
+
+ * wtf/PlatformHave.h:
+ Add a macro for new NW methods.
+
2021-07-01 Antoine Quint <grao...@webkit.org>
[Model] Restrict IPC calls to ARKit SPI availability and runtime flag
Modified: trunk/Source/WTF/wtf/PlatformHave.h (279482 => 279483)
--- trunk/Source/WTF/wtf/PlatformHave.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WTF/wtf/PlatformHave.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -546,6 +546,10 @@
#define HAVE_NSURLSESSION_WEBSOCKET 1
#endif
+#if (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 120000) || (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 150000)
+#define HAVE_NWPARAMETERS_TRACKER_API 1
+#endif
+
#if PLATFORM(COCOA) && !(PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500) && !PLATFORM(MACCATALYST)
#define HAVE_AVPLAYER_RESOURCE_CONSERVATION_LEVEL 1
#endif
Modified: trunk/Source/WebCore/ChangeLog (279482 => 279483)
--- trunk/Source/WebCore/ChangeLog 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/ChangeLog 2021-07-01 20:56:00 UTC (rev 279483)
@@ -1,3 +1,21 @@
+2021-07-01 Youenn Fablet <you...@apple.com>
+
+ Disable relay for UDP sockets when not needed
+ https://bugs.webkit.org/show_bug.cgi?id=227253
+
+ Reviewed by Eric Carlson.
+
+ * Modules/mediastream/PeerConnectionBackend.h:
+ (WebCore::PeerConnectionBackend::shouldFilterICECandidates const):
+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+ (WebCore::LibWebRTCMediaEndpoint::setConfiguration):
+ * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
+ (WebCore::LibWebRTCMediaEndpoint::rtcSocketFactory):
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp:
+ (WebCore::LibWebRTCPeerConnectionBackend::disableICECandidateFiltering):
+ * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h:
+ * platform/mediastream/libwebrtc/LibWebRTCProvider.h:
+
2021-07-01 Dean Jackson <d...@apple.com>
Move BottomControlsBarHeight and InsideMargin to be computed at runtime
Modified: trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h (279482 => 279483)
--- trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -129,7 +129,7 @@
virtual void emulatePlatformEvent(const String& action) = 0;
void newICECandidate(String&& sdp, String&& mid, unsigned short sdpMLineIndex, String&& serverURL);
- void disableICECandidateFiltering();
+ virtual void disableICECandidateFiltering();
void enableICECandidateFiltering();
virtual void applyRotationForOutgoingVideoSources() { }
@@ -181,6 +181,8 @@
virtual void suspend() { }
virtual void resume() { }
+ bool shouldFilterICECandidates() const { return m_shouldFilterICECandidates; };
+
protected:
void fireICECandidateEvent(RefPtr<RTCIceCandidate>&&, String&& url);
void doneGatheringCandidates();
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (279482 => 279483)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp 2021-07-01 20:56:00 UTC (rev 279483)
@@ -94,7 +94,11 @@
if (!m_backend) {
if (!m_rtcSocketFactory) {
auto& document = downcast<Document>(*m_peerConnectionBackend.connection().scriptExecutionContext());
- m_rtcSocketFactory = client.createSocketFactory(document.userAgent(document.url()));
+ RegistrableDomain domain { document.url() };
+ bool isFirstParty = domain == RegistrableDomain(document.firstPartyForCookies());
+ m_rtcSocketFactory = client.createSocketFactory(document.userAgent(document.url()), isFirstParty, WTFMove(domain));
+ if (!m_peerConnectionBackend.shouldFilterICECandidates())
+ m_rtcSocketFactory->disableRelay();
}
m_backend = client.createPeerConnection(*this, m_rtcSocketFactory.get(), WTFMove(configuration));
return !!m_backend;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h (279482 => 279483)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -119,6 +119,7 @@
void suspend();
void resume();
+ LibWebRTCProvider::SuspendableSocketFactory* rtcSocketFactory() { return m_rtcSocketFactory.get(); }
private:
LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend&, LibWebRTCProvider&);
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (279482 => 279483)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp 2021-07-01 20:56:00 UTC (rev 279483)
@@ -102,6 +102,13 @@
m_endpoint->resume();
}
+void LibWebRTCPeerConnectionBackend::disableICECandidateFiltering()
+{
+ PeerConnectionBackend::disableICECandidateFiltering();
+ if (auto* factory = m_endpoint->rtcSocketFactory())
+ factory->disableRelay();
+}
+
static inline webrtc::PeerConnectionInterface::BundlePolicy bundlePolicyfromConfiguration(const MediaEndpointConfiguration& configuration)
{
switch (configuration.bundlePolicy) {
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h (279482 => 279483)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -110,6 +110,7 @@
void suspend() final;
void resume() final;
+ void disableICECandidateFiltering() final;
Ref<LibWebRTCMediaEndpoint> m_endpoint;
bool m_isLocalDescriptionSet { false };
Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h (279482 => 279483)
--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -62,6 +62,7 @@
namespace WebCore {
class LibWebRTCAudioModule;
+class RegistrableDomain;
struct PeerConnectionFactoryAndThreads;
struct RTCRtpCapabilities;
@@ -139,8 +140,9 @@
virtual ~SuspendableSocketFactory() = default;
virtual void suspend() { };
virtual void resume() { };
+ virtual void disableRelay() { };
};
- virtual std::unique_ptr<SuspendableSocketFactory> createSocketFactory(String&& /* userAgent */) { return nullptr; }
+ virtual std::unique_ptr<SuspendableSocketFactory> createSocketFactory(String&& /* userAgent */, bool /* isFirstParty */, RegistrableDomain&&) { return nullptr; }
protected:
LibWebRTCProvider() = default;
Modified: trunk/Source/WebKit/ChangeLog (279482 => 279483)
--- trunk/Source/WebKit/ChangeLog 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/ChangeLog 2021-07-01 20:56:00 UTC (rev 279483)
@@ -1,3 +1,31 @@
+2021-07-01 Youenn Fablet <you...@apple.com>
+
+ Disable relay for UDP sockets when not needed
+ https://bugs.webkit.org/show_bug.cgi?id=227253
+
+ Reviewed by Eric Carlson.
+
+ * NetworkProcess/webrtc/NetworkRTCProvider.cpp:
+ (WebKit::NetworkRTCProvider::createUDPSocket):
+ * NetworkProcess/webrtc/NetworkRTCProvider.h:
+ * NetworkProcess/webrtc/NetworkRTCProvider.messages.in:
+ * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h:
+ * NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm:
+ (WebKit::NetworkRTCUDPSocketCocoaConnections::create):
+ (WebKit::NetworkRTCUDPSocketCocoa::createUDPSocket):
+ (WebKit::NetworkRTCUDPSocketCocoa::NetworkRTCUDPSocketCocoa):
+ (WebKit::NetworkRTCUDPSocketCocoaConnections::NetworkRTCUDPSocketCocoaConnections):
+ (WebKit::NetworkRTCUDPSocketCocoaConnections::createNWConnection):
+ * WebKit.xcodeproj/project.pbxproj:
+ * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
+ (WebKit::RTCSocketFactory::RTCSocketFactory):
+ (WebKit::RTCSocketFactory::CreateUdpSocket):
+ (WebKit::LibWebRTCProvider::createSocketFactory):
+ * WebProcess/Network/webrtc/LibWebRTCProvider.h:
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
+ (WebKit::LibWebRTCSocketFactory::createUdpSocket):
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
+
2021-07-01 Wenson Hsieh <wenson_hs...@apple.com>
Selecting or dragging images that contain recognizable text is difficult in Mail compose
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp (279482 => 279483)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.cpp 2021-07-01 20:56:00 UTC (rev 279483)
@@ -132,11 +132,11 @@
addSocket(identifier, makeUnique<LibWebRTCSocketClient>(identifier, *this, WTFMove(socket), type, WTFMove(connection)));
}
-void NetworkRTCProvider::createUDPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
+void NetworkRTCProvider::createUDPSocket(LibWebRTCSocketIdentifier identifier, const RTCNetwork::SocketAddress& address, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain&& domain)
{
#if PLATFORM(COCOA)
if (m_platformUDPSocketsEnabled) {
- if (auto socket = NetworkRTCUDPSocketCocoa::createUDPSocket(identifier, *this, address.value, minPort, maxPort, m_ipcConnection.copyRef())) {
+ if (auto socket = NetworkRTCUDPSocketCocoa::createUDPSocket(identifier, *this, address.value, minPort, maxPort, m_ipcConnection.copyRef(), isFirstParty, isRelayDisabled, WTFMove(domain))) {
addSocket(identifier, WTFMove(socket));
return;
}
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h (279482 => 279483)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -52,6 +52,7 @@
}
namespace WebCore {
+class RegistrableDomain;
class SharedBuffer;
}
@@ -107,7 +108,7 @@
explicit NetworkRTCProvider(NetworkConnectionToWebProcess&);
void startListeningForIPC();
- void createUDPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t, uint16_t);
+ void createUDPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t, uint16_t, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain&&);
void createClientTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, const RTCNetwork::SocketAddress&, String&& userAgent, int);
void createServerTCPSocket(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&, uint16_t minPort, uint16_t maxPort, int);
void wrapNewTCPConnection(WebCore::LibWebRTCSocketIdentifier identifier, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier);
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in (279482 => 279483)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCProvider.messages.in 2021-07-01 20:56:00 UTC (rev 279483)
@@ -23,7 +23,7 @@
#if USE(LIBWEBRTC)
messages -> NetworkRTCProvider {
- CreateUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort)
+ CreateUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, WebCore::RegistrableDomain domain)
CreateServerTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, uint16_t minPort, uint16_t maxPort, int options)
CreateClientTCPSocket(WebCore::LibWebRTCSocketIdentifier identifier, WebKit::RTCNetwork::SocketAddress localAddress, WebKit::RTCNetwork::SocketAddress remoteAddress, String userAgent, int options)
WrapNewTCPConnection(WebCore::LibWebRTCSocketIdentifier identifier, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier)
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h (279482 => 279483)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -60,9 +60,9 @@
class NetworkRTCUDPSocketCocoa final : public NetworkRTCProvider::Socket {
WTF_MAKE_FAST_ALLOCATED;
public:
- static std::unique_ptr<NetworkRTCProvider::Socket> createUDPSocket(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, Ref<IPC::Connection>&&);
+ static std::unique_ptr<NetworkRTCProvider::Socket> createUDPSocket(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, Ref<IPC::Connection>&&, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
- NetworkRTCUDPSocketCocoa(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&);
+ NetworkRTCUDPSocketCocoa(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
~NetworkRTCUDPSocketCocoa();
private:
Modified: trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm (279482 => 279483)
--- trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/NetworkProcess/webrtc/NetworkRTCUDPSocketCocoa.mm 2021-07-01 20:56:00 UTC (rev 279483)
@@ -31,11 +31,22 @@
#include "DataReference.h"
#include "LibWebRTCNetworkMessages.h"
#include "Logging.h"
+#include "NWParametersSPI.h"
+#include <WebCore/RegistrableDomain.h>
#include <WebCore/STUNMessageParsing.h>
#include <dispatch/dispatch.h>
#include <wtf/BlockPtr.h>
+#include <wtf/SoftLinking.h>
#include <wtf/ThreadSafeRefCounted.h>
+#if HAVE(NWPARAMETERS_TRACKER_API)
+SOFT_LINK_LIBRARY(libnetworkextension)
+SOFT_LINK_CLASS(libnetworkextension, NEHelperTrackerDisposition_t)
+SOFT_LINK_CLASS(libnetworkextension, NEHelperTrackerAppInfoRef)
+SOFT_LINK_CLASS(libnetworkextension, NEHelperTrackerDomainContextRef)
+SOFT_LINK(libnetworkextension, NEHelperTrackerGetDisposition, NEHelperTrackerDisposition_t*, (NEHelperTrackerAppInfoRef *app_info_ref, CFArrayRef domains, NEHelperTrackerDomainContextRef *trackerDomainContextRef, CFIndex *trackerDomainIndex), (app_info_ref, domains, trackerDomainContextRef, trackerDomainIndex))
+#endif
+
namespace WebKit {
using namespace WebCore;
@@ -42,7 +53,7 @@
class NetworkRTCUDPSocketCocoaConnections : public ThreadSafeRefCounted<NetworkRTCUDPSocketCocoaConnections> {
public:
- static Ref<NetworkRTCUDPSocketCocoaConnections> create(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& provider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection) { return adoptRef(*new NetworkRTCUDPSocketCocoaConnections(identifier, provider, address, WTFMove(connection))); }
+ static Ref<NetworkRTCUDPSocketCocoaConnections> create(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& provider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain& domain) { return adoptRef(*new NetworkRTCUDPSocketCocoaConnections(identifier, provider, address, WTFMove(connection), isFirstParty, isRelayDisabled, domain)); }
void close();
void setOption(int option, int value);
@@ -49,13 +60,19 @@
void sendTo(const uint8_t*, size_t, const rtc::SocketAddress&, const rtc::PacketOptions&);
private:
- NetworkRTCUDPSocketCocoaConnections(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&);
+ NetworkRTCUDPSocketCocoaConnections(WebCore::LibWebRTCSocketIdentifier, NetworkRTCProvider&, const rtc::SocketAddress&, Ref<IPC::Connection>&&, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
RetainPtr<nw_connection_t> createNWConnection(const rtc::SocketAddress&);
void setupNWConnection(nw_connection_t, const rtc::SocketAddress&);
+ void configureParameters(nw_parameters_t, nw_ip_version_t);
WebCore::LibWebRTCSocketIdentifier m_identifier;
Ref<IPC::Connection> m_connection;
+#if HAVE(NWPARAMETERS_TRACKER_API)
+ bool m_isFirstParty { false };
+ bool m_isKnownTracker { false };
+#endif
+ bool m_shouldBypassRelay { false };
rtc::SocketAddress m_address;
RetainPtr<nw_listener_t> m_nwListener;
Lock m_nwConnectionsLock;
@@ -73,16 +90,15 @@
return queue;
}
-std::unique_ptr<NetworkRTCProvider::Socket> NetworkRTCUDPSocketCocoa::createUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, Ref<IPC::Connection>&& connection)
+std::unique_ptr<NetworkRTCProvider::Socket> NetworkRTCUDPSocketCocoa::createUDPSocket(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, Ref<IPC::Connection>&& connection, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain& domain)
{
- // FIXME: Decide how to use minPort/maxPort.
- return makeUnique<NetworkRTCUDPSocketCocoa>(identifier, rtcProvider, address, WTFMove(connection));
+ return makeUnique<NetworkRTCUDPSocketCocoa>(identifier, rtcProvider, address, WTFMove(connection), isFirstParty, isRelayDisabled, domain);
}
-NetworkRTCUDPSocketCocoa::NetworkRTCUDPSocketCocoa(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection)
+NetworkRTCUDPSocketCocoa::NetworkRTCUDPSocketCocoa(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain& domain)
: m_rtcProvider(rtcProvider)
, m_identifier(identifier)
- , m_nwConnections(NetworkRTCUDPSocketCocoaConnections::create(identifier, rtcProvider, address, WTFMove(connection)))
+ , m_nwConnections(NetworkRTCUDPSocketCocoaConnections::create(identifier, rtcProvider, address, WTFMove(connection), isFirstParty, isRelayDisabled, domain))
{
}
@@ -119,9 +135,24 @@
return rtc::SocketAddress { nw_endpoint_get_hostname(endpoint.get()), nw_endpoint_get_port(endpoint.get()) };
}
-NetworkRTCUDPSocketCocoaConnections::NetworkRTCUDPSocketCocoaConnections(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection)
+#if HAVE(NWPARAMETERS_TRACKER_API)
+static bool isKnownTracker(const WebCore::RegistrableDomain& domain)
+{
+ NSArray<NSString *> *domains = @[domain.string()];
+ NEHelperTrackerDomainContextRef *context = nil;
+ CFIndex index = 0;
+ return !!NEHelperTrackerGetDisposition(nullptr, (CFArrayRef)domains, context, &index);
+}
+#endif
+
+NetworkRTCUDPSocketCocoaConnections::NetworkRTCUDPSocketCocoaConnections(WebCore::LibWebRTCSocketIdentifier identifier, NetworkRTCProvider& rtcProvider, const rtc::SocketAddress& address, Ref<IPC::Connection>&& connection, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain& domain)
: m_identifier(identifier)
, m_connection(WTFMove(connection))
+#if HAVE(NWPARAMETERS_TRACKER_API)
+ , m_isFirstParty(isFirstParty)
+ , m_isKnownTracker(isKnownTracker(domain))
+#endif
+ , m_shouldBypassRelay(isRelayDisabled)
{
auto parameters = adoptNS(nw_parameters_create_secure_udp(NW_PARAMETERS_DISABLE_PROTOCOL, NW_PARAMETERS_DEFAULT_CONFIGURATION));
{
@@ -132,11 +163,7 @@
m_address = { nw_endpoint_get_hostname(localEndpoint.get()), nw_endpoint_get_port(localEndpoint.get()) };
nw_parameters_set_local_endpoint(parameters.get(), localEndpoint.get());
}
- {
- auto protocolStack = adoptNS(nw_parameters_copy_default_protocol_stack(parameters.get()));
- auto options = adoptNS(nw_protocol_stack_copy_internet_protocol(protocolStack.get()));
- nw_ip_options_set_version(options.get(), address.family() == AF_INET ? nw_ip_version_4 : nw_ip_version_6);
- }
+ configureParameters(parameters.get(), address.family() == AF_INET ? nw_ip_version_4 : nw_ip_version_6);
m_nwListener = adoptNS(nw_listener_create(parameters.get()));
nw_listener_set_queue(m_nwListener.get(), udpSocketQueue());
@@ -177,6 +204,20 @@
nw_listener_start(m_nwListener.get());
}
+void NetworkRTCUDPSocketCocoaConnections::configureParameters(nw_parameters_t parameters, nw_ip_version_t version)
+{
+ auto protocolStack = adoptNS(nw_parameters_copy_default_protocol_stack(parameters));
+ auto options = adoptNS(nw_protocol_stack_copy_internet_protocol(protocolStack.get()));
+ nw_ip_options_set_version(options.get(), version);
+
+ if (m_shouldBypassRelay)
+ nw_parameters_set_account_id(parameters, "com.apple.safari.peertopeer");
+#if HAVE(NWPARAMETERS_TRACKER_API)
+ nw_parameters_set_is_third_party_web_content(parameters, m_isFirstParty);
+ nw_parameters_set_is_known_tracker(parameters, m_isKnownTracker);
+#endif
+}
+
void NetworkRTCUDPSocketCocoaConnections::close()
{
Locker locker { m_nwConnectionsLock };
@@ -225,11 +266,7 @@
auto localEndpoint = adoptNS(nw_endpoint_create_host(hostAddress.c_str(), String::number(m_address.port()).utf8().data()));
nw_parameters_set_local_endpoint(parameters.get(), localEndpoint.get());
}
- {
- auto protocolStack = adoptNS(nw_parameters_copy_default_protocol_stack(parameters.get()));
- auto options = adoptNS(nw_protocol_stack_copy_internet_protocol(protocolStack.get()));
- nw_ip_options_set_version(options.get(), remoteAddress.family() == AF_INET ? nw_ip_version_4 : nw_ip_version_6);
- }
+ configureParameters(parameters.get(), remoteAddress.family() == AF_INET ? nw_ip_version_4 : nw_ip_version_6);
auto remoteHostAddress = remoteAddress.ipaddr().ToString();
if (remoteAddress.ipaddr().IsNil())
Added: trunk/Source/WebKit/Platform/spi/Cocoa/NWParametersSPI.h (0 => 279483)
--- trunk/Source/WebKit/Platform/spi/Cocoa/NWParametersSPI.h (rev 0)
+++ trunk/Source/WebKit/Platform/spi/Cocoa/NWParametersSPI.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <Network/Network.h>
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import <nw/private.h>
+
+#else
+
+WTF_EXTERN_C_BEGIN
+
+void nw_parameters_set_account_id(nw_parameters_t, const char * account_id);
+
+#if HAVE(NWPARAMETERS_TRACKER_API)
+void nw_parameters_set_is_third_party_web_content(nw_parameters_t, bool is_third_party_web_content);
+void nw_parameters_set_is_known_tracker(nw_parameters_t, bool is_known_tracker);
+#endif // HAVE(NWPARAMETERS_TRACKER_API)
+
+WTF_EXTERN_C_END
+
+#endif // USE(APPLE_INTERNAL_SDK)
Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (279482 => 279483)
--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj 2021-07-01 20:56:00 UTC (rev 279483)
@@ -945,6 +945,7 @@
41D129DA1F3D101800D15E47 /* WebCacheStorageProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 41D129D91F3D101400D15E47 /* WebCacheStorageProvider.h */; };
41DC45961E3D6E2200B11F51 /* NetworkRTCProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DC45941E3D6E1E00B11F51 /* NetworkRTCProvider.h */; };
41DC459C1E3DBB2800B11F51 /* LibWebRTCSocketClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DC459A1E3DBB2400B11F51 /* LibWebRTCSocketClient.h */; };
+ 41DD72AB2682167300A90C71 /* NWParametersSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DD72AA2682167300A90C71 /* NWParametersSPI.h */; };
41DE7C6C22278F1E00532B65 /* ServiceWorkerFetchTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41518536222704F6005430C6 /* ServiceWorkerFetchTask.cpp */; };
41E0A7CB23B645CD00561060 /* WebSocketChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 417915AC2256BB7400D6F97E /* WebSocketChannel.cpp */; };
41F060E11654318500F3281C /* WebSocketChannelMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41F060DD1654317500F3281C /* WebSocketChannelMessageReceiver.cpp */; };
@@ -3843,6 +3844,7 @@
41DC45A01E3DC53C00B11F51 /* WebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = WebRTCResolver.cpp; path = Network/webrtc/WebRTCResolver.cpp; sourceTree = "<group>"; };
41DD72A6267B8C3000A90C71 /* NetworkRTCUDPSocketCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkRTCUDPSocketCocoa.mm; sourceTree = "<group>"; };
41DD72A7267B8C3100A90C71 /* NetworkRTCUDPSocketCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NetworkRTCUDPSocketCocoa.h; sourceTree = "<group>"; };
+ 41DD72AA2682167300A90C71 /* NWParametersSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NWParametersSPI.h; sourceTree = "<group>"; };
41E0A7C623B6397800561060 /* LibWebRTCCodecsProxy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LibWebRTCCodecsProxy.h; sourceTree = "<group>"; };
41E0A7C723B6397900561060 /* LibWebRTCCodecsProxy.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = LibWebRTCCodecsProxy.messages.in; sourceTree = "<group>"; };
41E0A7C823B6397900561060 /* LibWebRTCCodecsProxy.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = LibWebRTCCodecsProxy.mm; sourceTree = "<group>"; };
@@ -7938,6 +7940,7 @@
574217912400E098002B303D /* LocalAuthenticationSPI.h */,
57B826402304EB3E00B72EB0 /* NearFieldSPI.h */,
3754D5441B3A29FD003A4C7F /* NSInvocationSPI.h */,
+ 41DD72AA2682167300A90C71 /* NWParametersSPI.h */,
5CB6AE432609799C00B6ED5A /* ReasonSPI.h */,
0E97D74C200E8FF300BF6643 /* SafeBrowsingSPI.h */,
448AC24D267135A600B28921 /* SynapseSPI.h */,
@@ -12164,6 +12167,7 @@
1C20936022318CB000026A39 /* NSAttributedString.h in Headers */,
1C2184022233872800BAC700 /* NSAttributedStringPrivate.h in Headers */,
3754D5451B3A29FD003A4C7F /* NSInvocationSPI.h in Headers */,
+ 41DD72AB2682167300A90C71 /* NWParametersSPI.h in Headers */,
BC8ACA1316670D89004C1941 /* ObjCObjectGraph.h in Headers */,
7CF47FFB17275C57008ACB91 /* PageBanner.h in Headers */,
BC6EDAA6111271C600E7678B /* PageClient.h in Headers */,
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp (279482 => 279483)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp 2021-07-01 20:56:00 UTC (rev 279483)
@@ -37,6 +37,7 @@
#include "WebPage.h"
#include "WebProcess.h"
#include <WebCore/Page.h>
+#include <WebCore/RegistrableDomain.h>
#include <WebCore/Settings.h>
#include <webrtc/api/async_resolver_factory.h>
#include <webrtc/pc/peer_connection_factory.h>
@@ -87,7 +88,7 @@
class RTCSocketFactory final : public LibWebRTCProvider::SuspendableSocketFactory {
WTF_MAKE_FAST_ALLOCATED;
public:
- explicit RTCSocketFactory(String&& userAgent);
+ RTCSocketFactory(String&& userAgent, bool isFirstParty, RegistrableDomain&&);
private:
// SuspendableSocketFactory
@@ -97,19 +98,25 @@
rtc::AsyncResolverInterface* CreateAsyncResolver() final;
void suspend() final;
void resume() final;
+ void disableRelay() final { m_isRelayDisabled = true; }
private:
String m_userAgent;
+ bool m_isFirstParty { false };
+ bool m_isRelayDisabled { false };
+ RegistrableDomain m_domain;
};
-RTCSocketFactory::RTCSocketFactory(String&& userAgent)
+RTCSocketFactory::RTCSocketFactory(String&& userAgent, bool isFirstParty, RegistrableDomain&& domain)
: m_userAgent(WTFMove(userAgent))
+ , m_isFirstParty(isFirstParty)
+ , m_domain(WTFMove(domain))
{
}
rtc::AsyncPacketSocket* RTCSocketFactory::CreateUdpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
{
- return WebProcess::singleton().libWebRTCNetwork().socketFactory().createUdpSocket(this, address, minPort, maxPort);
+ return WebProcess::singleton().libWebRTCNetwork().socketFactory().createUdpSocket(this, address, minPort, maxPort, m_isFirstParty, m_isRelayDisabled, m_domain);
}
rtc::AsyncPacketSocket* RTCSocketFactory::CreateServerTcpSocket(const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, int options)
@@ -150,9 +157,9 @@
WebProcess::singleton().libWebRTCNetwork().setAsActive();
}
-std::unique_ptr<LibWebRTCProvider::SuspendableSocketFactory> LibWebRTCProvider::createSocketFactory(String&& userAgent)
+std::unique_ptr<LibWebRTCProvider::SuspendableSocketFactory> LibWebRTCProvider::createSocketFactory(String&& userAgent, bool isFirstParty, RegistrableDomain&& domain)
{
- return makeUnique<RTCSocketFactory>(WTFMove(userAgent));
+ return makeUnique<RTCSocketFactory>(WTFMove(userAgent), isFirstParty, WTFMove(domain));
}
RefPtr<RTCDataChannelRemoteHandlerConnection> LibWebRTCProvider::createRTCDataChannelRemoteHandlerConnection()
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h (279482 => 279483)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -52,7 +52,7 @@
explicit LibWebRTCProvider(WebPage&);
private:
- std::unique_ptr<SuspendableSocketFactory> createSocketFactory(String&& /* userAgent */) final;
+ std::unique_ptr<SuspendableSocketFactory> createSocketFactory(String&& /* userAgent */, bool /* isFirstParty */, WebCore::RegistrableDomain&&) final;
rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::PacketSocketFactory*, webrtc::PeerConnectionInterface::RTCConfiguration&&) final;
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp (279482 => 279483)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2021-07-01 20:56:00 UTC (rev 279483)
@@ -85,19 +85,19 @@
return socket.release();
}
-rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createUdpSocket(const void* socketGroup, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
+rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createUdpSocket(const void* socketGroup, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain& domain)
{
ASSERT(!WTF::isMainRunLoop());
auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::UDP, address, rtc::SocketAddress());
if (m_connection)
- m_connection->send(Messages::NetworkRTCProvider::CreateUDPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort), 0);
+ m_connection->send(Messages::NetworkRTCProvider::CreateUDPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort, isFirstParty, isRelayDisabled, domain), 0);
else {
callOnMainRunLoop([] {
WebProcess::singleton().ensureNetworkProcessConnection();
});
- m_pendingMessageTasks.append([identifier = socket->identifier(), address = RTCNetwork::SocketAddress(address), minPort, maxPort](auto& connection) {
- connection.send(Messages::NetworkRTCProvider::CreateUDPSocket(identifier, address, minPort, maxPort), 0);
+ m_pendingMessageTasks.append([identifier = socket->identifier(), address = RTCNetwork::SocketAddress(address), minPort, maxPort, isFirstParty, isRelayDisabled, domain](auto& connection) {
+ connection.send(Messages::NetworkRTCProvider::CreateUDPSocket(identifier, address, minPort, maxPort, isFirstParty, isRelayDisabled, domain), 0);
});
}
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h (279482 => 279483)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2021-07-01 20:46:56 UTC (rev 279482)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2021-07-01 20:56:00 UTC (rev 279483)
@@ -51,7 +51,7 @@
LibWebRTCSocket* socket(WebCore::LibWebRTCSocketIdentifier identifier) { return m_sockets.get(identifier); }
void forSocketInGroup(const void* socketGroup, const Function<void(LibWebRTCSocket&)>&);
- rtc::AsyncPacketSocket* createUdpSocket(const void* socketGroup, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort);
+ rtc::AsyncPacketSocket* createUdpSocket(const void* socketGroup, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, bool isFirstParty, bool isRelayDisabled, const WebCore::RegistrableDomain&);
rtc::AsyncPacketSocket* createServerTcpSocket(const void* socketGroup, const rtc::SocketAddress&, uint16_t minPort, uint16_t maxPort, int options);
rtc::AsyncPacketSocket* createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions&);
rtc::AsyncPacketSocket* createNewConnectionSocket(LibWebRTCSocket&, WebCore::LibWebRTCSocketIdentifier newConnectionSocketIdentifier, const rtc::SocketAddress&);