⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 263797 in webkit


Ignore:
Timestamp:
Jul 1, 2020, 7:23:46 AM (6 years ago)
Author:
youenn@apple.com
Message:

Make NetworkSendQueue use CString instead of String for UTF-8 data
https://bugs.webkit.org/show_bug.cgi?id=213714

Reviewed by Darin Adler.

Source/WebCore:

Use CString instead of String in NetworkSendQueue as all data is to be encoded as UTF-8.
This allows converting and allocating the UTF-8 string only once.
Covered by existing tests.

  • Modules/mediastream/RTCDataChannel.cpp:

(WebCore::RTCDataChannel::createMessageQueue):
(WebCore::RTCDataChannel::send):

  • Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp:

(WebCore::LibWebRTCDataChannelHandler::sendStringData):
(WebCore::LibWebRTCDataChannelHandler::sendRawData):

  • Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h:
  • fileapi/NetworkSendQueue.cpp:

(WebCore::NetworkSendQueue::enqueue):
(WebCore::NetworkSendQueue::processMessages):

  • fileapi/NetworkSendQueue.h:
  • platform/mediastream/RTCDataChannelHandler.h:
  • platform/mock/RTCDataChannelHandlerMock.cpp:

(WebCore::RTCDataChannelHandlerMock::sendStringData):

  • platform/mock/RTCDataChannelHandlerMock.h:

Source/WebKit:

Update code to use CString/DataReference to transmit WebSocket text messages.

  • NetworkProcess/NetworkSocketChannel.cpp:

(WebKit::NetworkSocketChannel::sendString):

  • NetworkProcess/NetworkSocketChannel.h:
  • NetworkProcess/NetworkSocketChannel.messages.in:
  • NetworkProcess/WebSocketTask.h:

(WebKit::WebSocketTask::sendString):

  • NetworkProcess/cocoa/WebSocketTaskCocoa.h:
  • NetworkProcess/cocoa/WebSocketTaskCocoa.mm:

(WebKit::WebSocketTask::sendString):

  • NetworkProcess/soup/WebSocketTaskSoup.h:
  • NetworkProcess/soup/WebSocketTaskSoup.cpp:

(WebKit::WebSocketTask::sendString):

  • WebProcess/Network/WebSocketChannel.cpp:

(WebKit::WebSocketChannel::createMessageQueue):
(WebKit::WebSocketChannel::send):

Location:
trunk/Source
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r263795 r263797  
     12020-07-01  Youenn Fablet  <youenn@apple.com>
     2
     3        Make NetworkSendQueue use CString instead of String for UTF-8 data
     4        https://bugs.webkit.org/show_bug.cgi?id=213714
     5
     6        Reviewed by Darin Adler.
     7
     8        Use CString instead of String in NetworkSendQueue as all data is to be encoded as UTF-8.
     9        This allows converting and allocating the UTF-8 string only once.
     10        Covered by existing tests.
     11
     12        * Modules/mediastream/RTCDataChannel.cpp:
     13        (WebCore::RTCDataChannel::createMessageQueue):
     14        (WebCore::RTCDataChannel::send):
     15        * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp:
     16        (WebCore::LibWebRTCDataChannelHandler::sendStringData):
     17        (WebCore::LibWebRTCDataChannelHandler::sendRawData):
     18        * Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h:
     19        * fileapi/NetworkSendQueue.cpp:
     20        (WebCore::NetworkSendQueue::enqueue):
     21        (WebCore::NetworkSendQueue::processMessages):
     22        * fileapi/NetworkSendQueue.h:
     23        * platform/mediastream/RTCDataChannelHandler.h:
     24        * platform/mock/RTCDataChannelHandlerMock.cpp:
     25        (WebCore::RTCDataChannelHandlerMock::sendStringData):
     26        * platform/mock/RTCDataChannelHandlerMock.h:
     27
    1282020-07-01  Alexey Shvayka  <shvaikalesh@gmail.com>
    229
  • trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp

    r263655 r263797  
    6767NetworkSendQueue RTCDataChannel::createMessageQueue(Document& document, RTCDataChannel& channel)
    6868{
    69     return { document, [&channel](const String& data) {
    70         if (!channel.m_handler->sendStringData(data))
     69    return { document, [&channel](auto& utf8) {
     70        if (!channel.m_handler->sendStringData(utf8))
    7171            channel.scriptExecutionContext()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, "Error sending string through RTCDataChannel."_s);
    7272    }, [&channel](auto* data, size_t length) {
     
    122122        return Exception { InvalidStateError };
    123123
    124     m_bufferedAmount += data.utf8().length();
    125     m_messageQueue.enqueue(data);
     124    // FIXME: We might want to use strict conversion like WebSocket.
     125    auto utf8 = data.utf8();
     126    m_bufferedAmount += utf8.length();
     127    m_messageQueue.enqueue(WTFMove(utf8));
    126128    return { };
    127129}
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp

    r263655 r263797  
    9090}
    9191
    92 bool LibWebRTCDataChannelHandler::sendStringData(const String& text)
     92bool LibWebRTCDataChannelHandler::sendStringData(const CString& utf8Text)
    9393{
    94     auto utf8Text = text.utf8();
    9594    return m_channel->Send({ rtc::CopyOnWriteBuffer(utf8Text.data(), utf8Text.length()), false });
    9695}
     
    9897bool LibWebRTCDataChannelHandler::sendRawData(const char* data, size_t length)
    9998{
    100     return m_channel->Send({rtc::CopyOnWriteBuffer(data, length), true});
     99    return m_channel->Send({ rtc::CopyOnWriteBuffer(data, length), true });
    101100}
    102101
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h

    r263655 r263797  
    6161    void setClient(RTCDataChannelHandlerClient&) final;
    6262    void checkState();
    63     bool sendStringData(const String&) final;
     63    bool sendStringData(const CString&) final;
    6464    bool sendRawData(const char*, size_t) final;
    6565    void close() final;
  • trunk/Source/WebCore/fileapi/NetworkSendQueue.cpp

    r262999 r263797  
    4141NetworkSendQueue::~NetworkSendQueue() = default;
    4242
    43 void NetworkSendQueue::enqueue(const String& data)
     43void NetworkSendQueue::enqueue(CString&& utf8)
    4444{
    4545    if (m_queue.isEmpty()) {
    46         m_writeString(data);
     46        m_writeString(utf8);
    4747        return;
    4848    }
    49     m_queue.append(data);
     49    m_queue.append(WTFMove(utf8));
    5050}
    5151
     
    8181    while (!m_queue.isEmpty()) {
    8282        bool shouldStopProcessing = false;
    83         switchOn(m_queue.first(), [this](const String& message) {
    84             m_writeString(message);
     83        switchOn(m_queue.first(), [this](const CString& utf8) {
     84            m_writeString(utf8);
    8585        }, [this](Ref<SharedBuffer>& data) {
    8686            m_writeRawData(data->data(), data->size());
  • trunk/Source/WebCore/fileapi/NetworkSendQueue.h

    r262999 r263797  
    3232#include <wtf/Variant.h>
    3333#include <wtf/WeakPtr.h>
     34#include <wtf/text/CString.h>
    3435
    3536namespace JSC {
     
    4647class WEBCORE_EXPORT NetworkSendQueue {
    4748public:
    48     using WriteString = Function<void(const String&)>;
     49    using WriteString = Function<void(const CString& utf8)>;
    4950    using WriteRawData = Function<void(const char*, size_t)>;
    5051    enum class Continue { No, Yes };
     
    5354    ~NetworkSendQueue();
    5455
    55     void enqueue(const String&);
     56    void enqueue(CString&& utf8);
    5657    void enqueue(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength);
    5758    void enqueue(Blob&);
     
    6263    void processMessages();
    6364
    64     using Message = Variant<String, Ref<SharedBuffer>, UniqueRef<BlobLoader>>;
     65    using Message = Variant<CString, Ref<SharedBuffer>, UniqueRef<BlobLoader>>;
    6566    Deque<Message> m_queue;
    6667
  • trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h

    r263655 r263797  
    5050    virtual void setClient(RTCDataChannelHandlerClient&) = 0;
    5151
    52     virtual bool sendStringData(const String&) = 0;
     52    virtual bool sendStringData(const CString&) = 0;
    5353    virtual bool sendRawData(const char*, size_t) = 0;
    5454    virtual void close() = 0;
  • trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.cpp

    r215832 r263797  
    4949}
    5050
    51 bool RTCDataChannelHandlerMock::sendStringData(const String& string)
     51bool RTCDataChannelHandlerMock::sendStringData(const CString& string)
    5252{
    53     m_client->didReceiveStringData(string);
     53    m_client->didReceiveStringData(String::fromUTF8(string));
    5454    return true;
    5555}
  • trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h

    r263655 r263797  
    4141    void setClient(RTCDataChannelHandlerClient&) final;
    4242
    43     bool sendStringData(const String&) final;
     43    bool sendStringData(const CString&) final;
    4444    bool sendRawData(const char*, size_t) final;
    4545    void close() final;
  • trunk/Source/WebKit/ChangeLog

    r263793 r263797  
     12020-07-01  Youenn Fablet  <youenn@apple.com>
     2
     3        Make NetworkSendQueue use CString instead of String for UTF-8 data
     4        https://bugs.webkit.org/show_bug.cgi?id=213714
     5
     6        Reviewed by Darin Adler.
     7
     8        Update code to use CString/DataReference to transmit WebSocket text messages.
     9
     10        * NetworkProcess/NetworkSocketChannel.cpp:
     11        (WebKit::NetworkSocketChannel::sendString):
     12        * NetworkProcess/NetworkSocketChannel.h:
     13        * NetworkProcess/NetworkSocketChannel.messages.in:
     14        * NetworkProcess/WebSocketTask.h:
     15        (WebKit::WebSocketTask::sendString):
     16        * NetworkProcess/cocoa/WebSocketTaskCocoa.h:
     17        * NetworkProcess/cocoa/WebSocketTaskCocoa.mm:
     18        (WebKit::WebSocketTask::sendString):
     19        * NetworkProcess/soup/WebSocketTaskSoup.h:
     20        * NetworkProcess/soup/WebSocketTaskSoup.cpp:
     21        (WebKit::WebSocketTask::sendString):
     22        * WebProcess/Network/WebSocketChannel.cpp:
     23        (WebKit::WebSocketChannel::createMessageQueue):
     24        (WebKit::WebSocketChannel::send):
     25
    1262020-07-01  James Savage  <james.savage@apple.com>
    227
  • trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.cpp

    r257199 r263797  
    7272}
    7373
    74 void NetworkSocketChannel::sendString(const String& message, CompletionHandler<void()>&& callback)
     74void NetworkSocketChannel::sendString(const IPC::DataReference& message, CompletionHandler<void()>&& callback)
    7575{
    7676    m_socket->sendString(message, WTFMove(callback));
  • trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.h

    r256890 r263797  
    7171    void didReceiveHandshakeResponse(WebCore::ResourceResponse&&);
    7272
    73     void sendString(const String&, CompletionHandler<void()>&&);
     73    void sendString(const IPC::DataReference&, CompletionHandler<void()>&&);
    7474    void sendData(const IPC::DataReference&, CompletionHandler<void()>&&);
    7575    void close(int32_t code, const String& reason);
  • trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.messages.in

    r252655 r263797  
    2222
    2323messages -> NetworkSocketChannel NotRefCounted {
    24     SendString(String message) -> () Async
     24    SendString(IPC::DataReference message) -> () Async
    2525    SendData(IPC::DataReference data) -> () Async
    2626    Close(int32_t code, String reason)
  • trunk/Source/WebKit/NetworkProcess/WebSocketTask.h

    r252274 r263797  
    3939    typedef uint64_t TaskIdentifier;
    4040
    41     void sendString(const String&, CompletionHandler<void()>&&) { }
     41    void sendString(const IPC::DataReference&, CompletionHandler<void()>&&) { }
    4242    void sendData(const IPC::DataReference&, CompletionHandler<void()>&&) { }
    4343    void close(int32_t code, const String& reason) { }
  • trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.h

    r256890 r263797  
    4848    ~WebSocketTask();
    4949
    50     void sendString(const String&, CompletionHandler<void()>&&);
     50    void sendString(const IPC::DataReference&, CompletionHandler<void()>&&);
    5151    void sendData(const IPC::DataReference&, CompletionHandler<void()>&&);
    5252    void close(int32_t code, const String& reason);
  • trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.mm

    r256890 r263797  
    116116}
    117117
    118 void WebSocketTask::sendString(const String& text , CompletionHandler<void()>&& callback)
     118void WebSocketTask::sendString(const IPC::DataReference& utf8String, CompletionHandler<void()>&& callback)
    119119{
    120     auto message = adoptNS([[NSURLSessionWebSocketMessage alloc] initWithString: text]);
    121     [m_task sendMessage: message.get() completionHandler: makeBlockPtr([callback = WTFMove(callback)](NSError * _Nullable) mutable {
     120    auto text = adoptNS([[NSString alloc] initWithBytes:utf8String.data() length:utf8String.size() encoding:NSUTF8StringEncoding]);
     121    if (!text) {
     122        callback();
     123        return;
     124    }
     125    auto message = adoptNS([[NSURLSessionWebSocketMessage alloc] initWithString:text.get()]);
     126    [m_task sendMessage:message.get() completionHandler:makeBlockPtr([callback = WTFMove(callback)](NSError * _Nullable) mutable {
    122127        // Workaround rdar://problem/55324926 until it gets fixed.
    123128        callOnMainRunLoop(WTFMove(callback));
     
    128133{
    129134    auto nsData = adoptNS([[NSData alloc] initWithBytes:data.data() length:data.size()]);
    130     auto message = adoptNS([[NSURLSessionWebSocketMessage alloc] initWithData: nsData.get()]);
    131     [m_task sendMessage: message.get() completionHandler: makeBlockPtr([callback = WTFMove(callback)](NSError * _Nullable) mutable {
     135    auto message = adoptNS([[NSURLSessionWebSocketMessage alloc] initWithData:nsData.get()]);
     136    [m_task sendMessage:message.get() completionHandler:makeBlockPtr([callback = WTFMove(callback)](NSError * _Nullable) mutable {
    132137        // Workaround rdar://problem/55324926 until it gets fixed.
    133138        callOnMainRunLoop(WTFMove(callback));
     
    141146        code = 1005;
    142147    auto nsData = adoptNS([[NSData alloc] initWithBytes:reason.utf8().data() length:reason.sizeInBytes()]);
    143     [m_task cancelWithCloseCode: (NSURLSessionWebSocketCloseCode)code reason: nsData.get()];
     148    [m_task cancelWithCloseCode:(NSURLSessionWebSocketCloseCode)code reason:nsData.get()];
    144149}
    145150
  • trunk/Source/WebKit/NetworkProcess/soup/WebSocketTaskSoup.cpp

    r258393 r263797  
    186186}
    187187
    188 void WebSocketTask::sendString(const String& text, CompletionHandler<void()>&& callback)
     188void WebSocketTask::sendString(const IPC::DataReference& utf8, CompletionHandler<void()>&& callback)
    189189{
    190190    if (m_connection && soup_websocket_connection_get_state(m_connection.get()) == SOUP_WEBSOCKET_STATE_OPEN) {
    191         CString utf8 = text.utf8(StrictConversionReplacingUnpairedSurrogatesWithFFFD);
    192191#if SOUP_CHECK_VERSION(2, 67, 3)
    193192        // Soup is going to copy the data immediately, so we can use g_bytes_new_static() here to avoid more data copies.
    194         GRefPtr<GBytes> bytes = adoptGRef(g_bytes_new_static(utf8.data(), utf8.length()));
     193        GRefPtr<GBytes> bytes = adoptGRef(g_bytes_new_static(utf8.data(), utf8.size()));
    195194        soup_websocket_connection_send_message(m_connection.get(), SOUP_WEBSOCKET_DATA_TEXT, bytes.get());
    196195#else
  • trunk/Source/WebKit/NetworkProcess/soup/WebSocketTaskSoup.h

    r258393 r263797  
    4242    ~WebSocketTask();
    4343
    44     void sendString(const String&, CompletionHandler<void()>&&);
     44    void sendString(const IPC::DataReference&, CompletionHandler<void()>&&);
    4545    void sendData(const IPC::DataReference&, CompletionHandler<void()>&&);
    4646    void close(int32_t code, const String& reason);
  • trunk/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp

    r262999 r263797  
    5757NetworkSendQueue WebSocketChannel::createMessageQueue(Document& document, WebSocketChannel& channel)
    5858{
    59     return { document, [&channel](auto& string) {
    60         auto byteLength = string.sizeInBytes();
    61         channel.notifySendFrame(WebSocketFrame::OpCode::OpCodeText, string.utf8().data(), byteLength);
    62         channel.sendMessage(Messages::NetworkSocketChannel::SendString { string }, byteLength);
     59    return { document, [&channel](auto& utf8String) {
     60        channel.notifySendFrame(WebSocketFrame::OpCode::OpCodeText, utf8String.data(), utf8String.length());
     61        channel.sendMessage(Messages::NetworkSocketChannel::SendString { IPC::DataReference { reinterpret_cast<const uint8_t*>(utf8String.data()), utf8String.length() } }, utf8String.length());
    6362    }, [&channel](const char* data, size_t byteLength) {
    6463        channel.notifySendFrame(WebSocketFrame::OpCode::OpCodeBinary, data, byteLength);
     
    163162WebSocketChannel::SendResult WebSocketChannel::send(const String& message)
    164163{
    165     auto byteLength = message.sizeInBytes();
    166     if (!increaseBufferedAmount(byteLength))
     164    auto utf8 = message.utf8(StrictConversionReplacingUnpairedSurrogatesWithFFFD);
     165    if (!increaseBufferedAmount(utf8.length()))
    167166        return SendFail;
    168167
    169     m_messageQueue.enqueue(message);
     168    m_messageQueue.enqueue(WTFMove(utf8));
    170169    return SendSuccess;
    171170}
Note: See TracChangeset for help on using the changeset viewer.