Chromium Code Reviews| Index: Source/modules/websockets/WebSocket.cpp |
| diff --git a/Source/modules/websockets/WebSocket.cpp b/Source/modules/websockets/WebSocket.cpp |
| index 1452cae0b26a0db80fa64eb0c1105f44b6a38bc5..d1b10f7c404b98fc614673cba7d901e8063a3985 100644 |
| --- a/Source/modules/websockets/WebSocket.cpp |
| +++ b/Source/modules/websockets/WebSocket.cpp |
| @@ -227,11 +227,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); |
| } |
| @@ -372,6 +374,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 decreaseBufferedAmount() %lu => %lu", this, m_bufferedAmount, m_bufferedAmount - m_consumedBufferedAmount); |
|
tyoshino (SeeGerritForStatus)
2014/06/16 07:31:42
reflect
yhirano
2014/06/16 10:19:44
Done.
|
| + |
| + m_bufferedAmount -= m_consumedBufferedAmount; |
| + m_consumedBufferedAmount = 0; |
| +} |
| + |
| void WebSocket::releaseChannel() |
| { |
| ASSERT(m_channel); |
| @@ -392,6 +403,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); |
| } |
| @@ -408,6 +420,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); |
| } |
| @@ -424,6 +437,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); |
| } |
| @@ -440,6 +454,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); |
| } |
| @@ -639,12 +654,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() |
| @@ -653,15 +671,17 @@ 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; |
| - |
| + m_bufferedAmount -= m_consumedBufferedAmount; |
|
tyoshino (SeeGerritForStatus)
2014/06/16 07:31:42
doesn't updating m_bufferedAmount here violate the
yhirano
2014/06/16 10:19:44
The spec says:
The bufferedAmount attribute must r
yhirano
2014/06/16 11:53:23
Done.
|
| + m_consumedBufferedAmount = 0; |
| + bool hasAllDataConsumed = !m_bufferedAmount; |
| + 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(); |
| } |