Index: Source/web/WebSocketImpl.cpp |
diff --git a/Source/web/WebSocketImpl.cpp b/Source/web/WebSocketImpl.cpp |
index b8bd5fcfb7c7fb0e36cbceff3bc3bfc336fce2ec..dc964f53d51645d8482bb4eac4790c4049e7e55f 100644 |
--- a/Source/web/WebSocketImpl.cpp |
+++ b/Source/web/WebSocketImpl.cpp |
@@ -42,6 +42,7 @@ |
#include "public/platform/WebURL.h" |
#include "public/web/WebDocument.h" |
#include "wtf/ArrayBuffer.h" |
+#include "wtf/text/CString.h" |
#include "wtf/text/WTFString.h" |
using namespace WebCore; |
@@ -51,6 +52,9 @@ namespace blink { |
WebSocketImpl::WebSocketImpl(const WebDocument& document, WebSocketClient* client) |
: m_client(client) |
, m_binaryType(BinaryTypeBlob) |
+ , m_isClosingOrClosed(false) |
+ , m_bufferedAmount(0) |
+ , m_bufferedAmountAfterClose(0) |
{ |
RefPtrWillBeRawPtr<Document> coreDocument = PassRefPtrWillBeRawPtr<Document>(document); |
if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { |
@@ -95,21 +99,44 @@ WebString WebSocketImpl::extensions() |
bool WebSocketImpl::sendText(const WebString& message) |
{ |
+ size_t size = message.utf8().length(); |
+ m_bufferedAmount += size; |
+ if (m_isClosingOrClosed) |
+ m_bufferedAmountAfterClose += size; |
+ |
+ // FIXME: Deprecate this call. |
+ m_client->didUpdateBufferedAmount(m_bufferedAmount); |
+ |
+ if (m_isClosingOrClosed) |
yhirano
2014/06/19 07:49:43
I added return here in order not to send messages
|
+ return true; |
+ |
return m_private->send(message) == WebSocketChannel::SendSuccess; |
} |
bool WebSocketImpl::sendArrayBuffer(const WebArrayBuffer& webArrayBuffer) |
{ |
+ size_t size = webArrayBuffer.byteLength(); |
+ m_bufferedAmount += size; |
+ if (m_isClosingOrClosed) |
+ m_bufferedAmountAfterClose += size; |
+ |
+ // FIXME: Deprecate this call. |
+ m_client->didUpdateBufferedAmount(m_bufferedAmount); |
+ |
+ if (m_isClosingOrClosed) |
+ return true; |
+ |
return m_private->send(*PassRefPtr<ArrayBuffer>(webArrayBuffer), 0, webArrayBuffer.byteLength()) == WebSocketChannel::SendSuccess; |
} |
unsigned long WebSocketImpl::bufferedAmount() const |
{ |
- return m_private->bufferedAmount(); |
+ return m_bufferedAmount; |
} |
void WebSocketImpl::close(int code, const WebString& reason) |
{ |
+ m_isClosingOrClosed = true; |
m_private->close(code, reason); |
} |
@@ -126,6 +153,9 @@ void WebSocketImpl::disconnect() |
void WebSocketImpl::didConnect(const String& subprotocol, const String& extensions) |
{ |
+ m_client->didConnect(subprotocol, extensions); |
+ |
+ // FIXME: Deprecate these statements. |
m_subprotocol = subprotocol; |
m_extensions = extensions; |
m_client->didConnect(); |
@@ -153,9 +183,13 @@ void WebSocketImpl::didReceiveMessageError() |
m_client->didReceiveMessageError(); |
} |
-void WebSocketImpl::didUpdateBufferedAmount(unsigned long bufferedAmount) |
+void WebSocketImpl::didConsumeBufferedAmount(unsigned long consumed) |
{ |
- m_client->didUpdateBufferedAmount(bufferedAmount); |
+ m_client->didConsumeBufferedAmount(consumed); |
+ |
+ // FIXME: Deprecate the following statements. |
+ m_bufferedAmount -= consumed; |
+ m_client->didUpdateBufferedAmount(m_bufferedAmount); |
} |
void WebSocketImpl::didStartClosingHandshake() |
@@ -163,9 +197,13 @@ void WebSocketImpl::didStartClosingHandshake() |
m_client->didStartClosingHandshake(); |
} |
-void WebSocketImpl::didClose(unsigned long bufferedAmount, ClosingHandshakeCompletionStatus status, unsigned short code, const String& reason) |
+void WebSocketImpl::didClose(ClosingHandshakeCompletionStatus status, unsigned short code, const String& reason) |
{ |
- m_client->didClose(bufferedAmount, static_cast<WebSocketClient::ClosingHandshakeCompletionStatus>(status), code, WebString(reason)); |
+ m_isClosingOrClosed = true; |
+ m_client->didClose(static_cast<WebSocketClient::ClosingHandshakeCompletionStatus>(status), code, WebString(reason)); |
+ |
+ // FIXME: Deprecate this call. |
+ m_client->didClose(m_bufferedAmount - m_bufferedAmountAfterClose, static_cast<WebSocketClient::ClosingHandshakeCompletionStatus>(status), code, WebString(reason)); |
} |
} // namespace blink |