Chromium Code Reviews| Index: Source/modules/websockets/MainThreadWebSocketChannel.cpp |
| diff --git a/Source/modules/websockets/MainThreadWebSocketChannel.cpp b/Source/modules/websockets/MainThreadWebSocketChannel.cpp |
| index 5867f28ba226e620b9617d5cedd043983be501d2..0d2e868c51391a290f4034f0f363e648de63de9c 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) |
| @@ -182,14 +182,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()); |
| @@ -318,13 +310,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(); |
| } |
| @@ -355,10 +346,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; |
| + } |
| + size_t remain = consumed; |
| + if (!remain || !m_client || m_state == ChannelClosing || m_state == ChannelClosed) |
|
tyoshino (SeeGerritForStatus)
2014/06/16 02:29:28
[optional] i prefer checking "m_client" and "m_sta
yhirano
2014/06/16 04:44:27
Done.
|
| + return; |
| + 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) |
| @@ -865,6 +881,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()); |