| 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
|
|
|