Index: trunk/Source/modules/websockets/NewWebSocketChannelImpl.cpp |
=================================================================== |
--- trunk/Source/modules/websockets/NewWebSocketChannelImpl.cpp (revision 176310) |
+++ trunk/Source/modules/websockets/NewWebSocketChannelImpl.cpp (working copy) |
@@ -115,6 +115,7 @@ |
, m_identifier(0) |
, m_sendingQuota(0) |
, m_receivedDataSizeForFlowControl(receivedDataSizeForFlowControlHighWaterMark * 2) // initial quota |
+ , m_bufferedAmount(0) |
, m_sentSizeOfTopMessage(0) |
, m_sourceURLAtConstruction(sourceURL) |
, m_lineNumberAtConstruction(lineNumber) |
@@ -228,6 +229,12 @@ |
return SendSuccess; |
} |
+unsigned long NewWebSocketChannelImpl::bufferedAmount() const |
+{ |
+ WTF_LOG(Network, "NewWebSocketChannelImpl %p bufferedAmount()", this); |
+ return m_bufferedAmount; |
+} |
+ |
void NewWebSocketChannelImpl::close(int code, const String& reason) |
{ |
WTF_LOG(Network, "NewWebSocketChannelImpl %p close(%d, %s)", this, code, reason.utf8().data()); |
@@ -298,7 +305,7 @@ |
void NewWebSocketChannelImpl::sendInternal() |
{ |
ASSERT(m_handle); |
- unsigned long consumedBufferedAmount = 0; |
+ unsigned long bufferedAmount = m_bufferedAmount; |
while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { |
bool final = false; |
Message* message = m_messages.first().get(); |
@@ -311,7 +318,6 @@ |
m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMessage, size); |
m_sentSizeOfTopMessage += size; |
m_sendingQuota -= size; |
- consumedBufferedAmount += size; |
break; |
} |
case MessageTypeBlob: |
@@ -326,7 +332,6 @@ |
m_handle->send(final, type, static_cast<const char*>(message->arrayBuffer->data()) + m_sentSizeOfTopMessage, size); |
m_sentSizeOfTopMessage += size; |
m_sendingQuota -= size; |
- consumedBufferedAmount += size; |
break; |
} |
case MessageTypeVector: { |
@@ -337,7 +342,6 @@ |
m_handle->send(final, type, message->vectorData->data() + m_sentSizeOfTopMessage, size); |
m_sentSizeOfTopMessage += size; |
m_sendingQuota -= size; |
- consumedBufferedAmount += size; |
break; |
} |
} |
@@ -346,8 +350,9 @@ |
m_sentSizeOfTopMessage = 0; |
} |
} |
- if (m_client && consumedBufferedAmount > 0) |
- m_client->didConsumeBufferedAmount(consumedBufferedAmount); |
+ if (m_client && m_bufferedAmount != bufferedAmount) { |
+ m_client->didUpdateBufferedAmount(m_bufferedAmount); |
+ } |
} |
void NewWebSocketChannelImpl::flowControlIfNecessary() |
@@ -378,7 +383,7 @@ |
m_client = 0; |
WebSocketChannelClient::ClosingHandshakeCompletionStatus status = |
wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketChannelClient::ClosingHandshakeIncomplete; |
- client->didClose(status, code, reason); |
+ client->didClose(m_bufferedAmount, status, code, reason); |
// client->didClose may delete this object. |
} |