Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2123)

Unified Diff: Source/modules/websockets/MainThreadWebSocketChannel.cpp

Issue 311993006: [WebSocket] bufferedAmount should not decrease inside a task. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/modules/websockets/MainThreadWebSocketChannel.cpp
diff --git a/Source/modules/websockets/MainThreadWebSocketChannel.cpp b/Source/modules/websockets/MainThreadWebSocketChannel.cpp
index 67bdb44290e30bc736413c619d5b98aafe1b46e3..8bb864a6b39f1f07d55bbb6a70f43864b0257a88 100644
--- a/Source/modules/websockets/MainThreadWebSocketChannel.cpp
+++ b/Source/modules/websockets/MainThreadWebSocketChannel.cpp
@@ -72,11 +72,11 @@ MainThreadWebSocketChannel::MainThreadWebSocketChannel(Document* document, WebSo
, m_closingTimer(this, &MainThreadWebSocketChannel::closingTimerFired)
, m_state(ChannelIdle)
, m_shouldDiscardReceivedData(false)
- , m_unhandledBufferedAmount(0)
, m_identifier(0)
, m_hasContinuousFrame(false)
, m_closeEventCode(CloseEventCodeAbnormalClosure)
, m_outgoingFrameQueueStatus(OutgoingFrameQueueOpen)
+ , m_numConsumedBytesInCurrentFrame(0)
, m_blobLoaderStatus(BlobLoaderNotStarted)
, m_sourceURLAtConstruction(sourceURL)
, m_lineNumberAtConstruction(lineNumber)
@@ -160,14 +160,6 @@ WebSocketChannel::SendResult MainThreadWebSocketChannel::send(PassOwnPtr<Vector<
return WebSocketChannel::SendSuccess;
}
-unsigned long MainThreadWebSocketChannel::bufferedAmount() const
-{
- WTF_LOG(Network, "MainThreadWebSocketChannel %p bufferedAmount()", this);
- ASSERT(m_handle);
- ASSERT(!m_suspended);
- return m_handle->bufferedAmount();
-}
-
void MainThreadWebSocketChannel::close(int code, const String& reason)
{
WTF_LOG(Network, "MainThreadWebSocketChannel %p close() code=%d reason='%s'", this, code, reason.utf8().data());
@@ -296,13 +288,12 @@ void MainThreadWebSocketChannel::didCloseSocketStream(SocketStreamHandle* handle
if (m_outgoingFrameQueueStatus != OutgoingFrameQueueClosed)
abortOutgoingFrameQueue();
if (m_handle) {
- m_unhandledBufferedAmount = m_handle->bufferedAmount();
WebSocketChannelClient* client = m_client;
m_client = 0;
clearDocument();
m_handle = nullptr;
if (client)
- client->didClose(m_unhandledBufferedAmount, m_receivedClosingHandshake ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketChannelClient::ClosingHandshakeIncomplete, m_closeEventCode, m_closeEventReason);
+ client->didClose(m_receivedClosingHandshake ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketChannelClient::ClosingHandshakeIncomplete, m_closeEventCode, m_closeEventReason);
}
deref();
}
@@ -333,10 +324,35 @@ void MainThreadWebSocketChannel::didReceiveSocketStreamData(SocketStreamHandle*
processBuffer();
}
-void MainThreadWebSocketChannel::didUpdateBufferedAmount(SocketStreamHandle*, size_t bufferedAmount)
+void MainThreadWebSocketChannel::didConsumeBufferedAmount(SocketStreamHandle*, size_t consumed)
{
- if (m_client)
- m_client->didUpdateBufferedAmount(bufferedAmount);
+ if (m_framingOverheadQueue.isEmpty()) {
+ // Ignore the handshake consumption.
+ return;
+ }
+ if (!m_client || m_state == ChannelClosed)
+ return;
+ size_t remain = consumed;
+ while (remain > 0) {
+ ASSERT(!m_framingOverheadQueue.isEmpty());
+ const FramingOverhead& frame = m_framingOverheadQueue.first();
+
+ ASSERT(m_numConsumedBytesInCurrentFrame <= frame.frameDataSize());
+ size_t consumedInThisFrame = std::min(remain, frame.frameDataSize() - m_numConsumedBytesInCurrentFrame);
+ remain -= consumedInThisFrame;
+ m_numConsumedBytesInCurrentFrame += consumedInThisFrame;
+
+ if (m_numConsumedBytesInCurrentFrame == frame.frameDataSize()) {
+ if (m_client && WebSocketFrame::isNonControlOpCode(frame.opcode())) {
+ // FIXME: As |consumed| is the number of possibly compressed
+ // bytes, we can't determine the number of consumed original
+ // bytes in the middle of a frame.
+ m_client->didConsumeBufferedAmount(frame.originalPayloadLength());
+ }
+ m_framingOverheadQueue.takeFirst();
+ m_numConsumedBytesInCurrentFrame = 0;
+ }
+ }
}
void MainThreadWebSocketChannel::didFailSocketStream(SocketStreamHandle* handle, const SocketStreamError& error)
@@ -845,6 +861,7 @@ bool MainThreadWebSocketChannel::sendFrame(WebSocketFrame::OpCode opCode, const
Vector<char> frameData;
frame.makeFrameData(frameData);
+ m_framingOverheadQueue.append(FramingOverhead(opCode, frameData.size(), dataLength));
m_perMessageDeflate.resetDeflateBuffer();
return m_handle->send(frameData.data(), frameData.size());

Powered by Google App Engine
This is Rietveld 408576698