Title: [261945] branches/safari-609-branch

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to