Title: [214106] trunk/Source
Revision
214106
Author
[email protected]
Date
2017-03-17 08:57:23 -0700 (Fri, 17 Mar 2017)

Log Message

Use completion handlers instead of return values for sending websocket data
https://bugs.webkit.org/show_bug.cgi?id=169802

Reviewed by Carlos Garcia Campos.

Source/WebCore:

No change in behavior, but this is a baby step towards making things more asynchronous.

* Modules/websockets/WebSocketChannel.cpp:
(WebCore::WebSocketChannel::didOpenSocketStream):
(WebCore::WebSocketChannel::processOutgoingFrameQueue):
(WebCore::WebSocketChannel::sendFrame):
* Modules/websockets/WebSocketChannel.h:
* platform/network/SocketStreamHandle.cpp:
(WebCore::SocketStreamHandle::send):
* platform/network/SocketStreamHandle.h:
* platform/network/cf/SocketStreamHandleImpl.h:

Source/WebKit2:

* UIProcess/InspectorServer/WebSocketServerConnection.cpp:
(WebKit::WebSocketServerConnection::sendWebSocketMessage):
(WebKit::WebSocketServerConnection::sendHTTPResponseHeader):
(WebKit::WebSocketServerConnection::sendRawData):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (214105 => 214106)


--- trunk/Source/WebCore/ChangeLog	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/ChangeLog	2017-03-17 15:57:23 UTC (rev 214106)
@@ -1,3 +1,22 @@
+2017-03-16  Alex Christensen  <[email protected]>
+
+        Use completion handlers instead of return values for sending websocket data
+        https://bugs.webkit.org/show_bug.cgi?id=169802
+
+        Reviewed by Carlos Garcia Campos.
+
+        No change in behavior, but this is a baby step towards making things more asynchronous.
+
+        * Modules/websockets/WebSocketChannel.cpp:
+        (WebCore::WebSocketChannel::didOpenSocketStream):
+        (WebCore::WebSocketChannel::processOutgoingFrameQueue):
+        (WebCore::WebSocketChannel::sendFrame):
+        * Modules/websockets/WebSocketChannel.h:
+        * platform/network/SocketStreamHandle.cpp:
+        (WebCore::SocketStreamHandle::send):
+        * platform/network/SocketStreamHandle.h:
+        * platform/network/cf/SocketStreamHandleImpl.h:
+
 2017-03-17  Zan Dobersek  <[email protected]>
 
         WebGPU: build fixes for non-Cocoa platforms

Modified: trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp (214105 => 214106)


--- trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp	2017-03-17 15:57:23 UTC (rev 214106)
@@ -278,8 +278,10 @@
     if (m_identifier)
         InspectorInstrumentation::willSendWebSocketHandshakeRequest(m_document, m_identifier, m_handshake->clientHandshakeRequest());
     CString handshakeMessage = m_handshake->clientHandshakeMessage();
-    if (!handle.send(handshakeMessage.data(), handshakeMessage.length()))
-        fail("Failed to send WebSocket handshake.");
+    handle.send(handshakeMessage.data(), handshakeMessage.length(), [this, protectedThis = makeRef(*this)] (bool success) {
+        if (!success)
+            fail("Failed to send WebSocket handshake.");
+    });
 }
 
 void WebSocketChannel::didCloseSocketStream(SocketStreamHandle& handle)
@@ -742,14 +744,18 @@
         auto frame = m_outgoingFrameQueue.takeFirst();
         switch (frame->frameType) {
         case QueuedFrameTypeString: {
-            if (!sendFrame(frame->opCode, frame->stringData.data(), frame->stringData.length()))
-                fail("Failed to send WebSocket frame.");
+            sendFrame(frame->opCode, frame->stringData.data(), frame->stringData.length(), [this, protectedThis = makeRef(*this)] (bool success) {
+                if (!success)
+                    fail("Failed to send WebSocket frame.");
+            });
             break;
         }
 
         case QueuedFrameTypeVector:
-            if (!sendFrame(frame->opCode, frame->vectorData.data(), frame->vectorData.size()))
-                fail("Failed to send WebSocket frame.");
+            sendFrame(frame->opCode, frame->vectorData.data(), frame->vectorData.size(), [this, protectedThis = makeRef(*this)] (bool success) {
+                if (!success)
+                    fail("Failed to send WebSocket frame.");
+            });
             break;
 
         case QueuedFrameTypeBlob: {
@@ -773,8 +779,10 @@
                 RefPtr<ArrayBuffer> result = m_blobLoader->arrayBufferResult();
                 m_blobLoader = nullptr;
                 m_blobLoaderStatus = BlobLoaderNotStarted;
-                if (!sendFrame(frame->opCode, static_cast<const char*>(result->data()), result->byteLength()))
-                    fail("Failed to send WebSocket frame.");
+                sendFrame(frame->opCode, static_cast<const char*>(result->data()), result->byteLength(), [this, protectedThis = makeRef(*this)] (bool success) {
+                    if (!success)
+                        fail("Failed to send WebSocket frame.");
+                });
                 break;
             }
             }
@@ -804,7 +812,7 @@
     }
 }
 
-bool WebSocketChannel::sendFrame(WebSocketFrame::OpCode opCode, const char* data, size_t dataLength)
+void WebSocketChannel::sendFrame(WebSocketFrame::OpCode opCode, const char* data, size_t dataLength, Function<void(bool)> completionHandler)
 {
     ASSERT(m_handle);
     ASSERT(!m_suspended);
@@ -815,13 +823,13 @@
     auto deflateResult = m_deflateFramer.deflate(frame);
     if (!deflateResult->succeeded()) {
         fail(deflateResult->failureReason());
-        return false;
+        return completionHandler(false);
     }
 
     Vector<char> frameData;
     frame.makeFrameData(frameData);
 
-    return m_handle->send(frameData.data(), frameData.size());
+    m_handle->send(frameData.data(), frameData.size(), WTFMove(completionHandler));
 }
 
 }  // namespace WebCore

Modified: trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h (214105 => 214106)


--- trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h	2017-03-17 15:57:23 UTC (rev 214106)
@@ -173,7 +173,7 @@
 
     // If you are going to send a hybi-10 frame, you need to use the outgoing frame queue
     // instead of call sendFrame() directly.
-    bool sendFrame(WebSocketFrame::OpCode, const char* data, size_t dataLength);
+    void sendFrame(WebSocketFrame::OpCode, const char* data, size_t dataLength, Function<void(bool)> completionHandler);
 
     enum BlobLoaderStatus {
         BlobLoaderNotStarted,

Modified: trunk/Source/WebCore/platform/network/SocketStreamHandle.cpp (214105 => 214106)


--- trunk/Source/WebCore/platform/network/SocketStreamHandle.cpp	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/platform/network/SocketStreamHandle.cpp	2017-03-17 15:57:23 UTC (rev 214106)
@@ -32,6 +32,7 @@
 #include "SocketStreamHandle.h"
 
 #include "SocketStreamHandleClient.h"
+#include <wtf/Function.h>
 
 namespace WebCore {
 
@@ -49,18 +50,18 @@
     return m_state;
 }
 
-bool SocketStreamHandle::send(const char* data, size_t length)
+void SocketStreamHandle::send(const char* data, size_t length, Function<void(bool)> completionHandler)
 {
     if (m_state == Connecting || m_state == Closing)
-        return false;
+        return completionHandler(false);
     if (!m_buffer.isEmpty()) {
         if (m_buffer.size() + length > bufferSize) {
             // FIXME: report error to indicate that buffer has no more space.
-            return false;
+            return completionHandler(false);
         }
         m_buffer.append(data, length);
         m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
-        return true;
+        return completionHandler(true);
     }
     size_t bytesWritten = 0;
     if (m_state == Open) {
@@ -67,17 +68,17 @@
         if (auto result = platformSend(data, length))
             bytesWritten = result.value();
         else
-            return false;
+            return completionHandler(false);
     }
     if (m_buffer.size() + length - bytesWritten > bufferSize) {
         // FIXME: report error to indicate that buffer has no more space.
-        return false;
+        return completionHandler(false);
     }
     if (bytesWritten < length) {
         m_buffer.append(data + bytesWritten, length - bytesWritten);
         m_client.didUpdateBufferedAmount(static_cast<SocketStreamHandle&>(*this), bufferedAmount());
     }
-    return true;
+    return completionHandler(true);
 }
 
 void SocketStreamHandle::close()

Modified: trunk/Source/WebCore/platform/network/SocketStreamHandle.h (214105 => 214106)


--- trunk/Source/WebCore/platform/network/SocketStreamHandle.h	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/platform/network/SocketStreamHandle.h	2017-03-17 15:57:23 UTC (rev 214106)
@@ -45,7 +45,7 @@
     virtual ~SocketStreamHandle() { }
     SocketStreamState state() const;
 
-    bool send(const char* data, size_t length);
+    void send(const char* data, size_t length, Function<void(bool)>);
     void close(); // Disconnect after all data in buffer are sent.
     void disconnect();
     size_t bufferedAmount() const { return m_buffer.size(); }

Modified: trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImpl.h (214105 => 214106)


--- trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImpl.h	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebCore/platform/network/cf/SocketStreamHandleImpl.h	2017-03-17 15:57:23 UTC (rev 214106)
@@ -50,8 +50,8 @@
     virtual ~SocketStreamHandleImpl();
 
 private:
-    virtual std::optional<size_t> platformSend(const char* data, size_t length);
-    virtual void platformClose();
+    std::optional<size_t> platformSend(const char* data, size_t length) final;
+    void platformClose() final;
 
     WEBCORE_EXPORT SocketStreamHandleImpl(const URL&, SocketStreamHandleClient&, SessionID, const String& credentialPartition);
     void createStreams();

Modified: trunk/Source/WebKit2/ChangeLog (214105 => 214106)


--- trunk/Source/WebKit2/ChangeLog	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebKit2/ChangeLog	2017-03-17 15:57:23 UTC (rev 214106)
@@ -1,3 +1,15 @@
+2017-03-16  Alex Christensen  <[email protected]>
+
+        Use completion handlers instead of return values for sending websocket data
+        https://bugs.webkit.org/show_bug.cgi?id=169802
+
+        Reviewed by Carlos Garcia Campos.
+
+        * UIProcess/InspectorServer/WebSocketServerConnection.cpp:
+        (WebKit::WebSocketServerConnection::sendWebSocketMessage):
+        (WebKit::WebSocketServerConnection::sendHTTPResponseHeader):
+        (WebKit::WebSocketServerConnection::sendRawData):
+
 2017-03-17  Tomas Popela  <[email protected]>
 
         Fix uninitialized public members in WebProcess

Modified: trunk/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp (214105 => 214106)


--- trunk/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp	2017-03-17 14:11:24 UTC (rev 214105)
+++ trunk/Source/WebKit2/UIProcess/InspectorServer/WebSocketServerConnection.cpp	2017-03-17 15:57:23 UTC (rev 214106)
@@ -39,6 +39,7 @@
 #include <WebCore/SocketStreamHandle.h>
 #include <WebCore/WebSocketChannel.h>
 #include <WebCore/WebSocketHandshake.h>
+#include <wtf/Function.h>
 #include <wtf/text/CString.h>
 #include <wtf/text/StringBuilder.h>
 
@@ -91,7 +92,7 @@
     Vector<char> frameData;
     frame.makeFrameData(frameData);
 
-    m_socket->send(frameData.data(), frameData.size());
+    m_socket->send(frameData.data(), frameData.size(), [](bool) { });
 }
 
 void WebSocketServerConnection::sendHTTPResponseHeader(int statusCode, const String& statusText, const HTTPHeaderMap& headerFields)
@@ -112,12 +113,12 @@
     builder.appendLiteral("\r\n");
 
     CString header = builder.toString().latin1();
-    m_socket->send(header.data(), header.length());
+    m_socket->send(header.data(), header.length(), [](bool) { });
 }
 
 void WebSocketServerConnection::sendRawData(const char* data, size_t length)
 {
-    m_socket->send(data, length);
+    m_socket->send(data, length, [](bool) { });
 }
 
 void WebSocketServerConnection::didCloseSocketStream(SocketStreamHandle&)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to