Changeset 201837 in webkit
- Timestamp:
- Jun 8, 2016, 3:27:46 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 10 edited
-
ChangeLog (modified) (1 diff)
-
Modules/websockets/ThreadableWebSocketChannel.cpp (modified) (2 diffs)
-
Modules/websockets/ThreadableWebSocketChannel.h (modified) (4 diffs)
-
Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp (modified) (5 diffs)
-
Modules/websockets/ThreadableWebSocketChannelClientWrapper.h (modified) (4 diffs)
-
Modules/websockets/WebSocket.cpp (modified) (1 diff)
-
Modules/websockets/WebSocketChannel.cpp (modified) (2 diffs)
-
Modules/websockets/WebSocketChannel.h (modified) (2 diffs)
-
Modules/websockets/WorkerThreadableWebSocketChannel.cpp (modified) (32 diffs)
-
Modules/websockets/WorkerThreadableWebSocketChannel.h (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r201835 r201837 1 2016-06-08 Alex Christensen <achristensen@webkit.org> 2 3 Modernize WebSocket code 4 https://bugs.webkit.org/show_bug.cgi?id=158539 5 6 Reviewed by Brady Eidson. 7 8 No new tests, no change in behavior. 9 10 * Modules/websockets/ThreadableWebSocketChannel.cpp: 11 (WebCore::ThreadableWebSocketChannel::create): 12 * Modules/websockets/ThreadableWebSocketChannel.h: 13 (WebCore::ThreadableWebSocketChannel::ThreadableWebSocketChannel): 14 * Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp: 15 (WebCore::ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper): 16 (WebCore::ThreadableWebSocketChannelClientWrapper::create): 17 (WebCore::ThreadableWebSocketChannelClientWrapper::processPendingTasks): 18 * Modules/websockets/ThreadableWebSocketChannelClientWrapper.h: 19 * Modules/websockets/WebSocket.cpp: 20 (WebCore::WebSocket::connect): 21 * Modules/websockets/WebSocketChannel.cpp: 22 (WebCore::WebSocketChannel::WebSocketChannel): 23 * Modules/websockets/WebSocketChannel.h: 24 (WebCore::WebSocketChannel::create): 25 * Modules/websockets/WorkerThreadableWebSocketChannel.cpp: 26 (WebCore::WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel): 27 (WebCore::WorkerThreadableWebSocketChannel::subprotocol): 28 (WebCore::WorkerThreadableWebSocketChannel::extensions): 29 (WebCore::WorkerThreadableWebSocketChannel::resume): 30 (WebCore::WorkerThreadableWebSocketChannel::Peer::Peer): 31 (WebCore::WorkerThreadableWebSocketChannel::Peer::send): 32 (WebCore::WorkerThreadableWebSocketChannel::Peer::bufferedAmount): 33 (WebCore::WorkerThreadableWebSocketChannel::Peer::didConnect): 34 (WebCore::WorkerThreadableWebSocketChannel::Peer::didReceiveMessage): 35 (WebCore::WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData): 36 (WebCore::WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount): 37 (WebCore::WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake): 38 (WebCore::WorkerThreadableWebSocketChannel::Peer::didClose): 39 (WebCore::WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError): 40 (WebCore::WorkerThreadableWebSocketChannel::Bridge::Bridge): 41 (WebCore::WorkerThreadableWebSocketChannel::Bridge::~Bridge): 42 (WebCore::WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize): 43 (WebCore::WorkerThreadableWebSocketChannel::Bridge::initialize): 44 (WebCore::WorkerThreadableWebSocketChannel::Bridge::connect): 45 (WebCore::WorkerThreadableWebSocketChannel::Bridge::send): 46 (WebCore::WorkerThreadableWebSocketChannel::Bridge::bufferedAmount): 47 (WebCore::WorkerThreadableWebSocketChannel::Bridge::close): 48 (WebCore::WorkerThreadableWebSocketChannel::Bridge::setMethodNotCompleted): 49 (WebCore::WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion): 50 * Modules/websockets/WorkerThreadableWebSocketChannel.h: 51 (WebCore::WorkerThreadableWebSocketChannel::create): 52 (WebCore::WorkerThreadableWebSocketChannel::Bridge::create): 53 1 54 2016-06-08 Chris Dumez <cdumez@apple.com> 2 55 -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.cpp
r174225 r201837 44 44 #include "WorkerThread.h" 45 45 #include "WorkerThreadableWebSocketChannel.h" 46 #include <wtf/PassRefPtr.h>47 46 #include <wtf/text/StringBuilder.h> 48 47 … … 51 50 static const char webSocketChannelMode[] = "webSocketChannelMode"; 52 51 53 PassRefPtr<ThreadableWebSocketChannel> ThreadableWebSocketChannel::create(ScriptExecutionContext* context, WebSocketChannelClient*client)52 Ref<ThreadableWebSocketChannel> ThreadableWebSocketChannel::create(ScriptExecutionContext& context, WebSocketChannelClient& client) 54 53 { 55 ASSERT(context); 56 ASSERT(client); 57 58 if (is<WorkerGlobalScope>(*context)) { 59 WorkerGlobalScope& workerGlobalScope = downcast<WorkerGlobalScope>(*context); 54 if (is<WorkerGlobalScope>(context)) { 55 WorkerGlobalScope& workerGlobalScope = downcast<WorkerGlobalScope>(context); 60 56 WorkerRunLoop& runLoop = workerGlobalScope.thread().runLoop(); 61 57 StringBuilder mode; 62 58 mode.appendLiteral(webSocketChannelMode); 63 59 mode.appendNumber(runLoop.createUniqueId()); 64 return WorkerThreadableWebSocketChannel::create( &workerGlobalScope, client, mode.toString());60 return WorkerThreadableWebSocketChannel::create(workerGlobalScope, client, mode.toString()); 65 61 } 66 62 -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannel.h
r168183 r201837 29 29 */ 30 30 31 #ifndef ThreadableWebSocketChannel_h 32 #define ThreadableWebSocketChannel_h 31 #pragma once 33 32 34 33 #if ENABLE(WEB_SOCKETS) … … 36 35 #include <wtf/Forward.h> 37 36 #include <wtf/Noncopyable.h> 38 #include <wtf/PassRefPtr.h>39 37 40 38 namespace JSC { … … 54 52 public: 55 53 ThreadableWebSocketChannel() { } 56 static PassRefPtr<ThreadableWebSocketChannel> create(ScriptExecutionContext*, WebSocketChannelClient*);54 static Ref<ThreadableWebSocketChannel> create(ScriptExecutionContext&, WebSocketChannelClient&); 57 55 58 56 enum SendResult { … … 89 87 90 88 #endif // ENABLE(WEB_SOCKETS) 91 92 #endif // ThreadableWebSocketChannel_h -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.cpp
r201602 r201837 35 35 #include "ScriptExecutionContext.h" 36 36 #include "WebSocketChannelClient.h" 37 #include <wtf/PassRefPtr.h>38 37 #include <wtf/RefPtr.h> 39 38 #include <wtf/text/StringView.h> … … 41 40 namespace WebCore { 42 41 43 ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext * context, WebSocketChannelClient*client)42 ThreadableWebSocketChannelClientWrapper::ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext& context, WebSocketChannelClient& client) 44 43 : m_context(context) 45 , m_client( client)44 , m_client(&client) 46 45 , m_peer(nullptr) 47 46 , m_failedWebSocketChannelCreation(false) … … 53 52 } 54 53 55 Ref<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext * context, WebSocketChannelClient*client)54 Ref<ThreadableWebSocketChannelClientWrapper> ThreadableWebSocketChannelClientWrapper::create(ScriptExecutionContext& context, WebSocketChannelClient& client) 56 55 { 57 56 return adoptRef(*new ThreadableWebSocketChannelClientWrapper(context, client)); … … 249 248 // When a synchronous operation is in progress (i.e. the execution stack contains 250 249 // WorkerThreadableWebSocketChannel::waitForMethodCompletion()), we cannot invoke callbacks in this run loop. 251 m_context ->postTask([this, protectedThis = Ref<ThreadableWebSocketChannelClientWrapper>(*this)] (ScriptExecutionContext& context) {250 m_context.postTask([this, protectedThis = Ref<ThreadableWebSocketChannelClientWrapper>(*this)] (ScriptExecutionContext& context) { 252 251 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 253 252 processPendingTasks(); … … 258 257 Vector<std::unique_ptr<ScriptExecutionContext::Task>> pendingTasks = WTFMove(m_pendingTasks); 259 258 for (auto& task : pendingTasks) 260 task->performTask( *m_context);259 task->performTask(m_context); 261 260 } 262 261 -
trunk/Source/WebCore/Modules/websockets/ThreadableWebSocketChannelClientWrapper.h
r198869 r201837 29 29 */ 30 30 31 #ifndef ThreadableWebSocketChannelClientWrapper_h 32 #define ThreadableWebSocketChannelClientWrapper_h 31 #pragma once 33 32 34 33 #if ENABLE(WEB_SOCKETS) … … 51 50 class ThreadableWebSocketChannelClientWrapper : public ThreadSafeRefCounted<ThreadableWebSocketChannelClientWrapper> { 52 51 public: 53 static Ref<ThreadableWebSocketChannelClientWrapper> create(ScriptExecutionContext *, WebSocketChannelClient*);52 static Ref<ThreadableWebSocketChannelClientWrapper> create(ScriptExecutionContext&, WebSocketChannelClient&); 54 53 55 54 void clearSyncMethodDone(); … … 90 89 91 90 private: 92 ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext *, WebSocketChannelClient*);91 ThreadableWebSocketChannelClientWrapper(ScriptExecutionContext&, WebSocketChannelClient&); 93 92 94 93 void processPendingTasks(); 95 94 96 ScriptExecutionContext *m_context;95 ScriptExecutionContext& m_context; 97 96 WebSocketChannelClient* m_client; 98 97 WorkerThreadableWebSocketChannel::Peer* m_peer; … … 111 110 112 111 #endif // ENABLE(WEB_SOCKETS) 113 114 #endif // ThreadableWebSocketChannelClientWrapper_h -
trunk/Source/WebCore/Modules/websockets/WebSocket.cpp
r201753 r201837 251 251 } 252 252 253 m_channel = ThreadableWebSocketChannel::create( scriptExecutionContext(),this);253 m_channel = ThreadableWebSocketChannel::create(*scriptExecutionContext(), *this); 254 254 255 255 // FIXME: There is a disagreement about restriction of subprotocols between WebSocket API and hybi-10 protocol -
trunk/Source/WebCore/Modules/websockets/WebSocketChannel.cpp
r200895 r201837 65 65 const double TCPMaximumSegmentLifetime = 2 * 60.0; 66 66 67 WebSocketChannel::WebSocketChannel(Document * document, WebSocketChannelClient*client)68 : m_document( document)69 , m_client( client)67 WebSocketChannel::WebSocketChannel(Document& document, WebSocketChannelClient& client) 68 : m_document(&document) 69 , m_client(&client) 70 70 , m_resumeTimer(*this, &WebSocketChannel::resumeTimerFired) 71 71 , m_suspended(false) … … 82 82 , m_blobLoaderStatus(BlobLoaderNotStarted) 83 83 { 84 ASSERT(m_document); 85 86 if (Page* page = m_document->page()) 84 if (Page* page = document.page()) 87 85 m_identifier = page->progress().createUniqueIdentifier(); 88 86 -
trunk/Source/WebCore/Modules/websockets/WebSocketChannel.h
r198869 r201837 60 60 WTF_MAKE_FAST_ALLOCATED; 61 61 public: 62 static Ref<WebSocketChannel> create(Document * document, WebSocketChannelClient*client) { return adoptRef(*new WebSocketChannel(document, client)); }62 static Ref<WebSocketChannel> create(Document& document, WebSocketChannelClient& client) { return adoptRef(*new WebSocketChannel(document, client)); } 63 63 virtual ~WebSocketChannel(); 64 64 … … 123 123 124 124 private: 125 WebSocketChannel(Document *, WebSocketChannelClient*);125 WebSocketChannel(Document&, WebSocketChannelClient&); 126 126 127 127 bool appendToBuffer(const char* data, size_t len); -
trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp
r201602 r201837 47 47 #include <runtime/ArrayBuffer.h> 48 48 #include <wtf/MainThread.h> 49 #include <wtf/PassRefPtr.h>50 49 #include <wtf/text/WTFString.h> 51 50 52 51 namespace WebCore { 53 52 54 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalScope * context, WebSocketChannelClient*client, const String& taskMode)53 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalScope& context, WebSocketChannelClient& client, const String& taskMode) 55 54 : m_workerGlobalScope(context) 56 55 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(context, client)) 57 , m_bridge(Bridge::create(m_workerClientWrapper , m_workerGlobalScope, taskMode))56 , m_bridge(Bridge::create(m_workerClientWrapper.copyRef(), m_workerGlobalScope.copyRef(), taskMode)) 58 57 { 59 58 m_bridge->initialize(); … … 74 73 String WorkerThreadableWebSocketChannel::subprotocol() 75 74 { 76 ASSERT(m_workerClientWrapper);77 75 return m_workerClientWrapper->subprotocol(); 78 76 } … … 80 78 String WorkerThreadableWebSocketChannel::extensions() 81 79 { 82 ASSERT(m_workerClientWrapper);83 80 return m_workerClientWrapper->extensions(); 84 81 } … … 144 141 } 145 142 146 WorkerThreadableWebSocketChannel::Peer::Peer(Ref Ptr<ThreadableWebSocketChannelClientWrapper>&& clientWrapper, WorkerLoaderProxy& loaderProxy, ScriptExecutionContext*context, const String& taskMode)143 WorkerThreadableWebSocketChannel::Peer::Peer(Ref<ThreadableWebSocketChannelClientWrapper>&& clientWrapper, WorkerLoaderProxy& loaderProxy, ScriptExecutionContext& context, const String& taskMode) 147 144 : m_workerClientWrapper(WTFMove(clientWrapper)) 148 145 , m_loaderProxy(loaderProxy) 149 , m_mainWebSocketChannel(WebSocketChannel::create(downcast<Document>(context), this))146 , m_mainWebSocketChannel(WebSocketChannel::create(downcast<Document>(context), *this)) 150 147 , m_taskMode(taskMode) 151 148 { … … 171 168 { 172 169 ASSERT(isMainThread()); 173 if (!m_mainWebSocketChannel || !m_workerClientWrapper)170 if (!m_mainWebSocketChannel) 174 171 return; 175 172 176 173 ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(message); 177 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 178 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), sendRequestResult] (ScriptExecutionContext&) { 174 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), sendRequestResult](ScriptExecutionContext&) mutable { 179 175 workerClientWrapper->setSendRequestResult(sendRequestResult); 180 176 }, m_taskMode); … … 184 180 { 185 181 ASSERT(isMainThread()); 186 if (!m_mainWebSocketChannel || !m_workerClientWrapper)182 if (!m_mainWebSocketChannel) 187 183 return; 188 184 189 185 ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData, 0, binaryData.byteLength()); 190 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 191 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), sendRequestResult] (ScriptExecutionContext&) { 186 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), sendRequestResult](ScriptExecutionContext&) mutable { 192 187 workerClientWrapper->setSendRequestResult(sendRequestResult); 193 188 }, m_taskMode); … … 197 192 { 198 193 ASSERT(isMainThread()); 199 if (!m_mainWebSocketChannel || !m_workerClientWrapper)194 if (!m_mainWebSocketChannel) 200 195 return; 201 196 202 197 ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData); 203 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 204 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), sendRequestResult] (ScriptExecutionContext&) { 198 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), sendRequestResult](ScriptExecutionContext&) mutable { 205 199 workerClientWrapper->setSendRequestResult(sendRequestResult); 206 200 }, m_taskMode); … … 210 204 { 211 205 ASSERT(isMainThread()); 212 if (!m_mainWebSocketChannel || !m_workerClientWrapper) 213 return; 214 215 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 206 if (!m_mainWebSocketChannel) 207 return; 208 216 209 unsigned long bufferedAmount = m_mainWebSocketChannel->bufferedAmount(); 217 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), bufferedAmount] (ScriptExecutionContext& context){210 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), bufferedAmount](ScriptExecutionContext& context) mutable { 218 211 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 219 212 workerClientWrapper->setBufferedAmount(bufferedAmount); … … 266 259 ASSERT(isMainThread()); 267 260 268 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper;269 261 String subprotocol = m_mainWebSocketChannel->subprotocol(); 270 262 String extensions = m_mainWebSocketChannel->extensions(); 271 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), subprotocol = subprotocol.isolatedCopy(), extensions = extensions.isolatedCopy()] (ScriptExecutionContext& context){263 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), subprotocol = subprotocol.isolatedCopy(), extensions = extensions.isolatedCopy()](ScriptExecutionContext& context) mutable { 272 264 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 273 265 workerClientWrapper->setSubprotocol(subprotocol); … … 281 273 ASSERT(isMainThread()); 282 274 283 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 284 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), message = message.isolatedCopy()] (ScriptExecutionContext& context) { 275 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), message = message.isolatedCopy()](ScriptExecutionContext& context) mutable { 285 276 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 286 277 workerClientWrapper->didReceiveMessage(message); … … 292 283 ASSERT(isMainThread()); 293 284 294 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 295 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), binaryData = WTFMove(binaryData)] (ScriptExecutionContext& context) mutable { 285 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), binaryData = WTFMove(binaryData)](ScriptExecutionContext& context) mutable { 296 286 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 297 287 workerClientWrapper->didReceiveBinaryData(WTFMove(binaryData)); … … 303 293 ASSERT(isMainThread()); 304 294 305 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 306 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), bufferedAmount] (ScriptExecutionContext& context) { 295 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), bufferedAmount](ScriptExecutionContext& context) mutable { 307 296 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 308 297 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); … … 314 303 ASSERT(isMainThread()); 315 304 316 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 317 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper)] (ScriptExecutionContext& context) { 305 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef()](ScriptExecutionContext& context) mutable { 318 306 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 319 307 workerClientWrapper->didStartClosingHandshake(); … … 326 314 m_mainWebSocketChannel = nullptr; 327 315 328 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 329 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper), unhandledBufferedAmount, closingHandshakeCompletion, code, reason = reason.isolatedCopy()] (ScriptExecutionContext& context) { 316 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef(), unhandledBufferedAmount, closingHandshakeCompletion, code, reason = reason.isolatedCopy()](ScriptExecutionContext& context) mutable { 330 317 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 331 318 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompletion, code, reason); … … 337 324 ASSERT(isMainThread()); 338 325 339 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 340 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = WTFMove(workerClientWrapper)] (ScriptExecutionContext& context) { 326 m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper = m_workerClientWrapper.copyRef()](ScriptExecutionContext& context) mutable { 341 327 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 342 328 workerClientWrapper->didReceiveMessageError(); … … 344 330 } 345 331 346 WorkerThreadableWebSocketChannel::Bridge::Bridge( PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassRefPtr<WorkerGlobalScope>workerGlobalScope, const String& taskMode)347 : m_workerClientWrapper( workerClientWrapper)348 , m_workerGlobalScope( workerGlobalScope)332 WorkerThreadableWebSocketChannel::Bridge::Bridge(Ref<ThreadableWebSocketChannelClientWrapper>&& workerClientWrapper, Ref<WorkerGlobalScope>&& workerGlobalScope, const String& taskMode) 333 : m_workerClientWrapper(WTFMove(workerClientWrapper)) 334 , m_workerGlobalScope(WTFMove(workerGlobalScope)) 349 335 , m_loaderProxy(m_workerGlobalScope->thread().workerLoaderProxy()) 350 336 , m_taskMode(taskMode) 351 337 , m_peer(nullptr) 352 338 { 353 ASSERT(m_workerClientWrapper.get());354 339 } 355 340 … … 359 344 } 360 345 361 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext& context, WorkerLoaderProxy* loaderProxy, RefPtr<ThreadableWebSocketChannelClientWrapper>&& passedClientWrapper, const String& taskMode) 362 { 363 ASSERT(isMainThread()); 364 ASSERT_UNUSED(context, context.isDocument()); 365 366 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = WTFMove(passedClientWrapper); 367 368 auto peer = std::make_unique<Peer>(clientWrapper.copyRef(), *loaderProxy, &context, taskMode); 369 bool sent = loaderProxy->postTaskForModeToWorkerGlobalScope({ 346 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecutionContext& context, WorkerLoaderProxy& loaderProxy, Ref<ThreadableWebSocketChannelClientWrapper>&& clientWrapper, const String& taskMode) 347 { 348 ASSERT(isMainThread()); 349 ASSERT(context.isDocument()); 350 351 bool sent = loaderProxy.postTaskForModeToWorkerGlobalScope({ 370 352 ScriptExecutionContext::Task::CleanupTask, 371 [clientWrapper , loaderProxy, peer = WTFMove(peer)](ScriptExecutionContext& context) mutable {353 [clientWrapper = clientWrapper.copyRef(), &loaderProxy, peer = std::make_unique<Peer>(clientWrapper.copyRef(), loaderProxy, context, taskMode)](ScriptExecutionContext& context) mutable { 372 354 ASSERT_UNUSED(context, context.isWorkerGlobalScope()); 373 355 if (clientWrapper->failedWebSocketChannelCreation()) { 374 356 // If Bridge::initialize() quitted earlier, we need to kick mainThreadDestroy() to delete the peer. 375 loaderProxy ->postTaskToLoader([peer = WTFMove(peer)](ScriptExecutionContext& context) {357 loaderProxy.postTaskToLoader([peer = WTFMove(peer)](ScriptExecutionContext& context) { 376 358 ASSERT(isMainThread()); 377 359 ASSERT_UNUSED(context, context.isDocument()); … … 392 374 Ref<Bridge> protectedThis(*this); 393 375 394 RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; 395 m_loaderProxy.postTaskToLoader([loaderProxy = &m_loaderProxy, workerClientWrapper = WTFMove(workerClientWrapper), taskMode = m_taskMode.isolatedCopy()] (ScriptExecutionContext& context) mutable { 376 m_loaderProxy.postTaskToLoader([&loaderProxy = m_loaderProxy, workerClientWrapper = m_workerClientWrapper.copyRef(), taskMode = m_taskMode.isolatedCopy()](ScriptExecutionContext& context) mutable { 396 377 mainThreadInitialize(context, loaderProxy, WTFMove(workerClientWrapper), taskMode); 397 378 }); … … 406 387 void WorkerThreadableWebSocketChannel::Bridge::connect(const URL& url, const String& protocol) 407 388 { 408 ASSERT(m_workerClientWrapper); 409 if (!m_peer) 410 return; 411 412 m_loaderProxy.postTaskToLoader([peer = m_peer, url = url.isolatedCopy(), protocol = protocol.isolatedCopy()] (ScriptExecutionContext& context) { 389 if (!m_peer) 390 return; 391 392 m_loaderProxy.postTaskToLoader([peer = m_peer, url = url.isolatedCopy(), protocol = protocol.isolatedCopy()](ScriptExecutionContext& context) { 413 393 ASSERT(isMainThread()); 414 394 ASSERT_UNUSED(context, context.isDocument()); … … 421 401 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const String& message) 422 402 { 423 if (!m_ workerClientWrapper || !m_peer)403 if (!m_peer) 424 404 return ThreadableWebSocketChannel::SendFail; 425 405 setMethodNotCompleted(); 426 406 427 m_loaderProxy.postTaskToLoader([peer = m_peer, message = message.isolatedCopy()] (ScriptExecutionContext& context) {407 m_loaderProxy.postTaskToLoader([peer = m_peer, message = message.isolatedCopy()](ScriptExecutionContext& context) { 428 408 ASSERT(isMainThread()); 429 409 ASSERT_UNUSED(context, context.isDocument()); … … 435 415 Ref<Bridge> protectedThis(*this); 436 416 waitForMethodCompletion(); 437 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); 438 if (!clientWrapper) 439 return ThreadableWebSocketChannel::SendFail; 440 return clientWrapper->sendRequestResult(); 417 return m_workerClientWrapper->sendRequestResult(); 441 418 } 442 419 443 420 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) 444 421 { 445 if (!m_ workerClientWrapper || !m_peer)422 if (!m_peer) 446 423 return ThreadableWebSocketChannel::SendFail; 447 424 … … 452 429 setMethodNotCompleted(); 453 430 454 m_loaderProxy.postTaskToLoader([peer = m_peer, data = WTFMove(data)] (ScriptExecutionContext& context) {431 m_loaderProxy.postTaskToLoader([peer = m_peer, data = WTFMove(data)](ScriptExecutionContext& context) { 455 432 ASSERT(isMainThread()); 456 433 ASSERT_UNUSED(context, context.isDocument()); … … 463 440 Ref<Bridge> protectedThis(*this); 464 441 waitForMethodCompletion(); 465 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); 466 if (!clientWrapper) 467 return ThreadableWebSocketChannel::SendFail; 468 return clientWrapper->sendRequestResult(); 442 return m_workerClientWrapper->sendRequestResult(); 469 443 } 470 444 471 445 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Blob& binaryData) 472 446 { 473 if (!m_ workerClientWrapper || !m_peer)447 if (!m_peer) 474 448 return ThreadableWebSocketChannel::SendFail; 475 449 setMethodNotCompleted(); 476 450 477 m_loaderProxy.postTaskToLoader([peer = m_peer, url = binaryData.url().isolatedCopy(), type = binaryData.type().isolatedCopy(), size = binaryData.size()] (ScriptExecutionContext& context) {451 m_loaderProxy.postTaskToLoader([peer = m_peer, url = binaryData.url().isolatedCopy(), type = binaryData.type().isolatedCopy(), size = binaryData.size()](ScriptExecutionContext& context) { 478 452 ASSERT(isMainThread()); 479 453 ASSERT_UNUSED(context, context.isDocument()); … … 485 459 Ref<Bridge> protectedThis(*this); 486 460 waitForMethodCompletion(); 487 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); 488 if (!clientWrapper) 489 return ThreadableWebSocketChannel::SendFail; 490 return clientWrapper->sendRequestResult(); 461 return m_workerClientWrapper->sendRequestResult(); 491 462 } 492 463 493 464 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() 494 465 { 495 if (!m_ workerClientWrapper || !m_peer)466 if (!m_peer) 496 467 return 0; 497 468 setMethodNotCompleted(); 498 469 499 m_loaderProxy.postTaskToLoader([peer = m_peer] (ScriptExecutionContext& context) {470 m_loaderProxy.postTaskToLoader([peer = m_peer](ScriptExecutionContext& context) { 500 471 ASSERT(isMainThread()); 501 472 ASSERT_UNUSED(context, context.isDocument()); … … 507 478 Ref<Bridge> protectedThis(*this); 508 479 waitForMethodCompletion(); 509 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); 510 if (clientWrapper) 511 return clientWrapper->bufferedAmount(); 512 return 0; 480 return m_workerClientWrapper->bufferedAmount(); 513 481 } 514 482 … … 518 486 return; 519 487 520 m_loaderProxy.postTaskToLoader([peer = m_peer, code, reason = reason.isolatedCopy()] (ScriptExecutionContext& context) {488 m_loaderProxy.postTaskToLoader([peer = m_peer, code, reason = reason.isolatedCopy()](ScriptExecutionContext& context) { 521 489 ASSERT(isMainThread()); 522 490 ASSERT_UNUSED(context, context.isDocument()); … … 532 500 return; 533 501 534 m_loaderProxy.postTaskToLoader([peer = m_peer, reason = reason.isolatedCopy()] (ScriptExecutionContext& context) {502 m_loaderProxy.postTaskToLoader([peer = m_peer, reason = reason.isolatedCopy()](ScriptExecutionContext& context) { 535 503 ASSERT(isMainThread()); 536 504 ASSERT_UNUSED(context, context.isDocument()); … … 545 513 clearClientWrapper(); 546 514 if (m_peer) { 547 m_loaderProxy.postTaskToLoader([peer = std::unique_ptr<Peer>(m_peer)] (ScriptExecutionContext& context) {515 m_loaderProxy.postTaskToLoader([peer = std::unique_ptr<Peer>(m_peer)](ScriptExecutionContext& context) { 548 516 ASSERT(isMainThread()); 549 517 ASSERT_UNUSED(context, context.isDocument()); … … 559 527 return; 560 528 561 m_loaderProxy.postTaskToLoader([peer = m_peer] (ScriptExecutionContext& context) {529 m_loaderProxy.postTaskToLoader([peer = m_peer](ScriptExecutionContext& context) { 562 530 ASSERT(isMainThread()); 563 531 ASSERT_UNUSED(context, context.isDocument()); … … 573 541 return; 574 542 575 m_loaderProxy.postTaskToLoader([peer = m_peer] (ScriptExecutionContext& context) {543 m_loaderProxy.postTaskToLoader([peer = m_peer](ScriptExecutionContext& context) { 576 544 ASSERT(isMainThread()); 577 545 ASSERT_UNUSED(context, context.isDocument()); … … 589 557 void WorkerThreadableWebSocketChannel::Bridge::setMethodNotCompleted() 590 558 { 591 ASSERT(m_workerClientWrapper);592 559 m_workerClientWrapper->clearSyncMethodDone(); 593 560 } … … 601 568 WorkerRunLoop& runLoop = m_workerGlobalScope->thread().runLoop(); 602 569 MessageQueueWaitResult result = MessageQueueMessageReceived; 603 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper. get();570 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.ptr(); 604 571 while (m_workerGlobalScope && clientWrapper && !clientWrapper->syncMethodDone() && result != MessageQueueTerminated) { 605 572 result = runLoop.runInMode(m_workerGlobalScope.get(), m_taskMode); // May cause this bridge to get disconnected, which makes m_workerGlobalScope become null. 606 clientWrapper = m_workerClientWrapper. get();573 clientWrapper = m_workerClientWrapper.ptr(); 607 574 } 608 575 } -
trunk/Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.h
r201543 r201837 29 29 */ 30 30 31 #ifndef WorkerThreadableWebSocketChannel_h 32 #define WorkerThreadableWebSocketChannel_h 31 #pragma once 33 32 34 33 #if ENABLE(WEB_SOCKETS) … … 38 37 #include "WorkerGlobalScope.h" 39 38 40 #include <wtf/PassRefPtr.h>41 39 #include <wtf/RefCounted.h> 42 40 #include <wtf/RefPtr.h> … … 56 54 WTF_MAKE_FAST_ALLOCATED; 57 55 public: 58 static Ref<ThreadableWebSocketChannel> create(WorkerGlobalScope * workerGlobalScope, WebSocketChannelClient*client, const String& taskMode)56 static Ref<ThreadableWebSocketChannel> create(WorkerGlobalScope& workerGlobalScope, WebSocketChannelClient& client, const String& taskMode) 59 57 { 60 58 return adoptRef(*new WorkerThreadableWebSocketChannel(workerGlobalScope, client, taskMode)); … … 81 79 WTF_MAKE_NONCOPYABLE(Peer); WTF_MAKE_FAST_ALLOCATED; 82 80 public: 83 Peer(Ref Ptr<ThreadableWebSocketChannelClientWrapper>&&, WorkerLoaderProxy&, ScriptExecutionContext*, const String& taskMode);81 Peer(Ref<ThreadableWebSocketChannelClientWrapper>&&, WorkerLoaderProxy&, ScriptExecutionContext&, const String& taskMode); 84 82 ~Peer(); 85 83 … … 105 103 106 104 private: 107 Ref Ptr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper;105 Ref<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; 108 106 WorkerLoaderProxy& m_loaderProxy; 109 107 RefPtr<ThreadableWebSocketChannel> m_mainWebSocketChannel; … … 122 120 class Bridge : public RefCounted<Bridge> { 123 121 public: 124 static Ref<Bridge> create( PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassRefPtr<WorkerGlobalScope>workerGlobalScope, const String& taskMode)122 static Ref<Bridge> create(Ref<ThreadableWebSocketChannelClientWrapper>&& workerClientWrapper, Ref<WorkerGlobalScope>&& workerGlobalScope, const String& taskMode) 125 123 { 126 return adoptRef(*new Bridge( workerClientWrapper, workerGlobalScope, taskMode));124 return adoptRef(*new Bridge(WTFMove(workerClientWrapper), WTFMove(workerGlobalScope), taskMode)); 127 125 } 128 126 ~Bridge(); … … 143 141 144 142 private: 145 Bridge( PassRefPtr<ThreadableWebSocketChannelClientWrapper>, PassRefPtr<WorkerGlobalScope>, const String& taskMode);143 Bridge(Ref<ThreadableWebSocketChannelClientWrapper>&&, Ref<WorkerGlobalScope>&&, const String& taskMode); 146 144 147 static void setWebSocketChannel(ScriptExecutionContext*, Bridge* thisPtr, Peer*, PassRefPtr<ThreadableWebSocketChannelClientWrapper>);145 static void setWebSocketChannel(ScriptExecutionContext*, Bridge* thisPtr, Peer*, Ref<ThreadableWebSocketChannelClientWrapper>&&); 148 146 149 147 // Executed on the main thread to create a Peer for this bridge. 150 static void mainThreadInitialize(ScriptExecutionContext&, WorkerLoaderProxy *, RefPtr<ThreadableWebSocketChannelClientWrapper>&&, const String& taskMode);148 static void mainThreadInitialize(ScriptExecutionContext&, WorkerLoaderProxy&, Ref<ThreadableWebSocketChannelClientWrapper>&&, const String& taskMode); 151 149 152 150 // Executed on the worker context's thread. … … 156 154 void waitForMethodCompletion(); 157 155 158 Ref Ptr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper;156 Ref<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; 159 157 RefPtr<WorkerGlobalScope> m_workerGlobalScope; 160 158 WorkerLoaderProxy& m_loaderProxy; … … 163 161 }; 164 162 165 WorkerThreadableWebSocketChannel(WorkerGlobalScope *, WebSocketChannelClient*, const String& taskMode);163 WorkerThreadableWebSocketChannel(WorkerGlobalScope&, WebSocketChannelClient&, const String& taskMode); 166 164 167 165 class WorkerGlobalScopeDidInitializeTask; 168 166 169 Ref Ptr<WorkerGlobalScope> m_workerGlobalScope;170 Ref Ptr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper;167 Ref<WorkerGlobalScope> m_workerGlobalScope; 168 Ref<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; 171 169 RefPtr<Bridge> m_bridge; 172 170 }; … … 175 173 176 174 #endif // ENABLE(WEB_SOCKETS) 177 178 #endif // WorkerThreadableWebSocketChannel_h
Note:
See TracChangeset
for help on using the changeset viewer.