Log Message
NetworkConnectionToWebProcess should not handle NetworkRTCProvider messages https://bugs.webkit.org/show_bug.cgi?id=214547
Reviewed by Alex Christensen. Source/WebKit: Normally NetworkRTCProvider is created when starting to monitor the network. In case network process is crashing though, there might be requests to open RTC socket on the new network process which has not started to monitor the network. In that case, we will go through NetworkConnectionToWebProcess as NetworkRTCProvider is not yet created. To properly handle this case, on web process side, we send an IPC message to explictly create the NetworkRTCProvider. Once done, we set the IPC connection to the socket factory which will start sending messages to open sockets if needed. Until its connection is set, the socket factory will buffer messages to open sockets. Covered by test no longer crashing in debug. * NetworkProcess/NetworkConnectionToWebProcess.cpp: (WebKit::NetworkConnectionToWebProcess::didReceiveMessage): (WebKit::NetworkConnectionToWebProcess::createRTCProvider): * NetworkProcess/NetworkConnectionToWebProcess.h: * NetworkProcess/NetworkConnectionToWebProcess.messages.in: * WebProcess/Network/webrtc/LibWebRTCNetwork.cpp: (WebKit::LibWebRTCNetwork::setAsActive): (WebKit::LibWebRTCNetwork::setConnection): (WebKit::LibWebRTCNetwork::setSocketFactoryConnection): * WebProcess/Network/webrtc/LibWebRTCNetwork.h: * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp: (WebKit::LibWebRTCSocketFactory::setConnection): (WebKit::LibWebRTCSocketFactory::createServerTcpSocket): (WebKit::LibWebRTCSocketFactory::createUdpSocket): (WebKit::LibWebRTCSocketFactory::createClientTcpSocket): (WebKit::LibWebRTCSocketFactory::createNewConnectionSocket): * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h: LayoutTests: * platform/mac/TestExpectations:
Modified Paths
- trunk/LayoutTests/ChangeLog
- trunk/LayoutTests/platform/mac/TestExpectations
- trunk/Source/WebKit/ChangeLog
- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp
- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h
- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp
- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h
Diff
Modified: trunk/LayoutTests/ChangeLog (264664 => 264665)
--- trunk/LayoutTests/ChangeLog 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/LayoutTests/ChangeLog 2020-07-21 18:26:39 UTC (rev 264665)
@@ -1,3 +1,12 @@
+2020-07-21 Youenn Fablet <you...@apple.com>
+
+ NetworkConnectionToWebProcess should not handle NetworkRTCProvider messages
+ https://bugs.webkit.org/show_bug.cgi?id=214547
+
+ Reviewed by Alex Christensen.
+
+ * platform/mac/TestExpectations:
+
2020-07-21 Sihui Liu <sihui_...@appe.com>
REGRESSION(r264486): ASSERTION FAILED: ASSERT_NOT_REACHED() in NetworkProcessPlatformStrategies::createBlobRegistry
Modified: trunk/LayoutTests/platform/mac/TestExpectations (264664 => 264665)
--- trunk/LayoutTests/platform/mac/TestExpectations 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/LayoutTests/platform/mac/TestExpectations 2020-07-21 18:26:39 UTC (rev 264665)
@@ -1910,8 +1910,6 @@
webkit.org/b/212219 media/track/track-cue-missing.html [ Pass Failure ]
-webkit.org/b/212218 webrtc/datachannel/gather-candidates-networkprocess-crash.html [ Pass Timeout ]
-
webkit.org/b/212226 imported/w3c/web-platform-tests/css/css-grid/alignment/self-baseline/grid-self-baseline-changes-grid-area-size-008.html [ ImageOnlyFailure ]
webkit.org/b/212488 [ Catalina ] media/video-play-audio-require-user-gesture.html [ Pass Timeout ]
Modified: trunk/Source/WebKit/ChangeLog (264664 => 264665)
--- trunk/Source/WebKit/ChangeLog 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/ChangeLog 2020-07-21 18:26:39 UTC (rev 264665)
@@ -1,5 +1,38 @@
2020-07-21 Youenn Fablet <you...@apple.com>
+ NetworkConnectionToWebProcess should not handle NetworkRTCProvider messages
+ https://bugs.webkit.org/show_bug.cgi?id=214547
+
+ Reviewed by Alex Christensen.
+
+ Normally NetworkRTCProvider is created when starting to monitor the network.
+ In case network process is crashing though, there might be requests to open RTC socket on the new network process which has not started to monitor the network.
+ In that case, we will go through NetworkConnectionToWebProcess as NetworkRTCProvider is not yet created.
+ To properly handle this case, on web process side, we send an IPC message to explictly create the NetworkRTCProvider.
+ Once done, we set the IPC connection to the socket factory which will start sending messages to open sockets if needed.
+ Until its connection is set, the socket factory will buffer messages to open sockets.
+ Covered by test no longer crashing in debug.
+
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::didReceiveMessage):
+ (WebKit::NetworkConnectionToWebProcess::createRTCProvider):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.cpp:
+ (WebKit::LibWebRTCNetwork::setAsActive):
+ (WebKit::LibWebRTCNetwork::setConnection):
+ (WebKit::LibWebRTCNetwork::setSocketFactoryConnection):
+ * WebProcess/Network/webrtc/LibWebRTCNetwork.h:
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp:
+ (WebKit::LibWebRTCSocketFactory::setConnection):
+ (WebKit::LibWebRTCSocketFactory::createServerTcpSocket):
+ (WebKit::LibWebRTCSocketFactory::createUdpSocket):
+ (WebKit::LibWebRTCSocketFactory::createClientTcpSocket):
+ (WebKit::LibWebRTCSocketFactory::createNewConnectionSocket):
+ * WebProcess/Network/webrtc/LibWebRTCSocketFactory.h:
+
+2020-07-21 Youenn Fablet <you...@apple.com>
+
Fetch/XHR loads done by extensions should opt out of response sanitisation done in network process
https://bugs.webkit.org/show_bug.cgi?id=214588
<rdar://problem/65060560>
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (264664 => 264665)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2020-07-21 18:26:39 UTC (rev 264665)
@@ -215,10 +215,6 @@
}
#if USE(LIBWEBRTC)
- if (decoder.messageReceiverName() == Messages::NetworkRTCProvider::messageReceiverName()) {
- rtcProvider().didReceiveMessage(connection, decoder);
- return;
- }
if (decoder.messageReceiverName() == Messages::NetworkRTCMonitor::messageReceiverName()) {
rtcProvider().didReceiveNetworkRTCMonitorMessage(connection, decoder);
return;
@@ -273,6 +269,14 @@
}
#endif
+void NetworkConnectionToWebProcess::createRTCProvider(CompletionHandler<void()>&& callback)
+{
+#if USE(LIBWEBRTC)
+ rtcProvider();
+#endif
+ callback();
+}
+
CacheStorageEngineConnection& NetworkConnectionToWebProcess::cacheStorageConnection()
{
if (!m_cacheStorageConnection)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (264664 => 264665)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2020-07-21 18:26:39 UTC (rev 264665)
@@ -239,6 +239,8 @@
void unregisterSWConnection();
#endif
+ void createRTCProvider(CompletionHandler<void()>&&);
+
void createNewMessagePortChannel(const WebCore::MessagePortIdentifier& port1, const WebCore::MessagePortIdentifier& port2);
void entangleLocalPortInThisProcessToRemote(const WebCore::MessagePortIdentifier& local, const WebCore::MessagePortIdentifier& remote);
void messagePortDisentangled(const WebCore::MessagePortIdentifier&);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (264664 => 264665)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2020-07-21 18:26:39 UTC (rev 264665)
@@ -84,6 +84,8 @@
CloseSWContextConnection()
#endif
+ CreateRTCProvider() -> () Async
+
UpdateQuotaBasedOnSpaceUsageForTesting(struct WebCore::ClientOrigin origin)
CreateNewMessagePortChannel(struct WebCore::MessagePortIdentifier port1, struct WebCore::MessagePortIdentifier port2)
EntangleLocalPortInThisProcessToRemote(struct WebCore::MessagePortIdentifier local, struct WebCore::MessagePortIdentifier remote)
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp (264664 => 264665)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.cpp 2020-07-21 18:26:39 UTC (rev 264665)
@@ -29,6 +29,7 @@
#include "DataReference.h"
#include "LibWebRTCNetworkMessages.h"
#include "Logging.h"
+#include "NetworkConnectionToWebProcessMessages.h"
#include <WebCore/SharedBuffer.h>
#include <wtf/MainThread.h>
@@ -44,11 +45,8 @@
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));
- });
- }
+ if (m_connection)
+ setSocketFactoryConnection();
#endif
}
@@ -66,19 +64,36 @@
#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)
+ if (m_isActive)
+ setSocketFactoryConnection();
if (m_connection)
m_connection->addThreadMessageReceiver(Messages::LibWebRTCNetwork::messageReceiverName(), this);
#endif
}
+#if USE(LIBWEBRTC)
+void LibWebRTCNetwork::setSocketFactoryConnection()
+{
+ if (!m_connection) {
+ WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this]() mutable {
+ m_socketFactory.setConnection(nullptr);
+ });
+ return;
+ }
+ m_connection->sendWithAsyncReply(Messages::NetworkConnectionToWebProcess::CreateRTCProvider(), [this, connection = m_connection]() mutable {
+ if (!connection->isValid())
+ return;
+
+ WebCore::LibWebRTCProvider::callOnWebRTCNetworkThread([this, connection = WTFMove(connection)]() mutable {
+ m_socketFactory.setConnection(WTFMove(connection));
+ });
+ }, 0);
+}
+#endif
+
void LibWebRTCNetwork::dispatchToThread(Function<void()>&& callback)
{
if (!m_isActive) {
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h (264664 => 264665)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCNetwork.h 2020-07-21 18:26:39 UTC (rev 264665)
@@ -67,6 +67,8 @@
private:
#if USE(LIBWEBRTC)
+ void setSocketFactoryConnection();
+
void signalReadPacket(WebCore::LibWebRTCSocketIdentifier, const IPC::DataReference&, const RTCNetwork::IPAddress&, uint16_t port, int64_t);
void signalSentPacket(WebCore::LibWebRTCSocketIdentifier, int, int64_t);
void signalAddressReady(WebCore::LibWebRTCSocketIdentifier, const RTCNetwork::SocketAddress&);
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp (264664 => 264665)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.cpp 2020-07-21 18:26:39 UTC (rev 264665)
@@ -31,7 +31,6 @@
#include "LibWebRTCNetwork.h"
#include "Logging.h"
#include "NetworkProcessConnection.h"
-#include "NetworkRTCMonitorMessages.h"
#include "NetworkRTCProviderMessages.h"
#include "WebProcess.h"
#include <wtf/MainThread.h>
@@ -51,6 +50,11 @@
{
ASSERT(!WTF::isMainRunLoop());
m_connection = WTFMove(connection);
+ if (!m_connection)
+ return;
+
+ while (!m_pendingMessageTasks.isEmpty())
+ m_pendingMessageTasks.takeFirst()(*m_connection);
}
IPC::Connection* LibWebRTCSocketFactory::connection()
@@ -62,18 +66,18 @@
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");
+ auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::ServerTCP, address, rtc::SocketAddress());
+
+ if (m_connection)
+ m_connection->send(Messages::NetworkRTCProvider::CreateServerTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort, options), 0);
+ else {
callOnMainThread([] {
WebProcess::singleton().ensureNetworkProcessConnection();
});
- return nullptr;
+ m_pendingMessageTasks.append([identifier = socket->identifier(), address = RTCNetwork::SocketAddress(address), minPort, maxPort, options](auto& connection) {
+ connection.send(Messages::NetworkRTCProvider::CreateServerTCPSocket(identifier, address, minPort, maxPort, options), 0);
+ });
}
-
- auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::ServerTCP, address, rtc::SocketAddress());
-
- m_connection->send(Messages::NetworkRTCProvider::CreateServerTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort, options), 0);
-
return socket.release();
}
@@ -80,18 +84,19 @@
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");
+ 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);
+ else {
callOnMainThread([] {
WebProcess::singleton().ensureNetworkProcessConnection();
});
- return nullptr;
+ m_pendingMessageTasks.append([identifier = socket->identifier(), address = RTCNetwork::SocketAddress(address), minPort, maxPort](auto& connection) {
+ connection.send(Messages::NetworkRTCProvider::CreateUDPSocket(identifier, address, minPort, maxPort), 0);
+ });
}
- auto socket = makeUnique<LibWebRTCSocket>(*this, socketGroup, LibWebRTCSocket::Type::UDP, address, rtc::SocketAddress());
-
- m_connection->send(Messages::NetworkRTCProvider::CreateUDPSocket(socket->identifier(), RTCNetwork::SocketAddress(address), minPort, maxPort), 0);
-
return socket.release();
}
@@ -98,19 +103,21 @@
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.
- m_connection->send(Messages::NetworkRTCProvider::CreateClientTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, options.opts), 0);
+ if (m_connection)
+ m_connection->send(Messages::NetworkRTCProvider::CreateClientTCPSocket(socket->identifier(), RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, options.opts), 0);
+ else {
+ callOnMainThread([] {
+ WebProcess::singleton().ensureNetworkProcessConnection();
+ });
+ m_pendingMessageTasks.append([identifier = socket->identifier(), localAddress = RTCNetwork::SocketAddress(prepareSocketAddress(localAddress, m_disableNonLocalhostConnections)), remoteAddress = RTCNetwork::SocketAddress(prepareSocketAddress(remoteAddress, m_disableNonLocalhostConnections)), userAgent, opts = options.opts](auto& connection) {
+ connection.send(Messages::NetworkRTCProvider::CreateClientTCPSocket(identifier, localAddress, remoteAddress, userAgent, opts), 0);
+ });
+ }
return socket.release();
}
@@ -119,10 +126,8 @@
{
ASSERT(!WTF::isMainRunLoop());
if (!m_connection) {
+ // No need to enqueue a message in this case since it means the network process handling the incoming socket is gone.
RELEASE_LOG(WebRTC, "No connection to create incoming TCP socket");
- callOnMainThread([] {
- WebProcess::singleton().ensureNetworkProcessConnection();
- });
return nullptr;
}
Modified: trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h (264664 => 264665)
--- trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2020-07-21 18:13:18 UTC (rev 264664)
+++ trunk/Source/WebKit/WebProcess/Network/webrtc/LibWebRTCSocketFactory.h 2020-07-21 18:26:39 UTC (rev 264665)
@@ -33,6 +33,8 @@
#include <WebCore/LibWebRTCSocketIdentifier.h>
#include <webrtc/rtc_base/net_helpers.h>
#include <webrtc/api/packet_socket_factory.h>
+#include <wtf/Deque.h>
+#include <wtf/Function.h>
#include <wtf/HashMap.h>
namespace WebKit {
@@ -72,6 +74,7 @@
bool m_disableNonLocalhostConnections { false };
RefPtr<IPC::Connection> m_connection;
+ Deque<Function<void(IPC::Connection&)>> m_pendingMessageTasks;
};
} // namespace WebKit
_______________________________________________ webkit-changes mailing list webkit-changes@lists.webkit.org https://lists.webkit.org/mailman/listinfo/webkit-changes