Diff
Modified: branches/safari-609-branch/LayoutTests/ChangeLog (261944 => 261945)
--- branches/safari-609-branch/LayoutTests/ChangeLog 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/LayoutTests/ChangeLog 2020-05-20 20:12:43 UTC (rev 261945)
@@ -1,3 +1,17 @@
+2020-05-19 Russell Epstein <[email protected]>
+
+ Apply patch. rdar://problem/63156096
+
+ 2020-05-19 Youenn Fablet <[email protected]>
+
+ Sending WebRTC network packets should not go through the main thread
+ https://bugs.webkit.org/show_bug.cgi?id=211291
+
+ Reviewed by Eric Carlson.
+
+ webrtc/datachannel/basic-tcp.html:
+ Make sure to provide end of candidates, now that we are getting much faster with networking.
+
2020-05-13 Alan Coon <[email protected]>
Cherry-pick r259892. rdar://problem/63189085
Modified: branches/safari-609-branch/LayoutTests/webrtc/datachannel/basic-tcp.html (261944 => 261945)
--- branches/safari-609-branch/LayoutTests/webrtc/datachannel/basic-tcp.html 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/LayoutTests/webrtc/datachannel/basic-tcp.html 2020-05-20 20:12:43 UTC (rev 261945)
@@ -62,7 +62,7 @@
remoteChannel = event.channel;
remoteChannel._onmessage_ = receiveMessages;
};
- }, { filterOutICECandidate: (candidate) => { return candidate && candidate.candidate.toLowerCase().indexOf("tcp") == -1; } });
+ }, { filterOutICECandidate: (candidate) => { return !candidate || candidate.candidate.toLowerCase().indexOf("tcp") !== -1; } });
setTimeout(() => { reject("Test timed out"); }, 5000);
});
}, "Basic data channel exchange from offerer to receiver using TCP only");
Modified: branches/safari-609-branch/Source/WebCore/ChangeLog (261944 => 261945)
--- branches/safari-609-branch/Source/WebCore/ChangeLog 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebCore/ChangeLog 2020-05-20 20:12:43 UTC (rev 261945)
@@ -1,3 +1,21 @@
+2020-05-19 Russell Epstein <[email protected]>
+
+ Apply patch. rdar://problem/63156096
+
+ 2020-05-19 Youenn Fablet <[email protected]>
+
+ Sending WebRTC network packets should not go through the main thread
+ https://bugs.webkit.org/show_bug.cgi?id=211291
+
+ Reviewed by Eric Carlson.
+
+ Covered by existing tests.
+
+ * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp:
+ (WebCore::LibWebRTCProvider::getStaticFactoryAndThreads):
+ * platform/mediastream/libwebrtc/LibWebRTCProvider.h:
+ Add the ability for WebKit LibWebRTCProvider to do some processing on creation of the RTC threads.
+
2020-05-12 Alan Coon <[email protected]>
Cherry-pick r259853. rdar://problem/63156090
Modified: branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp (261944 => 261945)
--- branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp 2020-05-20 20:12:43 UTC (rev 261945)
@@ -189,7 +189,7 @@
return factoryAndThreads.get();
}
-static inline PeerConnectionFactoryAndThreads& getStaticFactoryAndThreads(bool useNetworkThreadWithSocketServer)
+PeerConnectionFactoryAndThreads& LibWebRTCProvider::getStaticFactoryAndThreads(bool useNetworkThreadWithSocketServer)
{
auto& factoryAndThreads = staticFactoryAndThreads();
@@ -198,6 +198,7 @@
if (!factoryAndThreads.networkThread) {
factoryAndThreads.networkThreadWithSocketServer = useNetworkThreadWithSocketServer;
initializePeerConnectionFactoryAndThreads(factoryAndThreads);
+ startedNetworkThread();
}
return factoryAndThreads;
}
Modified: branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h (261944 => 261945)
--- branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h 2020-05-20 20:12:43 UTC (rev 261945)
@@ -58,6 +58,7 @@
namespace WebCore {
class LibWebRTCAudioModule;
+struct PeerConnectionFactoryAndThreads;
struct RTCRtpCapabilities;
enum class MDNSRegisterError { NotImplemented, BadParameter, DNSSD, Internal, Timeout };
@@ -138,6 +139,10 @@
virtual std::unique_ptr<webrtc::VideoDecoderFactory> createDecoderFactory();
virtual std::unique_ptr<webrtc::VideoEncoderFactory> createEncoderFactory();
+ virtual void startedNetworkThread() { };
+
+ PeerConnectionFactoryAndThreads& getStaticFactoryAndThreads(bool useNetworkThreadWithSocketServer);
+
bool m_enableEnumeratingAllNetworkInterfaces { false };
// FIXME: Remove m_useNetworkThreadWithSocketServer member variable and make it a global.
bool m_useNetworkThreadWithSocketServer { true };
Modified: branches/safari-609-branch/Source/WebKit/ChangeLog (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/ChangeLog 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/ChangeLog 2020-05-20 20:12:43 UTC (rev 261945)
@@ -1,3 +1,53 @@
+2020-05-19 Russell Epstein <[email protected]>
+
+ Apply patch. rdar://problem/63156096
+
+ 2020-05-19 Youenn Fablet <[email protected]>
+
+ Sending WebRTC network packets should not go through the main thread
+ https://bugs.webkit.org/show_bug.cgi?id=211291
+
+ Reviewed by Eric Carlson.
+
+ Following on receiving RTC packets from a background thread, we also send RTC packets from a background thread.
+ Creation of the sockets also happens in a background thread.
+ LibWebRTCNetwork is getting the connection whenever a new connection to network process is created.
+ It will then hop to the RTC network thread to set the IPC connection to the libwebrtc socket factory.
+
+ At creation of the socket, we get the IPC connection to the network process and keep a ref in the RTC socket.
+ In case network process crashed and the IPC connection of the RTC network is null, we hop to the main thread to create a new IPC connection.
+ This will fail the creation of the socket (as well as new ones as well) as long as the IPC connection to network process is not valid again.
+
+ Covered by existing tests.
+
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.cpp:
+ (WebKit::LibWebRTCNetwork::setAsActive):
+ (WebKit::LibWebRTCNetwork::setConnection):
+ (WebKit::LibWebRTCNetwork::dispatchToThread):
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.h:
+ (WebKit::LibWebRTCNetwork::connection):
+ (WebKit::LibWebRTCNetwork::isActive const):
+ * WebProcess/Network/webrtc/LibWebRTCProvider.cpp:
+ (WebKit::LibWebRTCProvider::startedNetworkThread):
+ * WebProcess/Network/webrtc/LibWebRTCProvider.h:
+ * WebProcess/Network/webrtc/LibWebRTCSocket.cpp:
+ (WebKit::LibWebRTCSocket::SendTo):
+ (WebKit::LibWebRTCSocket::Close):
+ (WebKit::LibWebRTCSocket::SetOption):
+ (WebKit::LibWebRTCSocket::suspend):
+ * WebProcess/Network/webrtc/LibWebRTCSocket.h:
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
+ (WebKit::LibWebRTCSocketFactory::setConnection):
+ (WebKit::LibWebRTCSocketFactory::connection):
+ (WebKit::LibWebRTCSocketFactory::createServerTcpSocket):
+ (WebKit::LibWebRTCSocketFactory::createUdpSocket):
+ (WebKit::LibWebRTCSocketFactory::createClientTcpSocket):
+ (WebKit::LibWebRTCSocketFactory::createNewConnectionSocket):
+ (WebKit::LibWebRTCSocketFactory::addSocket):
+ (WebKit::LibWebRTCSocketFactory::removeSocket):
+ (WebKit::LibWebRTCSocketFactory::forSocketInGroup):
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
+
2020-05-19 Alan Coon <[email protected]>
Cherry-pick r261719. rdar://problem/63156066
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2020-05-20 20:12:43 UTC (rev 261945)
@@ -39,6 +39,19 @@
setConnection(nullptr);
}
+void LibWebRTCNetwork::setAsActive()
+{
+ ASSERT(!m_isActive);
+ m_isActive = true;
+#if USE(LIBWEBRTC)
+ if (m_connection) {
+ WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, connection = m_connection]() mutable {
+ m_socketFactory.setConnection(WTFMove(connection));
+ });
+ }
+#endif
+}
+
void LibWebRTCNetwork::networkProcessCrashed()
{
setConnection(nullptr);
@@ -53,6 +66,11 @@
#if USE(LIBWEBRTC)
if (m_connection)
m_connection->removeThreadMessageReceiver(Messages::LibWebRTCNetwork::messageReceiverName());
+ if (m_isActive) {
+ WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, connection]() mutable {
+ m_socketFactory.setConnection(WTFMove(connection));
+ });
+ }
#endif
m_connection = WTFMove(connection);
#if USE(LIBWEBRTC)
@@ -61,18 +79,9 @@
#endif
}
-bool LibWebRTCNetwork::isActive() const
-{
-#if USE(LIBWEBRTC)
- return WebCore::LibWebRTCProvider::hasWebRTCThreads();
-#else
- return false;
-#endif
-}
-
void LibWebRTCNetwork::dispatchToThread(Function<void()>&& callback)
{
- if (!isActive()) {
+ if (!m_isActive) {
RELEASE_LOG_ERROR(WebRTC, "Received WebRTCSocket message while libWebRTCNetwork is not active");
return;
}
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2020-05-20 20:12:43 UTC (rev 261945)
@@ -41,10 +41,12 @@
LibWebRTCNetwork() = default;
~LibWebRTCNetwork();
+ IPC::Connection* connection() { return m_connection.get(); }
void setConnection(RefPtr<IPC::Connection>&&);
+
void networkProcessCrashed();
- bool isActive() const;
+ bool isActive() const { return m_isActive; }
#if USE(LIBWEBRTC)
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
@@ -61,6 +63,8 @@
WebMDNSRegister& mdnsRegister() { return m_mdnsRegister; }
#endif
+ void setAsActive();
+
private:
#if USE(LIBWEBRTC)
void signalReadPacket(WebCore::LibWebRTCSocketIdentifier, const IPC::DataReference&, const RTCNetwork::IPAddress&, uint16_t port, int64_t);
@@ -81,6 +85,7 @@
#if ENABLE(WEB_RTC)
WebMDNSRegister m_mdnsRegister;
#endif
+ bool m_isActive { false };
RefPtr<IPC::Connection> m_connection;
};
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.cpp 2020-05-20 20:12:43 UTC (rev 261945)
@@ -130,6 +130,11 @@
});
}
+void LibWebRTCProvider::startedNetworkThread()
+{
+ WebProcess::singleton().libWebRTCNetwork().setAsActive();
+}
+
std::unique_ptr<LibWebRTCProvider::SuspendableSocketFactory> LibWebRTCProvider::createSocketFactory(String&& userAgent)
{
return makeUnique<RTCSocketFactory>(WTFMove(userAgent));
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCProvider.h 2020-05-20 20:12:43 UTC (rev 261945)
@@ -57,6 +57,7 @@
void unregisterMDNSNames(uint64_t documentIdentifier) final;
void registerMDNSName(uint64_t documentIdentifier, const String& ipAddress, CompletionHandler<void(MDNSNameOrError&&)>&&) final;
void disableNonLocalhostConnections() final;
+ void startedNetworkThread() final;
#if PLATFORM(COCOA)
std::unique_ptr<webrtc::VideoDecoderFactory> createDecoderFactory() final;
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.cpp (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.cpp 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.cpp 2020-05-20 20:12:43 UTC (rev 261945)
@@ -57,13 +57,6 @@
m_factory.removeSocket(*this);
}
-void LibWebRTCSocket::sendOnMainThread(Function<void(IPC::Connection&)>&& callback)
-{
- callOnMainThread([callback = WTFMove(callback)]() {
- callback(WebProcess::singleton().ensureNetworkProcessConnection().connection());
- });
-}
-
rtc::SocketAddress LibWebRTCSocket::GetLocalAddress() const
{
return m_localAddress;
@@ -135,32 +128,29 @@
int LibWebRTCSocket::SendTo(const void *value, size_t size, const rtc::SocketAddress& address, const rtc::PacketOptions& options)
{
- if (!willSend(size))
+ auto* connection = m_factory.connection();
+ if (!connection || !willSend(size))
return -1;
if (m_isSuspended)
return size;
- auto buffer = WebCore::SharedBuffer::create(static_cast<const uint8_t*>(value), size);
- auto identifier = this->identifier();
+ IPC::DataReference data(static_cast<const uint8_t*>(value), size);
+ connection->send(Messages::NetworkRTCSocket::SendTo { data, RTCNetwork::SocketAddress { address }, RTCPacketOptions { options } }, m_identifier);
- sendOnMainThread([identifier, buffer = WTFMove(buffer), address, options](auto& connection) {
- IPC::DataReference data(reinterpret_cast<const uint8_t*>(buffer->data()), buffer->size());
- connection.send(Messages::NetworkRTCSocket::SendTo { data, RTCNetwork::SocketAddress { address }, RTCPacketOptions { options } }, identifier);
- });
return size;
}
int LibWebRTCSocket::Close()
{
- if (m_state == STATE_CLOSED)
+ auto* connection = m_factory.connection();
+ if (!connection || m_state == STATE_CLOSED)
return 0;
m_state = STATE_CLOSED;
- sendOnMainThread([identifier = identifier()](auto& connection) {
- connection.send(Messages::NetworkRTCSocket::Close(), identifier);
- });
+ connection->send(Messages::NetworkRTCSocket::Close(), m_identifier);
+
return 0;
}
@@ -180,9 +170,9 @@
m_options[option] = value;
- sendOnMainThread([identifier = identifier(), option, value](auto& connection) {
- connection.send(Messages::NetworkRTCSocket::SetOption(option, value), identifier);
- });
+ if (auto* connection = m_factory.connection())
+ connection->send(Messages::NetworkRTCSocket::SetOption(option, value), m_identifier);
+
return 0;
}
@@ -207,11 +197,11 @@
m_isSuspended = true;
// On suspend, we close TCP sockets as we cannot make sure packets are delivered reliably.
- if (m_type != Type::UDP) {
- sendOnMainThread([identifier = identifier()](auto& connection) {
- connection.send(Messages::NetworkRTCSocket::Close { }, identifier);
- });
- }
+ if (m_type == Type::UDP)
+ return;
+
+ if (auto* connection = m_factory.connection())
+ connection->send(Messages::NetworkRTCSocket::Close { }, m_identifier);
}
} // namespace WebKit
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.h (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.h 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocket.h 2020-05-20 20:12:43 UTC (rev 261945)
@@ -85,8 +85,6 @@
int GetOption(rtc::Socket::Option, int*) final;
int SetOption(rtc::Socket::Option, int) final;
- static void sendOnMainThread(Function<void(IPC::Connection&)>&&);
-
LibWebRTCSocketFactory& m_factory;
WebCore::LibWebRTCSocketIdentifier m_identifier;
Type m_type;
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2020-05-20 20:12:43 UTC (rev 261945)
@@ -28,6 +28,8 @@
#if USE(LIBWEBRTC)
+#include "LibWebRTCNetwork.h"
+#include "Logging.h"
#include "NetworkProcessConnection.h"
#include "NetworkRTCMonitorMessages.h"
#include "NetworkRTCProviderMessages.h"
@@ -47,64 +49,96 @@
return result;
}
+void LibWebRTCSocketFactory::setConnection(RefPtr<IPC::Connection>&& connection)
+{
+ ASSERT(!WTF::isMainRunLoop());
+ m_connection = WTFMove(connection);
+}
+
+IPC::Connection* LibWebRTCSocketFactory::connection()
+{
+ ASSERT(!WTF::isMainRunLoop());
+ return m_connection.get();
+}
+
rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createServerTcpSocket(const void* socketGroup, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort, int options)
{
+ ASSERT(!WTF::isMainRunLoop());
+ if (!m_connection) {
+ RELEASE_LOG(WebRTC, "No connection to create server TCP socket");
+ callOnMainThread([] {
+ WebProcess::singleton().ensureNetworkProcessConnection();
+ });
+ return nullptr;
+ }
+
auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::ServerTCP, address, rtc::SocketAddress());
- callOnMainThread([identifier = socket->identifier(), address = prepareSocketAddress(address, m_disableNonLocalhostConnections), minPort, maxPort, options]() {
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::CreateServerTCPSocket(identifier, RTCNetwork::SocketAddress(address), minPort, maxPort, options), 0)) {
- // FIXME: Set error back to socket
- return;
- }
+ m_connection->send(Messages::NetworkRTCProvider::CreateServerTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort, options), 0);
- });
return socket.release();
}
rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createUdpSocket(const void* socketGroup, const rtc::SocketAddress& address, uint16_t minPort, uint16_t maxPort)
{
+ ASSERT(!WTF::isMainRunLoop());
+ if (!m_connection) {
+ RELEASE_LOG(WebRTC, "No connection to create UDP socket");
+ callOnMainThread([] {
+ WebProcess::singleton().ensureNetworkProcessConnection();
+ });
+ return nullptr;
+ }
+
auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::UDP, address, rtc::SocketAddress());
- callOnMainThread([identifier = socket->identifier(), address = prepareSocketAddress(address, m_disableNonLocalhostConnections), minPort, maxPort]() {
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::CreateUDPSocket(identifier, RTCNetwork::SocketAddress(address), minPort, maxPort), 0)) {
- // FIXME: Set error back to socket
- return;
- }
- });
+ m_connection->send(Messages::NetworkRTCProvider::CreateUDPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort), 0);
+
return socket.release();
}
rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createClientTcpSocket(const void* socketGroup, const rtc::SocketAddress& localAddress, const rtc::SocketAddress& remoteAddress, String&& userAgent, const rtc::PacketSocketTcpOptions& options)
{
+ ASSERT(!WTF::isMainRunLoop());
+ if (!m_connection) {
+ RELEASE_LOG(WebRTC, "No connection to create client TCP socket");
+ callOnMainThread([] {
+ WebProcess::singleton().ensureNetworkProcessConnection();
+ });
+ return nullptr;
+ }
+
auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::ClientTCP, localAddress, remoteAddress);
socket->setState(LibWebRTCSocket::STATE_CONNECTING);
// FIXME: We only transfer options.opts but should also handle other members.
- callOnMainThread([identifier = socket->identifier(), localAddress = prepareSocketAddress(localAddress, m_disableNonLocalhostConnections), remoteAddress = prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections), userAgent = WTFMove(userAgent).isolatedCopy(), options = options.opts]() {
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, RTCNetwork::SocketAddress(localAddress), RTCNetwork::SocketAddress(remoteAddress), userAgent, options), 0)) {
- // FIXME: Set error back to socket
- return;
- }
- });
+ m_connection->send(Messages::NetworkRTCProvider::CreateClientTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, options.opts), 0);
+
return socket.release();
}
rtc::AsyncPacketSocket* LibWebRTCSocketFactory::createNewConnectionSocket(LibWebRTCSocket& serverSocket, LibWebRTCSocketIdentifier newConnectionSocketIdentifier, const rtc::SocketAddress& remoteAddress)
{
+ ASSERT(!WTF::isMainRunLoop());
+ if (!m_connection) {
+ RELEASE_LOG(WebRTC, "No connection to create incoming TCP socket");
+ callOnMainThread([] {
+ WebProcess::singleton().ensureNetworkProcessConnection();
+ });
+ return nullptr;
+ }
+
auto socket = makeUnique<LibWebRTCSocket>(*this, serverSocket.socketGroup(), LibWebRTCSocket::Type::ServerConnectionTCP, serverSocket.localAddress(), remoteAddress);
socket->setState(LibWebRTCSocket::STATE_CONNECTED);
- callOnMainThread([identifier = socket->identifier(), newConnectionSocketIdentifier]() {
- if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkRTCProvider::WrapNewTCPConnection(identifier, newConnectionSocketIdentifier), 0)) {
- // FIXME: Set error back to socket
- return;
- }
- });
+ m_connection->send(Messages::NetworkRTCProvider::WrapNewTCPConnection(socket->identifier(), newConnectionSocketIdentifier), 0);
+
return socket.release();
}
void LibWebRTCSocketFactory::addSocket(LibWebRTCSocket& socket)
{
+ ASSERT(!WTF::isMainRunLoop());
ASSERT(!m_sockets.contains(socket.identifier()));
m_sockets.add(socket.identifier(), &socket);
}
@@ -111,6 +145,7 @@
void LibWebRTCSocketFactory::removeSocket(LibWebRTCSocket& socket)
{
+ ASSERT(!WTF::isMainRunLoop());
ASSERT(m_sockets.contains(socket.identifier()));
m_sockets.remove(socket.identifier());
}
@@ -117,6 +152,7 @@
void LibWebRTCSocketFactory::forSocketInGroup(const void* socketGroup, const Function<void(LibWebRTCSocket&)>& callback)
{
+ ASSERT(!WTF::isMainRunLoop());
for (auto* socket : m_sockets.values()) {
if (socket->socketGroup() == socketGroup)
callback(*socket);
Modified: branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h (261944 => 261945)
--- branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2020-05-20 20:12:38 UTC (rev 261944)
+++ branches/safari-609-branch/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2020-05-20 20:12:43 UTC (rev 261945)
@@ -37,11 +37,12 @@
namespace WebKit {
+class LibWebRTCNetwork;
class LibWebRTCSocket;
class LibWebRTCSocketFactory {
public:
- LibWebRTCSocketFactory() { }
+ LibWebRTCSocketFactory() = default;
void addSocket(LibWebRTCSocket&);
void removeSocket(LibWebRTCSocket&);
@@ -59,6 +60,9 @@
void disableNonLocalhostConnections() { m_disableNonLocalhostConnections = true; }
+ void setConnection(RefPtr<IPC::Connection>&&);
+ IPC::Connection* connection();
+
private:
// We cannot own sockets, clients of the factory are responsible to free them.
HashMap<WebCore::LibWebRTCSocketIdentifier, LibWebRTCSocket*> m_sockets;
@@ -67,6 +71,8 @@
HashMap<uint64_t, std::unique_ptr<LibWebRTCResolver>> m_resolvers;
static uint64_t s_uniqueResolverIdentifier;
bool m_disableNonLocalhostConnections { false };
+
+ RefPtr<IPC::Connection> m_connection;
};
} // namespace WebKit