Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1980)

Unified Diff: Source/web/WebSocketImpl.cpp

Issue 311993006: [WebSocket] bufferedAmount should not decrease inside a task. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/web/WebSocketImpl.h ('k') | public/web/WebSocket.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/web/WebSocketImpl.h ('k') | public/web/WebSocket.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698