diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp | |
parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
download | WebKitGtk-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.cpp | 150 |
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 |