void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext& context, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSocketChannelClientWrapper> prpClientWrapper, const String& taskMode) { ASSERT(isMainThread()); ASSERT_UNUSED(context, context.isDocument()); RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWrapper; Peer* peerPtr = Peer::create(clientWrapper, *loaderProxy, &context, taskMode); bool sent = loaderProxy->postTaskForModeToWorkerGlobalScope({ ScriptExecutionContext::Task::CleanupTask, [clientWrapper, loaderProxy, peerPtr] (ScriptExecutionContext& context) { ASSERT_UNUSED(context, context.isWorkerGlobalScope()); if (clientWrapper->failedWebSocketChannelCreation()) { // If Bridge::initialize() quitted earlier, we need to kick mainThreadDestroy() to delete the peer. loaderProxy->postTaskToLoader([peerPtr] (ScriptExecutionContext& context) { ASSERT(isMainThread()); ASSERT_UNUSED(context, context.isDocument()); delete peerPtr; }); } else clientWrapper->didCreateWebSocketChannel(peerPtr); } }, taskMode); if (!sent) { clientWrapper->clearPeer(); delete peerPtr; } }
void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext& context, WorkerLoaderProxy& loaderProxy, Ref<ThreadableWebSocketChannelClientWrapper>&& clientWrapper, const String& taskMode) { ASSERT(isMainThread()); ASSERT(context.isDocument()); bool sent = loaderProxy.postTaskForModeToWorkerGlobalScope({ ScriptExecutionContext::Task::CleanupTask, [clientWrapper = clientWrapper.copyRef(), &loaderProxy, peer = std::make_unique<Peer>(clientWrapper.copyRef(), loaderProxy, context, taskMode)](ScriptExecutionContext& context) mutable { ASSERT_UNUSED(context, context.isWorkerGlobalScope()); if (clientWrapper->failedWebSocketChannelCreation()) { // If Bridge::initialize() quitted earlier, we need to kick mainThreadDestroy() to delete the peer. loaderProxy.postTaskToLoader([peer = WTFMove(peer)](ScriptExecutionContext& context) { ASSERT(isMainThread()); ASSERT_UNUSED(context, context.isDocument()); }); } else clientWrapper->didCreateWebSocketChannel(peer.release()); } }, taskMode); if (!sent) clientWrapper->clearPeer(); }
void ThreadableWebSocketChannelClientWrapper::processPendingTasksCallback(ScriptExecutionContext& context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> wrapper) { ASSERT_UNUSED(context, context.isWorkerGlobalScope()); wrapper->processPendingTasks(); }