[webkit-changes] [WebKit/WebKit] c85047: Implement WebTransport from a Worker

Alex Christensen noreply at github.com
Thu Jan 2 10:03:36 PST 2025


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: c85047d65d8d007e687fb0ab36e069536cc1028e
      https://github.com/WebKit/WebKit/commit/c85047d65d8d007e687fb0ab36e069536cc1028e
  Author: Alex Christensen <achristensen at apple.com>
  Date:   2025-01-02 (Thu, 02 Jan 2025)

  Changed paths:
    M Source/WebCore/Modules/webtransport/DatagramSink.cpp
    M Source/WebCore/Modules/webtransport/DatagramSink.h
    M Source/WebCore/Modules/webtransport/WebTransport.cpp
    M Source/WebCore/Modules/webtransport/WebTransport.h
    M Source/WebCore/Modules/webtransport/WebTransportBidirectionalStreamConstructionParameters.cpp
    M Source/WebCore/Modules/webtransport/WebTransportBidirectionalStreamConstructionParameters.h
    M Source/WebCore/Modules/webtransport/WebTransportReceiveStreamSource.cpp
    M Source/WebCore/Modules/webtransport/WebTransportReceiveStreamSource.h
    M Source/WebCore/Modules/webtransport/WebTransportSession.h
    M Source/WebCore/Modules/webtransport/WebTransportSessionClient.h
    A Source/WebCore/Modules/webtransport/WorkerWebTransportSession.cpp
    A Source/WebCore/Modules/webtransport/WorkerWebTransportSession.h
    M Source/WebCore/Sources.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/loader/EmptyClients.cpp
    M Source/WebCore/page/SocketProvider.h
    M Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.cpp
    M Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.h
    M Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.messages.in
    M Source/WebKit/NetworkProcess/webtransport/NetworkTransportStream.cpp
    M Source/WebKit/NetworkProcess/webtransport/NetworkTransportStream.h
    M Source/WebKit/NetworkProcess/webtransport/cocoa/NetworkTransportSessionCocoa.mm
    M Source/WebKit/NetworkProcess/webtransport/cocoa/NetworkTransportStreamCocoa.mm
    M Source/WebKit/SaferCPPExpectations/UncountedCallArgsCheckerExpectations
    M Source/WebKit/SaferCPPExpectations/UncountedLambdaCapturesCheckerExpectations
    M Source/WebKit/SaferCPPExpectations/UncountedLocalVarsCheckerExpectations
    M Source/WebKit/Scripts/webkit/messages.py
    M Source/WebKit/Scripts/webkit/tests/MessageArgumentDescriptions.cpp
    M Source/WebKit/Shared/WTFArgumentCoders.serialization.in
    M Source/WebKit/Sources.txt
    M Source/WebKit/WebKit.xcodeproj/project.pbxproj
    M Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp
    M Source/WebKit/WebProcess/Network/WebSocketProvider.cpp
    M Source/WebKit/WebProcess/Network/WebSocketProvider.h
    R Source/WebKit/WebProcess/Network/WebTransportReceiveStreamSource.cpp
    R Source/WebKit/WebProcess/Network/WebTransportReceiveStreamSource.h
    M Source/WebKit/WebProcess/Network/WebTransportSendStreamSink.cpp
    M Source/WebKit/WebProcess/Network/WebTransportSendStreamSink.h
    M Source/WebKit/WebProcess/Network/WebTransportSession.cpp
    M Source/WebKit/WebProcess/Network/WebTransportSession.h
    M Source/WebKit/WebProcess/Network/WebTransportSession.messages.in
    M Source/WebKit/WebProcess/WebProcess.cpp
    M Source/WebKit/WebProcess/WebProcess.h
    M Source/WebKitLegacy/WebCoreSupport/LegacySocketProvider.cpp
    M Source/WebKitLegacy/WebCoreSupport/LegacySocketProvider.h
    M Tools/TestWebKitAPI/Tests/WebKitCocoa/WebTransport.mm

  Log Message:
  -----------
  Implement WebTransport from a Worker
https://bugs.webkit.org/show_bug.cgi?id=284965
rdar://136263473

Reviewed by Youenn Fablet.

A Worker runs code off the main thread, so we need to be extra careful.

The first thing I noticed is that ensureNetworkProcessConnection can only
safely be called from the main thread, so if we are creating a WebTransport
session off the main thread, hop to the main thread, get the connection,
then hop back.  The connection can then be safely used off the main thread.

To make networking fast, especially the sending of datagrams, I send IPC
from the background thread to the network process, which is already safe.
Some of the messages need a reply, and some messages indicate data or streams
were received in the network process, and those messages come from the
network process on the main thread.  To handle the needed thread hopping,
I introduce WorkerWebTransportSession which works as an intermediary between
the WebTransportSession and the WebTransportSessionClient to make sure
everything is safely on the expected thread on both sides.

To make use of m_readStreamSources safe, I needed to change the lookup in
WebTransportSession::streamReceiveBytes into just a client call and have
the WorkerWebTransportSession take care of the thread safety.  That means
I needed to move WebTransportStreamIdentifier to WebCore and have WebCore
keep track of the map of identifier to stream and only access that map on
the proper thread.

I found that I can use WebCore::WebTransportReceiveStreamSource to receive both
data and streams, so I removed WebKit::WebTransportReceiveStreamSource.

* Source/WebCore/Modules/webtransport/WebTransport.cpp:
(WebCore::WebTransport::initializeOverHTTP):
(WebCore::WebTransport::receiveIncomingUnidirectionalStream):
(WebCore::createBidirectionalStream):
(WebCore::WebTransport::receiveBidirectionalStream):
(WebCore::WebTransport::streamReceiveBytes):
(WebCore::WebTransport::cleanup):
(WebCore::WebTransport::createBidirectionalStream):
* Source/WebCore/Modules/webtransport/WebTransport.h:
* Source/WebCore/Modules/webtransport/WebTransportBidirectionalStreamConstructionParameters.cpp:
(WebCore::WebTransportBidirectionalStreamConstructionParameters::WebTransportBidirectionalStreamConstructionParameters):
* Source/WebCore/Modules/webtransport/WebTransportBidirectionalStreamConstructionParameters.h:
* Source/WebCore/Modules/webtransport/WebTransportReceiveStreamSource.cpp:
(WebCore::WebTransportReceiveStreamSource::receiveBytes):
* Source/WebCore/Modules/webtransport/WebTransportReceiveStreamSource.h:
* Source/WebCore/Modules/webtransport/WebTransportSession.h:
* Source/WebCore/Modules/webtransport/WebTransportSessionClient.h:
* Source/WebCore/Modules/webtransport/WorkerWebTransportSession.cpp: Added.
(WebCore::WorkerWebTransportSession::create):
(WebCore::WorkerWebTransportSession::WorkerWebTransportSession):
(WebCore::WorkerWebTransportSession::receiveDatagram):
(WebCore::WorkerWebTransportSession::receiveIncomingUnidirectionalStream):
(WebCore::WorkerWebTransportSession::receiveBidirectionalStream):
(WebCore::WorkerWebTransportSession::streamReceiveBytes):
(WebCore::WorkerWebTransportSession::sendDatagram):
(WebCore::WorkerWebTransportSession::createOutgoingUnidirectionalStream):
(WebCore::WorkerWebTransportSession::createBidirectionalStream):
(WebCore::WorkerWebTransportSession::terminate):
* Source/WebCore/Modules/webtransport/WorkerWebTransportSession.h: Added.
(WebCore::WorkerWebTransportSession::ref const):
(WebCore::WorkerWebTransportSession::deref const):
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.cpp:
(WebKit::NetworkTransportSession::sendStreamSendBytes):
(WebKit::NetworkTransportSession::streamSendBytes):
(WebKit::NetworkTransportSession::createOutgoingUnidirectionalStream):
(WebKit::NetworkTransportSession::createBidirectionalStream):
(WebKit::NetworkTransportSession::destroyOutgoingUnidirectionalStream):
(WebKit::NetworkTransportSession::destroyBidirectionalStream):
(WebKit::NetworkTransportSession::streamReceiveBytes):
(WebKit::NetworkTransportSession::receiveIncomingUnidirectionalStream):
(WebKit::NetworkTransportSession::receiveBidirectionalStream):
* Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.h:
* Source/WebKit/NetworkProcess/webtransport/NetworkTransportSession.messages.in:
* Source/WebKit/NetworkProcess/webtransport/NetworkTransportStream.cpp:
(WebKit::NetworkTransportStream::NetworkTransportStream):
* Source/WebKit/NetworkProcess/webtransport/NetworkTransportStream.h:
(WebKit::NetworkTransportStream::identifier const):
* Source/WebKit/NetworkProcess/webtransport/cocoa/NetworkTransportSessionCocoa.mm:
(WebKit::createParameters):
(WebKit::NetworkTransportSession::createBidirectionalStream):
(WebKit::NetworkTransportSession::createOutgoingUnidirectionalStream):
(WebKit::NetworkTransportSession::createStream):
* Source/WebKit/NetworkProcess/webtransport/cocoa/NetworkTransportStreamCocoa.mm:
(WebKit::NetworkTransportStream::NetworkTransportStream):
* Source/WebKit/Scripts/webkit/messages.py:
(serialized_identifiers):
(headers_for_type):
* Source/WebKit/Shared/WTFArgumentCoders.serialization.in:
* Source/WebKit/Sources.txt:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
* Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp:
(WebKit::NetworkProcessConnection::dispatchMessage):
* Source/WebKit/WebProcess/Network/WebSocketProvider.cpp:
(WebKit::WebSocketProvider::initializeWebTransportSession):
* Source/WebKit/WebProcess/Network/WebTransportReceiveStreamSource.cpp: Removed.
* Source/WebKit/WebProcess/Network/WebTransportReceiveStreamSource.h: Removed.
* Source/WebKit/WebProcess/Network/WebTransportSendStreamSink.cpp:
(WebKit::WebTransportSendStreamSink::WebTransportSendStreamSink):
(WebKit::WebTransportSendStreamSink::write):
(WebKit::WebTransportSendStreamSink::sendBytes):
* Source/WebKit/WebProcess/Network/WebTransportSendStreamSink.h:
(WebKit::WebTransportSendStreamSink::create):
* Source/WebKit/WebProcess/Network/WebTransportSession.cpp:
(WebKit::WebTransportSession::initialize):
(WebKit::WebTransportSession::WebTransportSession):
(WebKit::WebTransportSession::messageSenderConnection const):
(WebKit::WebTransportSession::messageSenderDestinationID const):
(WebKit::WebTransportSession::receiveIncomingUnidirectionalStream):
(WebKit::WebTransportSession::receiveBidirectionalStream):
(WebKit::WebTransportSession::streamReceiveBytes):
(WebKit::WebTransportSession::sendDatagram):
(WebKit::WebTransportSession::createOutgoingUnidirectionalStream):
(WebKit::WebTransportSession::createBidirectionalStream):
(WebKit::WebTransportSession::streamSendBytes):
(WebKit::WebTransportSession::terminate):
* Source/WebKit/WebProcess/Network/WebTransportSession.h:
* Source/WebKit/WebProcess/Network/WebTransportSession.messages.in:
* Source/WebKit/WebProcess/Network/WorkerWebTransportReceiveStreamSource.cpp: Added.
* Source/WebKit/WebProcess/Network/WorkerWebTransportReceiveStreamSource.h: Added.
* Source/WebKit/WebProcess/WebProcess.cpp:
(WebKit::WebProcess::webTransportSession):
(WebKit::WebProcess::addWebTransportSession):
(WebKit::WebProcess::removeWebTransportSession):
* Source/WebKit/WebProcess/WebProcess.h:
* Tools/TestWebKitAPI/Tests/WebKitCocoa/WebTransport.mm:
(TestWebKitAPI::TEST(WebTransport, DISABLED_Worker)):

Canonical link: https://commits.webkit.org/288367@main



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list