summaryrefslogtreecommitdiff
path: root/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp')
-rw-r--r--Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp153
1 files changed, 68 insertions, 85 deletions
diff --git a/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp b/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
index 0ab3c5eb1..d19f6cc9e 100644
--- a/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
+++ b/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
@@ -32,19 +32,17 @@
#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)
+ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext& context, WebSocketChannelClient& client)
: m_context(context)
- , m_client(client)
- , m_peer(0)
+ , m_client(&client)
+ , m_peer(nullptr)
, m_failedWebSocketChannelCreation(false)
, m_syncMethodDone(true)
, m_sendRequestResult(ThreadableWebSocketChannel::SendFail)
@@ -53,9 +51,9 @@ ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper
{
}
-PassRefPtr<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext* context, WebSocketChannelClient* client)
+Ref<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext& context, WebSocketChannelClient& client)
{
- return adoptRef(new ThreadableWebSocketChannelClientWrapper(context, client));
+ return adoptRef(*new ThreadableWebSocketChannelClientWrapper(context, client));
}
void ThreadableWebSocketChannelClientWrapper::clearSyncMethodDone()
@@ -86,7 +84,7 @@ void ThreadableWebSocketChannelClientWrapper::didCreateWebSocketChannel(WorkerTh
void ThreadableWebSocketChannelClientWrapper::clearPeer()
{
- m_peer = 0;
+ m_peer = nullptr;
}
bool ThreadableWebSocketChannelClientWrapper::failedWebSocketChannelCreation() const
@@ -110,8 +108,7 @@ void ThreadableWebSocketChannelClientWrapper::setSubprotocol(const String& subpr
{
unsigned length = subprotocol.length();
m_subprotocol.resize(length);
- if (length)
- memcpy(m_subprotocol.data(), subprotocol.deprecatedCharacters(), sizeof(UChar) * length);
+ StringView(subprotocol).getCharactersWithUpconvert(m_subprotocol.data());
}
String ThreadableWebSocketChannelClientWrapper::extensions() const
@@ -125,8 +122,7 @@ void ThreadableWebSocketChannelClientWrapper::setExtensions(const String& extens
{
unsigned length = extensions.length();
m_extensions.resize(length);
- if (length)
- memcpy(m_extensions.data(), extensions.deprecatedCharacters(), sizeof(UChar) * length);
+ StringView(extensions).getCharactersWithUpconvert(m_extensions.data());
}
ThreadableWebSocketChannel::SendResult ThreadableWebSocketChannelClientWrapper::sendRequestResult() const
@@ -140,12 +136,12 @@ void ThreadableWebSocketChannelClientWrapper::setSendRequestResult(ThreadableWeb
m_syncMethodDone = true;
}
-unsigned long ThreadableWebSocketChannelClientWrapper::bufferedAmount() const
+unsigned ThreadableWebSocketChannelClientWrapper::bufferedAmount() const
{
return m_bufferedAmount;
}
-void ThreadableWebSocketChannelClientWrapper::setBufferedAmount(unsigned long bufferedAmount)
+void ThreadableWebSocketChannelClientWrapper::setBufferedAmount(unsigned bufferedAmount)
{
m_bufferedAmount = bufferedAmount;
m_syncMethodDone = true;
@@ -153,54 +149,93 @@ void ThreadableWebSocketChannelClientWrapper::setBufferedAmount(unsigned long bu
void ThreadableWebSocketChannelClientWrapper::clearClient()
{
- m_client = 0;
+ m_client = nullptr;
}
void ThreadableWebSocketChannelClientWrapper::didConnect()
{
- m_pendingTasks.append(createCallbackTask(&didConnectCallback, this));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this)] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didConnect();
+ }));
+
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessage(const String& message)
{
- m_pendingTasks.append(createCallbackTask(&didReceiveMessageCallback, this, message));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this), message = message.isolatedCopy()] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didReceiveMessage(message);
+ }));
+
if (!m_suspended)
processPendingTasks();
}
-void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(PassOwnPtr<Vector<char>> binaryData)
+void ThreadableWebSocketChannelClientWrapper::didReceiveBinaryData(Vector<uint8_t>&& binaryData)
{
- m_pendingTasks.append(createCallbackTask(&didReceiveBinaryDataCallback, this, binaryData));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this), binaryData = WTFMove(binaryData)] (ScriptExecutionContext&) mutable {
+ if (m_client)
+ m_client->didReceiveBinaryData(WTFMove(binaryData));
+ }));
+
if (!m_suspended)
processPendingTasks();
}
-void ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmount(unsigned long bufferedAmount)
+void ThreadableWebSocketChannelClientWrapper::didUpdateBufferedAmount(unsigned bufferedAmount)
{
- m_pendingTasks.append(createCallbackTask(&didUpdateBufferedAmountCallback, this, bufferedAmount));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this), bufferedAmount] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didUpdateBufferedAmount(bufferedAmount);
+ }));
+
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didStartClosingHandshake()
{
- m_pendingTasks.append(createCallbackTask(&didStartClosingHandshakeCallback, this));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this)] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didStartClosingHandshake();
+ }));
+
if (!m_suspended)
processPendingTasks();
}
-void ThreadableWebSocketChannelClientWrapper::didClose(unsigned long unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
+void ThreadableWebSocketChannelClientWrapper::didClose(unsigned unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsigned short code, const String& reason)
{
- m_pendingTasks.append(createCallbackTask(&didCloseCallback, this, unhandledBufferedAmount, closingHandshakeCompletion, code, reason));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this), unhandledBufferedAmount, closingHandshakeCompletion, code, reason = reason.isolatedCopy()] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didClose(unhandledBufferedAmount, closingHandshakeCompletion, code, reason);
+ }));
+
if (!m_suspended)
processPendingTasks();
}
void ThreadableWebSocketChannelClientWrapper::didReceiveMessageError()
{
- m_pendingTasks.append(createCallbackTask(&didReceiveMessageErrorCallback, this));
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this)] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didReceiveMessageError();
+ }));
+
+ if (!m_suspended)
+ processPendingTasks();
+}
+
+void ThreadableWebSocketChannelClientWrapper::didUpgradeURL()
+{
+ m_pendingTasks.append(std::make_unique<ScriptExecutionContext::Task>([this, protectedThis = makeRef(*this)] (ScriptExecutionContext&) {
+ if (m_client)
+ m_client->didUpgradeURL();
+ }));
+
if (!m_suspended)
processPendingTasks();
}
@@ -216,12 +251,6 @@ 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)
@@ -229,62 +258,16 @@ 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.
- m_context->postTask(createCallbackTask(&ThreadableWebSocketChannelClientWrapper::processPendingTasksCallback, this));
+ m_context.postTask([this, protectedThis = makeRef(*this)] (ScriptExecutionContext& context) {
+ ASSERT_UNUSED(context, context.isWorkerGlobalScope());
+ processPendingTasks();
+ });
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);
-}
-
-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();
+ Vector<std::unique_ptr<ScriptExecutionContext::Task>> pendingTasks = WTFMove(m_pendingTasks);
+ for (auto& task : pendingTasks)
+ task->performTask(m_context);
}
} // namespace WebCore