OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
225 void WorkerThreadableWebSocketChannel::resume() | 225 void WorkerThreadableWebSocketChannel::resume() |
226 { | 226 { |
227 m_workerClientWrapper->resume(); | 227 m_workerClientWrapper->resume(); |
228 if (m_bridge) | 228 if (m_bridge) |
229 m_bridge->resume(); | 229 m_bridge->resume(); |
230 } | 230 } |
231 | 231 |
232 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) | 232 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) |
233 { | 233 { |
234 visitor->trace(m_workerGlobalScope); | 234 visitor->trace(m_workerGlobalScope); |
235 visitor->trace(m_workerClientWrapper); | |
235 WebSocketChannel::trace(visitor); | 236 WebSocketChannel::trace(visitor); |
236 } | 237 } |
237 | 238 |
238 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re ference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Work erLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper ) | 239 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re ference, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientW rapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper > syncHelper) |
239 : m_workerClientWrapper(clientWrapper) | 240 : m_workerClientWrapper(clientWrapper) |
240 , m_loaderProxy(loaderProxy) | 241 , m_loaderProxy(loaderProxy) |
241 , m_mainWebSocketChannel(nullptr) | 242 , m_mainWebSocketChannel(nullptr) |
242 , m_syncHelper(syncHelper) | 243 , m_syncHelper(syncHelper) |
243 , m_weakFactory(reference, this) | 244 , m_weakFactory(reference, this) |
244 { | 245 { |
245 ASSERT(isMainThread()); | 246 ASSERT(isMainThread()); |
246 ASSERT(m_workerClientWrapper.get()); | 247 ASSERT(m_workerClientWrapper.get()); |
247 | 248 |
248 Document* document = toDocument(context); | 249 Document* document = toDocument(context); |
249 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { | 250 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { |
250 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); | 251 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this, sourceURL, lineNumber); |
251 } else { | 252 } else { |
252 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); | 253 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th is, sourceURL, lineNumber); |
253 } | 254 } |
254 | 255 |
255 m_syncHelper->signalWorkerThread(); | 256 m_syncHelper->signalWorkerThread(); |
256 } | 257 } |
257 | 258 |
258 WorkerThreadableWebSocketChannel::Peer::~Peer() | 259 WorkerThreadableWebSocketChannel::Peer::~Peer() |
259 { | 260 { |
260 ASSERT(isMainThread()); | 261 ASSERT(isMainThread()); |
261 if (m_mainWebSocketChannel) | 262 if (m_mainWebSocketChannel) |
262 m_mainWebSocketChannel->disconnect(); | 263 m_mainWebSocketChannel->disconnect(); |
263 } | 264 } |
264 | 265 |
265 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P assRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, const String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<ThreadableWeb SocketChannelSyncHelper> syncHelper) | 266 void WorkerThreadableWebSocketChannel::Peer::initialize(ExecutionContext* contex t, PassRefPtr<WeakReference<Peer> > reference, WorkerLoaderProxy* loaderProxy, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, co nst String& sourceURLAtConnection, unsigned lineNumberAtConnection, PassOwnPtr<T hreadableWebSocketChannelSyncHelper> syncHelper) |
266 { | 267 { |
267 // The caller must call destroy() to free the peer. | 268 // The caller must call destroy() to free the peer. |
268 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); | 269 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect ion, lineNumberAtConnection, syncHelper); |
269 } | 270 } |
270 | 271 |
271 void WorkerThreadableWebSocketChannel::Peer::destroy() | 272 void WorkerThreadableWebSocketChannel::Peer::destroy() |
272 { | 273 { |
273 ASSERT(isMainThread()); | 274 ASSERT(isMainThread()); |
274 delete this; | 275 delete this; |
275 } | 276 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
369 } | 370 } |
370 | 371 |
371 void WorkerThreadableWebSocketChannel::Peer::resume() | 372 void WorkerThreadableWebSocketChannel::Peer::resume() |
372 { | 373 { |
373 ASSERT(isMainThread()); | 374 ASSERT(isMainThread()); |
374 if (!m_mainWebSocketChannel) | 375 if (!m_mainWebSocketChannel) |
375 return; | 376 return; |
376 m_mainWebSocketChannel->resume(); | 377 m_mainWebSocketChannel->resume(); |
377 } | 378 } |
378 | 379 |
379 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro tocol, const String& extensions) | 380 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St ring& subprotocol, const String& extensions) |
380 { | 381 { |
381 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 382 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
382 workerClientWrapper->setSubprotocol(subprotocol); | 383 workerClientWrapper->setSubprotocol(subprotocol); |
383 workerClientWrapper->setExtensions(extensions); | 384 workerClientWrapper->setExtensions(extensions); |
384 workerClientWrapper->didConnect(); | 385 workerClientWrapper->didConnect(); |
385 } | 386 } |
386 | 387 |
387 void WorkerThreadableWebSocketChannel::Peer::didConnect() | 388 void WorkerThreadableWebSocketChannel::Peer::didConnect() |
388 { | 389 { |
389 ASSERT(isMainThread()); | 390 ASSERT(isMainThread()); |
390 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m ainWebSocketChannel->extensions())); | 391 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol( ), m_mainWebSocketChannel->extensions())); |
haraken
2014/05/07 07:45:16
If we don't want to add .get() here, we need to de
tyoshino (SeeGerritForStatus)
2014/05/07 08:32:52
Is the reason why this works that the task would c
zerny-chromium
2014/05/07 09:50:00
Do you need the .get() calls (here and below) afte
haraken
2014/05/07 11:18:33
I couldn't make it workable (See my comment in Cro
haraken
2014/05/07 11:18:33
This works because the Peer object in the main thr
tyoshino (SeeGerritForStatus)
2014/05/08 06:29:55
FTR: As discussed offline, the PassRefPtr in the t
| |
391 } | 392 } |
392 | 393 |
393 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String& message) | 394 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c onst String& message) |
394 { | 395 { |
395 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 396 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
396 workerClientWrapper->didReceiveMessage(message); | 397 workerClientWrapper->didReceiveMessage(message); |
397 } | 398 } |
398 | 399 |
399 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) | 400 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes sage) |
400 { | 401 { |
401 ASSERT(isMainThread()); | 402 ASSERT(isMainThread()); |
402 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper, message)); | 403 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessage, m_workerClientWrapper.get(), message)); |
403 } | 404 } |
404 | 405 |
405 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr <Vector<char> > binaryData) | 406 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper , PassOwnPtr<Vector<char> > binaryData) |
406 { | 407 { |
407 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 408 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
408 workerClientWrapper->didReceiveBinaryData(binaryData); | 409 workerClientWrapper->didReceiveBinaryData(binaryData); |
409 } | 410 } |
410 | 411 |
411 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) | 412 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec tor<char> > binaryData) |
412 { | 413 { |
413 ASSERT(isMainThread()); | 414 ASSERT(isMainThread()); |
414 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); | 415 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
415 } | 416 } |
416 | 417 |
417 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne d long bufferedAmount) | 418 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap per, unsigned long bufferedAmount) |
418 { | 419 { |
419 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 420 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
420 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); | 421 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
421 } | 422 } |
422 | 423 |
423 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) | 424 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo ng bufferedAmount) |
424 { | 425 { |
425 ASSERT(isMainThread()); | 426 ASSERT(isMainThread()); |
426 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); | 427 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); |
427 } | 428 } |
428 | 429 |
429 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 430 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra pper) |
430 { | 431 { |
431 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 432 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
432 workerClientWrapper->didStartClosingHandshake(); | 433 workerClientWrapper->didStartClosingHandshake(); |
433 } | 434 } |
434 | 435 |
435 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 436 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
436 { | 437 { |
437 ASSERT(isMainThread()); | 438 ASSERT(isMainThread()); |
438 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper)); | 439 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidStartClosingHandshake, m_workerClientWrapper.get())); |
439 } | 440 } |
440 | 441 |
441 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin gHandshakeCompletion, unsigned short code, const String& reason) | 442 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS tatus closingHandshakeCompletion, unsigned short code, const String& reason) |
442 { | 443 { |
443 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 444 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
444 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); | 445 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl etion, code, reason); |
445 } | 446 } |
446 | 447 |
447 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) | 448 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign ed short code, const String& reason) |
448 { | 449 { |
449 ASSERT(isMainThread()); | 450 ASSERT(isMainThread()); |
450 m_mainWebSocketChannel = nullptr; | 451 m_mainWebSocketChannel = nullptr; |
451 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom pletion, code, reason)); | 452 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh akeCompletion, code, reason)); |
452 } | 453 } |
453 | 454 |
454 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) | 455 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp er) |
455 { | 456 { |
456 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 457 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
457 workerClientWrapper->didReceiveMessageError(); | 458 workerClientWrapper->didReceiveMessageError(); |
458 } | 459 } |
459 | 460 |
460 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 461 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
461 { | 462 { |
462 ASSERT(isMainThread()); | 463 ASSERT(isMainThread()); |
463 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper)); | 464 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc opeDidReceiveMessageError, m_workerClientWrapper.get())); |
464 } | 465 } |
465 | 466 |
466 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC hannelClientWrapper> workerClientWrapper, PassRefPtrWillBeRawPtr<WorkerGlobalSco pe> workerGlobalScope) | 467 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab leWebSocketChannelClientWrapper> workerClientWrapper, PassRefPtrWillBeRawPtr<Wor kerGlobalScope> workerGlobalScope) |
467 : m_workerClientWrapper(workerClientWrapper) | 468 : m_workerClientWrapper(workerClientWrapper) |
468 , m_workerGlobalScope(workerGlobalScope) | 469 , m_workerGlobalScope(workerGlobalScope) |
469 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) | 470 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
470 , m_syncHelper(0) | 471 , m_syncHelper(0) |
471 { | 472 { |
472 ASSERT(m_workerClientWrapper.get()); | 473 ASSERT(m_workerClientWrapper.get()); |
473 } | 474 } |
474 | 475 |
475 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 476 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
476 { | 477 { |
477 disconnect(); | 478 disconnect(); |
478 } | 479 } |
479 | 480 |
480 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) | 481 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR L, unsigned lineNumber) |
481 { | 482 { |
482 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); | 483 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound( ); |
483 m_peer = WeakPtr<Peer>(reference); | 484 m_peer = WeakPtr<Peer>(reference); |
484 | 485 |
485 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); | 486 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv ent())); |
486 // This pointer is guaranteed to be valid until we call terminatePeer. | 487 // This pointer is guaranteed to be valid until we call terminatePeer. |
487 m_syncHelper = syncHelper.get(); | 488 m_syncHelper = syncHelper.get(); |
488 | 489 |
489 RefPtr<Bridge> protect(this); | 490 RefPtr<Bridge> protect(this); |
490 m_loaderProxy.postTaskToLoader(createCallbackTask(&Peer::initialize, referen ce.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sou rceURL, lineNumber, syncHelper.release())); | 491 m_loaderProxy.postTaskToLoader(createCallbackTask(&Peer::initialize, referen ce.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get( ), sourceURL, lineNumber, syncHelper.release())); |
491 if (!waitForMethodCompletion()) { | 492 if (!waitForMethodCompletion()) { |
492 // The worker thread has been signalled to shutdown before method comple tion. | 493 // The worker thread has been signalled to shutdown before method comple tion. |
493 terminatePeer(); | 494 terminatePeer(); |
494 } | 495 } |
495 } | 496 } |
496 | 497 |
497 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) | 498 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St ring& protocol) |
498 { | 499 { |
499 if (!m_workerGlobalScope) | 500 if (!m_workerGlobalScope) |
500 return false; | 501 return false; |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
603 } | 604 } |
604 | 605 |
605 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() | 606 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() |
606 { | 607 { |
607 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); | 608 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy, m_peer))); |
608 m_workerGlobalScope = nullptr; | 609 m_workerGlobalScope = nullptr; |
609 m_syncHelper = 0; | 610 m_syncHelper = 0; |
610 } | 611 } |
611 | 612 |
612 } // namespace WebCore | 613 } // namespace WebCore |
OLD | NEW |