| Index: Source/modules/websockets/MainThreadWebSocketChannel.cpp
|
| diff --git a/Source/modules/websockets/MainThreadWebSocketChannel.cpp b/Source/modules/websockets/MainThreadWebSocketChannel.cpp
|
| index 2765feaeda26fb14ca72e2761e48cecce4278a71..12f2084eae9ba60957878f3390dd6b4fb89ae83a 100644
|
| --- a/Source/modules/websockets/MainThreadWebSocketChannel.cpp
|
| +++ b/Source/modules/websockets/MainThreadWebSocketChannel.cpp
|
| @@ -76,11 +76,10 @@ MainThreadWebSocketChannel::MainThreadWebSocketChannel(Document* document, WebSo
|
| , m_client(client)
|
| , m_resumeTimer(this, &MainThreadWebSocketChannel::resumeTimerFired)
|
| , m_suspended(false)
|
| - , m_closing(false)
|
| , m_didFailOfClientAlreadyRun(false)
|
| , m_receivedClosingHandshake(false)
|
| , m_closingTimer(this, &MainThreadWebSocketChannel::closingTimerFired)
|
| - , m_closed(false)
|
| + , m_state(ChannelIdle)
|
| , m_shouldDiscardReceivedData(false)
|
| , m_unhandledBufferedAmount(0)
|
| , m_identifier(0)
|
| @@ -197,7 +196,7 @@ void MainThreadWebSocketChannel::close(int code, const String& reason)
|
| if (!m_handle)
|
| return;
|
| startClosingHandshake(code, reason);
|
| - if (m_closing && !m_closingTimer.isActive())
|
| + if ((m_state == ChannelClosing || m_state == ChannelClosed) && !m_closingTimer.isActive())
|
| m_closingTimer.startOneShot(2 * TCPMaximumSegmentLifetime);
|
| }
|
|
|
| @@ -225,7 +224,7 @@ void MainThreadWebSocketChannel::fail(const String& reason, MessageLevel level,
|
| if (m_client)
|
| m_client->didReceiveMessageError();
|
| }
|
| - if (m_handle && !m_closed)
|
| + if (m_handle && (m_state != ChannelClosed))
|
| m_handle->disconnect(); // Will call didCloseSocketStream().
|
| }
|
|
|
| @@ -250,7 +249,7 @@ void MainThreadWebSocketChannel::suspend()
|
| void MainThreadWebSocketChannel::resume()
|
| {
|
| m_suspended = false;
|
| - if ((!m_buffer.isEmpty() || m_closed) && m_client && !m_resumeTimer.isActive())
|
| + if ((!m_buffer.isEmpty() || (m_state == ChannelClosed)) && m_client && !m_resumeTimer.isActive())
|
| m_resumeTimer.startOneShot(0);
|
| }
|
|
|
| @@ -281,7 +280,7 @@ void MainThreadWebSocketChannel::didCloseSocketStream(SocketStreamHandle* handle
|
| if (m_identifier && m_document)
|
| InspectorInstrumentation::didCloseWebSocket(m_document, m_identifier);
|
| ASSERT_UNUSED(handle, handle == m_handle || !m_handle);
|
| - m_closed = true;
|
| + m_state = ChannelClosed;
|
| if (m_closingTimer.isActive())
|
| m_closingTimer.stop();
|
| if (m_outgoingFrameQueueStatus != OutgoingFrameQueueClosed)
|
| @@ -352,11 +351,11 @@ void MainThreadWebSocketChannel::didFailSocketStream(SocketStreamHandle* handle,
|
| failingURL = m_handshake->url().string();
|
| LOG(Network, "Error Message: '%s', FailURL: '%s'", message.utf8().data(), failingURL.utf8().data());
|
| RefPtr<WebSocketChannel> protect(this);
|
| - if (m_client && !m_closing && !m_didFailOfClientAlreadyRun) {
|
| + if (m_client && (m_state != ChannelClosing && m_state != ChannelClosed) && !m_didFailOfClientAlreadyRun) {
|
| m_didFailOfClientAlreadyRun = true;
|
| m_client->didReceiveMessageError();
|
| }
|
| - if (m_handle && !m_closed)
|
| + if (m_handle && (m_state != ChannelClosed))
|
| m_handle->disconnect();
|
| }
|
|
|
| @@ -471,14 +470,14 @@ void MainThreadWebSocketChannel::resumeTimerFired(Timer<MainThreadWebSocketChann
|
| while (!m_suspended && m_client && !m_buffer.isEmpty())
|
| if (!processBuffer())
|
| break;
|
| - if (!m_suspended && m_client && m_closed && m_handle)
|
| + if (!m_suspended && m_client && (m_state == ChannelClosed) && m_handle)
|
| didCloseSocketStream(m_handle.get());
|
| }
|
|
|
| void MainThreadWebSocketChannel::startClosingHandshake(int code, const String& reason)
|
| {
|
| - LOG(Network, "MainThreadWebSocketChannel %p startClosingHandshake() code=%d m_receivedClosingHandshake=%d", this, m_closing, m_receivedClosingHandshake);
|
| - if (m_closing)
|
| + LOG(Network, "MainThreadWebSocketChannel %p startClosingHandshake() code=%d m_receivedClosingHandshake=%d", this, (m_state == ChannelClosing), m_receivedClosingHandshake);
|
| + if (m_state == ChannelClosing || m_state == ChannelClosed)
|
| return;
|
| ASSERT(m_handle);
|
|
|
| @@ -493,7 +492,7 @@ void MainThreadWebSocketChannel::startClosingHandshake(int code, const String& r
|
| enqueueRawFrame(WebSocketFrame::OpCodeClose, buf.data(), buf.size());
|
| processOutgoingFrameQueue();
|
|
|
| - m_closing = true;
|
| + m_state = ChannelClosing;
|
| if (m_client)
|
| m_client->didStartClosingHandshake();
|
| }
|
| @@ -666,7 +665,7 @@ bool MainThreadWebSocketChannel::processFrame()
|
| skipBuffer(frameEnd - m_buffer.data());
|
| m_receivedClosingHandshake = true;
|
| startClosingHandshake(m_closeEventCode, m_closeEventReason);
|
| - if (m_closing) {
|
| + if (m_state == ChannelClosing || m_state == ChannelClosed) {
|
| m_outgoingFrameQueueStatus = OutgoingFrameQueueClosing;
|
| processOutgoingFrameQueue();
|
| }
|
|
|