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

Unified Diff: Source/modules/websockets/WebSocket.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/WebSocket.cpp
diff --git a/Source/modules/websockets/WebSocket.cpp b/Source/modules/websockets/WebSocket.cpp
index dfdcbf2865d69a6f6ddd4cb39aa5cbf225c599be..b7db4ce9e3be450808ab1350d8311f5ecf8c1eb4 100644
--- a/Source/modules/websockets/WebSocket.cpp
+++ b/Source/modules/websockets/WebSocket.cpp
@@ -228,11 +228,13 @@ WebSocket::WebSocket(ExecutionContext* context)
: ActiveDOMObject(context)
, m_state(CONNECTING)
, m_bufferedAmount(0)
+ , m_consumedBufferedAmount(0)
, m_bufferedAmountAfterClose(0)
, m_binaryType(BinaryTypeBlob)
, m_subprotocol("")
, m_extensions("")
, m_eventQueue(EventQueue::create(this))
+ , m_bufferedAmountConsumeTimer(this, &WebSocket::reflectBufferedAmountConsumption)
{
ScriptWrappable::init(this);
}
@@ -373,6 +375,15 @@ void WebSocket::updateBufferedAmountAfterClose(unsigned long payloadSize)
logError("WebSocket is already in CLOSING or CLOSED state.");
}
+void WebSocket::reflectBufferedAmountConsumption(Timer<WebSocket>*)
+{
+ ASSERT(m_bufferedAmount >= m_consumedBufferedAmount);
+ WTF_LOG(Network, "WebSocket %p reflectBufferedAmountConsumption() %lu => %lu", this, m_bufferedAmount, m_bufferedAmount - m_consumedBufferedAmount);
+
+ m_bufferedAmount -= m_consumedBufferedAmount;
+ m_consumedBufferedAmount = 0;
+}
+
void WebSocket::releaseChannel()
{
ASSERT(m_channel);
@@ -393,6 +404,7 @@ void WebSocket::send(const String& message, ExceptionState& exceptionState)
return;
}
ASSERT(m_channel);
+ m_bufferedAmount += message.utf8().length();
handleSendResult(m_channel->send(message), exceptionState, WebSocketSendTypeString);
}
@@ -409,6 +421,7 @@ void WebSocket::send(ArrayBuffer* binaryData, ExceptionState& exceptionState)
return;
}
ASSERT(m_channel);
+ m_bufferedAmount += binaryData->byteLength();
handleSendResult(m_channel->send(*binaryData, 0, binaryData->byteLength()), exceptionState, WebSocketSendTypeArrayBuffer);
}
@@ -425,6 +438,7 @@ void WebSocket::send(ArrayBufferView* arrayBufferView, ExceptionState& exception
return;
}
ASSERT(m_channel);
+ m_bufferedAmount += arrayBufferView->byteLength();
RefPtr<ArrayBuffer> arrayBuffer(arrayBufferView->buffer());
handleSendResult(m_channel->send(*arrayBuffer, arrayBufferView->byteOffset(), arrayBufferView->byteLength()), exceptionState, WebSocketSendTypeArrayBufferView);
}
@@ -441,6 +455,7 @@ void WebSocket::send(Blob* binaryData, ExceptionState& exceptionState)
updateBufferedAmountAfterClose(static_cast<unsigned long>(binaryData->size()));
return;
}
+ m_bufferedAmount += binaryData->size();
ASSERT(m_channel);
handleSendResult(m_channel->send(binaryData->blobDataHandle()), exceptionState, WebSocketSendTypeBlob);
}
@@ -640,12 +655,15 @@ void WebSocket::didReceiveMessageError()
m_eventQueue->dispatch(Event::create(EventTypeNames::error));
}
-void WebSocket::didUpdateBufferedAmount(unsigned long bufferedAmount)
+void WebSocket::didConsumeBufferedAmount(unsigned long consumed)
{
- WTF_LOG(Network, "WebSocket %p didUpdateBufferedAmount() New bufferedAmount is %lu", this, bufferedAmount);
+ ASSERT(m_bufferedAmount >= consumed);
+ WTF_LOG(Network, "WebSocket %p didConsumeBufferedAmount(%lu)", this, consumed);
if (m_state == CLOSED)
return;
- m_bufferedAmount = bufferedAmount;
+ m_consumedBufferedAmount += consumed;
+ if (!m_bufferedAmountConsumeTimer.isActive())
+ m_bufferedAmountConsumeTimer.startOneShot(0, FROM_HERE);
}
void WebSocket::didStartClosingHandshake()
@@ -654,15 +672,15 @@ void WebSocket::didStartClosingHandshake()
m_state = CLOSING;
}
-void WebSocket::didClose(unsigned long unhandledBufferedAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
+void WebSocket::didClose(ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
{
WTF_LOG(Network, "WebSocket %p didClose()", this);
if (!m_channel)
return;
- bool wasClean = m_state == CLOSING && !unhandledBufferedAmount && closingHandshakeCompletion == ClosingHandshakeComplete && code != WebSocketChannel::CloseEventCodeAbnormalClosure;
-
+ bool hasAllDataConsumed = m_bufferedAmount == m_consumedBufferedAmount;
+ bool wasClean = m_state == CLOSING && hasAllDataConsumed && closingHandshakeCompletion == ClosingHandshakeComplete && code != WebSocketChannel::CloseEventCodeAbnormalClosure;
m_state = CLOSED;
- m_bufferedAmount = unhandledBufferedAmount;
+
m_eventQueue->dispatch(CloseEvent::create(wasClean, code, reason));
releaseChannel();
}

Powered by Google App Engine
This is Rietveld 408576698