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&)