diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp')
-rw-r--r-- | Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp | 153 |
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 |