summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-04-10 09:28:39 +0000
commit32761a6cee1d0dee366b885b7b9c777e67885688 (patch)
treed6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
parenta4e969f4965059196ca948db781e52f7cfebf19e (diff)
downloadWebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp')
-rw-r--r--Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp150
1 files changed, 78 insertions, 72 deletions
diff --git a/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp b/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
index 1224805c8..0ab3c5eb1 100644
--- a/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
+++ b/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
@@ -32,18 +32,19 @@
#if ENABLE(WEB_SOCKETS)
#include "ThreadableWebSocketChannelClientWrapper.h"
+#include "CrossThreadCopier.h"
+#include "CrossThreadTask.h"
#include "ScriptExecutionContext.h"
#include "WebSocketChannelClient.h"
#include <wtf/PassRefPtr.h>
#include <wtf/RefPtr.h>
-#include <wtf/text/StringView.h>
namespace WebCore {
ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext* context, WebSocketChannelClient* client)
: m_context(context)
, m_client(client)
- , m_peer(nullptr)
+ , m_peer(0)
, m_failedWebSocketChannelCreation(false)
, m_syncMethodDone(true)
, m_sendRequestResult(ThreadableWebSocketChannel::SendFail)
@@ -52,9 +53,9 @@ ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper
{
}
-Ref<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext* context, WebSocketChannelClient* client)
+PassRefPtr<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext* context, WebSocketChannelClient* client)
{
- return adoptRef(*new ThreadableWebSocketChannelClientWrapper(context, client));
+ return adoptRef(new ThreadableWebSocketChannelClientWrapper(context, client));
}
void ThreadableWebSocketChannelClientWrapper::clearSyncMethodDone()
@@ -85,7 +86,7 @@ void ThreadableWebSocketChannelClientWrapper::didCreateWebSocketChannel(WorkerTh
void ThreadableWebSocketChannelClientWrapper::clearPeer()
{
- m_peer = nullptr;
+ m_peer = 0;
}
bool ThreadableWebSocketChannelClientWrapper::failedWebSocketChannelCreation() const
@@ -109,7 +110,8 @@ void ThreadableWebSocketChannelClientWrapper::setSubprotocol(const String& subpr
{
unsigned length = subprotocol.length();
m_subprotocol.resize(length);
- StringView(subprotocol).getCharactersWithUpconvert(m_subprotocol.data());
+ if (length)
+ memcpy(m_subprotocol.data(), subprotocol.deprecatedCharacters(), sizeof(UChar) * length);
}
String ThreadableWebSocketChannelClientWrapper::extensions() const
@@ -123,7 +125,8 @@ void ThreadableWebSocketChannelClientWrapper::setExtensions(const String& extens
{
unsigned length = extensions.length();
m_extensions.resize(length);
- StringView(extensions).getCharactersWithUpconvert(m_extensions.data());
+ if (length)
+ memcpy(m_extensions.data(), extensions.deprecatedCharacters(), sizeof(UChar) * length);
}
ThreadableWebSocketChannel::SendResult ThreadableWebSocketChannelClientWrapper::sendRequestResult() const
@@ -150,101 +153,54 @@ void ThreadableWebSocketChannelClientWrapper::setBufferedAmount(unsigned long bu
void ThreadableWebSocketChannelClientWrapper::clearClient()
{
- m_client = nullptr;
+ m_client = 0;
}
void ThreadableWebSocketChannelClientWrapper::didConnect()
{
- ref();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didConnect();
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didConnectCallback, this));
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessage(const String& message)
{
- ref();
- String messageCopy = message.isolatedCopy();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, message] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didReceiveMessage(message);
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didReceiveMessageCallback, this, message));
if (!m_suspended)
processPendingTasks();
}
-void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(Vector<uint8_t>&& binaryData)
+void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(PassOwnPtr<Vector<char>> binaryData)
{
- ref();
- Vector<uint8_t>* capturedData = new Vector<uint8_t>(WTFMove(binaryData));
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, capturedData] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didReceiveBinaryData(WTFMove(*capturedData));
- delete capturedData;
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didReceiveBinaryDataCallback, this, binaryData));
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmount(unsigned long bufferedAmount)
{
- ref();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, bufferedAmount] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didUpdateBufferedAmount(bufferedAmount);
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didUpdateBufferedAmountCallback, this, bufferedAmount));
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshake()
{
- ref();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didStartClosingHandshake();
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didStartClosingHandshakeCallback, this));
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didClose(unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
{
- ref();
- String reasonCopy = reason.isolatedCopy();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>(
- [this, unhandledBufferedAmount, closingHandshakeCompletion, code, reasonCopy] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didClose(unhandledBufferedAmount, closingHandshakeCompletion, code, reasonCopy);
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didCloseCallback, this, unhandledBufferedAmount, closingHandshakeCompletion, code, reason));
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessageError()
{
- ref();
- m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this] (ScriptExecutionContext&) {
- if (m_client)
- m_client->didReceiveMessageError();
- deref();
- }));
-
+ m_pendingTasks.append(createCallbackTask(&didReceiveMessageErrorCallback, this));
if (!m_suspended)
processPendingTasks();
}
@@ -260,6 +216,12 @@ void ThreadableWebSocketChannelClientWrapper::resume()
processPendingTasks();
}
+void ThreadableWebSocketChannelClientWrapper::processPendingTasksCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, context->isWorkerGlobalScope());
+ wrapper->processPendingTasks();
+}
+
void ThreadableWebSocketChannelClientWrapper::processPendingTasks()
{
if (m_suspended)
@@ -267,18 +229,62 @@ void ThreadableWebSocketChannelClientWrapper::processPendingTasks()
if (!m_syncMethodDone) {
// When a synchronous operation is in progress (i.e. the execution stack contains
// WorkerThreadableWebSocketChannel::waitForMethodCompletion()), we cannot invoke callbacks in this run loop.
- ref();
- m_context->postTask([this] (ScriptExecutionContext& context) {
- ASSERT_UNUSED(context, context.isWorkerGlobalScope());
- processPendingTasks();
- deref();
- });
+ m_context->postTask(createCallbackTask(&ThreadableWebSocketChannelClientWrapper::processPendingTasksCallback, this));
return;
}
+ Vector<OwnPtr<ScriptExecutionContext::Task>> tasks;
+ tasks.swap(m_pendingTasks);
+ for (Vector<OwnPtr<ScriptExecutionContext::Task>>::const_iterator iter = tasks.begin(); iter != tasks.end(); ++iter)
+ (*iter)->performTask(0);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didConnectCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didConnect();
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveMessageCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper, const String& message)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveMessage(message);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryDataCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper, PassOwnPtr<Vector<char>> binaryData)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveBinaryData(binaryData);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmountCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper, unsigned long bufferedAmount)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didUpdateBufferedAmount(bufferedAmount);
+}
- Vector<std::unique_ptr<ScriptExecutionContext::Task>> pendingTasks = WTFMove(m_pendingTasks);
- for (auto& task : pendingTasks)
- task->performTask(*m_context);
+void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshakeCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didStartClosingHandshake();
+}
+
+void ThreadableWebSocketChannelClientWrapper::didCloseCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper, unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didClose(unhandledBufferedAmount, closingHandshakeCompletion, code, reason);
+}
+
+void ThreadableWebSocketChannelClientWrapper::didReceiveMessageErrorCallback(ScriptExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper)
+{
+ ASSERT_UNUSED(context, !context);
+ if (wrapper->m_client)
+ wrapper->m_client->didReceiveMessageError();
}
} // namespace WebCore