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

Unified Diff: trunk/Source/modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp

Issue 338343002: Revert 176303 "ThreadableWebSocketChannelClientWrapper don't nee..." (Closed) Base URL: svn://svn.chromium.org/blink/
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
Index: trunk/Source/modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
===================================================================
--- trunk/Source/modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp (revision 176309)
+++ trunk/Source/modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp (working copy)
@@ -31,13 +31,24 @@
#include "config.h"
#include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h"
+#include "core/dom/CrossThreadTask.h"
+#include "core/dom/ExecutionContext.h"
+#include "platform/CrossThreadCopier.h"
+#include "wtf/PassRefPtr.h"
+#include "wtf/RefPtr.h"
+
namespace WebCore {
ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper(WebSocketChannelClient* client)
: m_client(client)
+ , m_suspended(false)
{
}
+ThreadableWebSocketChannelClientWrapper::~ThreadableWebSocketChannelClientWrapper()
+{
+}
+
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(WebSocketChannelClient* client)
{
return adoptRefWillBeNoop(new ThreadableWebSocketChannelClientWrapper(client));
@@ -50,44 +61,121 @@
void ThreadableWebSocketChannelClientWrapper::didConnect(const String& subprotocol, const String& extensions)
{
- if (m_client)
- m_client->didConnect(subprotocol, extensions);
+ m_pendingTasks.append(createCallbackTask(&didConnectCallback, this, subprotocol, extensions));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessage(const String& message)
{
- if (m_client)
- m_client->didReceiveMessage(message);
+ m_pendingTasks.append(createCallbackTask(&didReceiveMessageCallback, this, message));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(PassOwnPtr<Vector<char> > binaryData)
{
- if (m_client)
- m_client->didReceiveBinaryData(binaryData);
+ m_pendingTasks.append(createCallbackTask(&didReceiveBinaryDataCallback, this, binaryData));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didConsumeBufferedAmount(unsigned long consumed)
{
- if (m_client)
- m_client->didConsumeBufferedAmount(consumed);
+ m_pendingTasks.append(createCallbackTask(&didConsumeBufferedAmountCallback, this, consumed));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshake()
{
- if (m_client)
- m_client->didStartClosingHandshake();
+ m_pendingTasks.append(createCallbackTask(&didStartClosingHandshakeCallback, this));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didClose(WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
{
- if (m_client)
- m_client->didClose(closingHandshakeCompletion, code, reason);
+ m_pendingTasks.append(createCallbackTask(&didCloseCallback, this, closingHandshakeCompletion, code, reason));
+ if (!m_suspended)
+ processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessageError()
{
- if (m_client)
- m_client->didReceiveMessageError();
+ m_pendingTasks.append(createCallbackTask(&didReceiveMessageErrorCallback, this));
+ if (!m_suspended)
+ processPendingTasks();
}
+void ThreadableWebSocketChannelClientWrapper::suspend()
+{
+ m_suspended = true;
+}
+
+void ThreadableWebSocketChannelClientWrapper::resume()
+{
+ m_suspended = false;
+ processPendingTasks();
+}
+
+void ThreadableWebSocketChannelClientWrapper::processPendingTasks()
+{
+ if (m_suspended)
+ return;
+ Vector<OwnPtr<ExecutionContextTask> > tasks;
+ tasks.swap(m_pendingTasks);
+ for (Vector<OwnPtr<ExecutionContextTask> >::const_iterator iter = tasks.begin(); iter != tasks.end(); ++iter)
+ (*iter)->performTask(0);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didConnectCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper, const String& subprotocol, const String& extensions)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didConnect(subprotocol, extensions);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveMessageCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper, const String& message)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveMessage(message);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryDataCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper, PassOwnPtr<Vector<char> > binaryData)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveBinaryData(binaryData);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didConsumeBufferedAmountCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper, unsigned long consumed)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didConsumeBufferedAmount(consumed);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshakeCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didStartClosingHandshake();
+}
+
+void ThreadableWebSocketChannelClientWrapper::didCloseCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didClose(closingHandshakeCompletion, code, reason);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveMessageErrorCallback(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveMessageError();
+}
+
} // namespace WebCore

Powered by Google App Engine
This is Rietveld 408576698