Changeset 263797 in webkit
- Timestamp:
- Jul 1, 2020, 7:23:46 AM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 19 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Modules/mediastream/RTCDataChannel.cpp (modified) (2 diffs)
-
WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp (modified) (2 diffs)
-
WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h (modified) (1 diff)
-
WebCore/fileapi/NetworkSendQueue.cpp (modified) (2 diffs)
-
WebCore/fileapi/NetworkSendQueue.h (modified) (4 diffs)
-
WebCore/platform/mediastream/RTCDataChannelHandler.h (modified) (1 diff)
-
WebCore/platform/mock/RTCDataChannelHandlerMock.cpp (modified) (1 diff)
-
WebCore/platform/mock/RTCDataChannelHandlerMock.h (modified) (1 diff)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/NetworkProcess/NetworkSocketChannel.cpp (modified) (1 diff)
-
WebKit/NetworkProcess/NetworkSocketChannel.h (modified) (1 diff)
-
WebKit/NetworkProcess/NetworkSocketChannel.messages.in (modified) (1 diff)
-
WebKit/NetworkProcess/WebSocketTask.h (modified) (1 diff)
-
WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.h (modified) (1 diff)
-
WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.mm (modified) (3 diffs)
-
WebKit/NetworkProcess/soup/WebSocketTaskSoup.cpp (modified) (1 diff)
-
WebKit/NetworkProcess/soup/WebSocketTaskSoup.h (modified) (1 diff)
-
WebKit/WebProcess/Network/WebSocketChannel.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r263795 r263797 1 2020-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 1 28 2020-07-01 Alexey Shvayka <shvaikalesh@gmail.com> 2 29 -
trunk/Source/WebCore/Modules/mediastream/RTCDataChannel.cpp
r263655 r263797 67 67 NetworkSendQueue RTCDataChannel::createMessageQueue(Document& document, RTCDataChannel& channel) 68 68 { 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)) 71 71 channel.scriptExecutionContext()->addConsoleMessage(MessageSource::JS, MessageLevel::Error, "Error sending string through RTCDataChannel."_s); 72 72 }, [&channel](auto* data, size_t length) { … … 122 122 return Exception { InvalidStateError }; 123 123 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)); 126 128 return { }; 127 129 } -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.cpp
r263655 r263797 90 90 } 91 91 92 bool LibWebRTCDataChannelHandler::sendStringData(const String& text)92 bool LibWebRTCDataChannelHandler::sendStringData(const CString& utf8Text) 93 93 { 94 auto utf8Text = text.utf8();95 94 return m_channel->Send({ rtc::CopyOnWriteBuffer(utf8Text.data(), utf8Text.length()), false }); 96 95 } … … 98 97 bool LibWebRTCDataChannelHandler::sendRawData(const char* data, size_t length) 99 98 { 100 return m_channel->Send({ rtc::CopyOnWriteBuffer(data, length), true});99 return m_channel->Send({ rtc::CopyOnWriteBuffer(data, length), true }); 101 100 } 102 101 -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCDataChannelHandler.h
r263655 r263797 61 61 void setClient(RTCDataChannelHandlerClient&) final; 62 62 void checkState(); 63 bool sendStringData(const String&) final;63 bool sendStringData(const CString&) final; 64 64 bool sendRawData(const char*, size_t) final; 65 65 void close() final; -
trunk/Source/WebCore/fileapi/NetworkSendQueue.cpp
r262999 r263797 41 41 NetworkSendQueue::~NetworkSendQueue() = default; 42 42 43 void NetworkSendQueue::enqueue( const String& data)43 void NetworkSendQueue::enqueue(CString&& utf8) 44 44 { 45 45 if (m_queue.isEmpty()) { 46 m_writeString( data);46 m_writeString(utf8); 47 47 return; 48 48 } 49 m_queue.append( data);49 m_queue.append(WTFMove(utf8)); 50 50 } 51 51 … … 81 81 while (!m_queue.isEmpty()) { 82 82 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); 85 85 }, [this](Ref<SharedBuffer>& data) { 86 86 m_writeRawData(data->data(), data->size()); -
trunk/Source/WebCore/fileapi/NetworkSendQueue.h
r262999 r263797 32 32 #include <wtf/Variant.h> 33 33 #include <wtf/WeakPtr.h> 34 #include <wtf/text/CString.h> 34 35 35 36 namespace JSC { … … 46 47 class WEBCORE_EXPORT NetworkSendQueue { 47 48 public: 48 using WriteString = Function<void(const String&)>;49 using WriteString = Function<void(const CString& utf8)>; 49 50 using WriteRawData = Function<void(const char*, size_t)>; 50 51 enum class Continue { No, Yes }; … … 53 54 ~NetworkSendQueue(); 54 55 55 void enqueue( const String&);56 void enqueue(CString&& utf8); 56 57 void enqueue(const JSC::ArrayBuffer&, unsigned byteOffset, unsigned byteLength); 57 58 void enqueue(Blob&); … … 62 63 void processMessages(); 63 64 64 using Message = Variant< String, Ref<SharedBuffer>, UniqueRef<BlobLoader>>;65 using Message = Variant<CString, Ref<SharedBuffer>, UniqueRef<BlobLoader>>; 65 66 Deque<Message> m_queue; 66 67 -
trunk/Source/WebCore/platform/mediastream/RTCDataChannelHandler.h
r263655 r263797 50 50 virtual void setClient(RTCDataChannelHandlerClient&) = 0; 51 51 52 virtual bool sendStringData(const String&) = 0;52 virtual bool sendStringData(const CString&) = 0; 53 53 virtual bool sendRawData(const char*, size_t) = 0; 54 54 virtual void close() = 0; -
trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.cpp
r215832 r263797 49 49 } 50 50 51 bool RTCDataChannelHandlerMock::sendStringData(const String& string)51 bool RTCDataChannelHandlerMock::sendStringData(const CString& string) 52 52 { 53 m_client->didReceiveStringData( string);53 m_client->didReceiveStringData(String::fromUTF8(string)); 54 54 return true; 55 55 } -
trunk/Source/WebCore/platform/mock/RTCDataChannelHandlerMock.h
r263655 r263797 41 41 void setClient(RTCDataChannelHandlerClient&) final; 42 42 43 bool sendStringData(const String&) final;43 bool sendStringData(const CString&) final; 44 44 bool sendRawData(const char*, size_t) final; 45 45 void close() final; -
trunk/Source/WebKit/ChangeLog
r263793 r263797 1 2020-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 1 26 2020-07-01 James Savage <james.savage@apple.com> 2 27 -
trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.cpp
r257199 r263797 72 72 } 73 73 74 void NetworkSocketChannel::sendString(const String& message, CompletionHandler<void()>&& callback)74 void NetworkSocketChannel::sendString(const IPC::DataReference& message, CompletionHandler<void()>&& callback) 75 75 { 76 76 m_socket->sendString(message, WTFMove(callback)); -
trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.h
r256890 r263797 71 71 void didReceiveHandshakeResponse(WebCore::ResourceResponse&&); 72 72 73 void sendString(const String&, CompletionHandler<void()>&&);73 void sendString(const IPC::DataReference&, CompletionHandler<void()>&&); 74 74 void sendData(const IPC::DataReference&, CompletionHandler<void()>&&); 75 75 void close(int32_t code, const String& reason); -
trunk/Source/WebKit/NetworkProcess/NetworkSocketChannel.messages.in
r252655 r263797 22 22 23 23 messages -> NetworkSocketChannel NotRefCounted { 24 SendString( Stringmessage) -> () Async24 SendString(IPC::DataReference message) -> () Async 25 25 SendData(IPC::DataReference data) -> () Async 26 26 Close(int32_t code, String reason) -
trunk/Source/WebKit/NetworkProcess/WebSocketTask.h
r252274 r263797 39 39 typedef uint64_t TaskIdentifier; 40 40 41 void sendString(const String&, CompletionHandler<void()>&&) { }41 void sendString(const IPC::DataReference&, CompletionHandler<void()>&&) { } 42 42 void sendData(const IPC::DataReference&, CompletionHandler<void()>&&) { } 43 43 void close(int32_t code, const String& reason) { } -
trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.h
r256890 r263797 48 48 ~WebSocketTask(); 49 49 50 void sendString(const String&, CompletionHandler<void()>&&);50 void sendString(const IPC::DataReference&, CompletionHandler<void()>&&); 51 51 void sendData(const IPC::DataReference&, CompletionHandler<void()>&&); 52 52 void close(int32_t code, const String& reason); -
trunk/Source/WebKit/NetworkProcess/cocoa/WebSocketTaskCocoa.mm
r256890 r263797 116 116 } 117 117 118 void WebSocketTask::sendString(const String& text, CompletionHandler<void()>&& callback)118 void WebSocketTask::sendString(const IPC::DataReference& utf8String, CompletionHandler<void()>&& callback) 119 119 { 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 { 122 127 // Workaround rdar://problem/55324926 until it gets fixed. 123 128 callOnMainRunLoop(WTFMove(callback)); … … 128 133 { 129 134 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 { 132 137 // Workaround rdar://problem/55324926 until it gets fixed. 133 138 callOnMainRunLoop(WTFMove(callback)); … … 141 146 code = 1005; 142 147 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()]; 144 149 } 145 150 -
trunk/Source/WebKit/NetworkProcess/soup/WebSocketTaskSoup.cpp
r258393 r263797 186 186 } 187 187 188 void WebSocketTask::sendString(const String& text, CompletionHandler<void()>&& callback)188 void WebSocketTask::sendString(const IPC::DataReference& utf8, CompletionHandler<void()>&& callback) 189 189 { 190 190 if (m_connection && soup_websocket_connection_get_state(m_connection.get()) == SOUP_WEBSOCKET_STATE_OPEN) { 191 CString utf8 = text.utf8(StrictConversionReplacingUnpairedSurrogatesWithFFFD);192 191 #if SOUP_CHECK_VERSION(2, 67, 3) 193 192 // 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())); 195 194 soup_websocket_connection_send_message(m_connection.get(), SOUP_WEBSOCKET_DATA_TEXT, bytes.get()); 196 195 #else -
trunk/Source/WebKit/NetworkProcess/soup/WebSocketTaskSoup.h
r258393 r263797 42 42 ~WebSocketTask(); 43 43 44 void sendString(const String&, CompletionHandler<void()>&&);44 void sendString(const IPC::DataReference&, CompletionHandler<void()>&&); 45 45 void sendData(const IPC::DataReference&, CompletionHandler<void()>&&); 46 46 void close(int32_t code, const String& reason); -
trunk/Source/WebKit/WebProcess/Network/WebSocketChannel.cpp
r262999 r263797 57 57 NetworkSendQueue WebSocketChannel::createMessageQueue(Document& document, WebSocketChannel& channel) 58 58 { 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()); 63 62 }, [&channel](const char* data, size_t byteLength) { 64 63 channel.notifySendFrame(WebSocketFrame::OpCode::OpCodeBinary, data, byteLength); … … 163 162 WebSocketChannel::SendResult WebSocketChannel::send(const String& message) 164 163 { 165 auto byteLength = message.sizeInBytes();166 if (!increaseBufferedAmount( byteLength))164 auto utf8 = message.utf8(StrictConversionReplacingUnpairedSurrogatesWithFFFD); 165 if (!increaseBufferedAmount(utf8.length())) 167 166 return SendFail; 168 167 169 m_messageQueue.enqueue( message);168 m_messageQueue.enqueue(WTFMove(utf8)); 170 169 return SendSuccess; 171 170 }
Note:
See TracChangeset
for help on using the changeset viewer.