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 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 #include <wtf/MainThread.h> | 50 #include <wtf/MainThread.h> |
51 #include <wtf/PassRefPtr.h> | 51 #include <wtf/PassRefPtr.h> |
52 | 52 |
53 namespace WebCore { | 53 namespace WebCore { |
54 | 54 |
55 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerContext
* context, WebSocketChannelClient* client, const String& taskMode) | 55 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerContext
* context, WebSocketChannelClient* client, const String& taskMode) |
56 : m_workerContext(context) | 56 : m_workerContext(context) |
57 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(cont
ext, client)) | 57 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(cont
ext, client)) |
58 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerContext, taskMode)) | 58 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerContext, taskMode)) |
59 { | 59 { |
| 60 m_bridge->initialize(); |
60 } | 61 } |
61 | 62 |
62 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel() | 63 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel() |
63 { | 64 { |
64 if (m_bridge) | 65 if (m_bridge) |
65 m_bridge->disconnect(); | 66 m_bridge->disconnect(); |
66 } | 67 } |
67 | 68 |
68 bool WorkerThreadableWebSocketChannel::useHixie76Protocol() | 69 bool WorkerThreadableWebSocketChannel::useHixie76Protocol() |
69 { | 70 { |
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); | 338 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); |
338 } | 339 } |
339 | 340 |
340 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) | 341 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) |
341 { | 342 { |
342 ASSERT(isMainThread()); | 343 ASSERT(isMainThread()); |
343 m_mainWebSocketChannel = 0; | 344 m_mainWebSocketChannel = 0; |
344 m_loaderProxy.postTaskForModeToWorkerContext(createCallbackTask(&workerConte
xtDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeComp
letion, code, reason), m_taskMode); | 345 m_loaderProxy.postTaskForModeToWorkerContext(createCallbackTask(&workerConte
xtDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeComp
letion, code, reason), m_taskMode); |
345 } | 346 } |
346 | 347 |
347 void WorkerThreadableWebSocketChannel::Bridge::setWebSocketChannel(ScriptExecuti
onContext* context, Bridge* thisPtr, Peer* peer, PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, bool useHixie76Protocol) | |
348 { | |
349 ASSERT_UNUSED(context, context->isWorkerContext()); | |
350 thisPtr->m_peer = peer; | |
351 workerClientWrapper->setUseHixie76Protocol(useHixie76Protocol); | |
352 workerClientWrapper->setSyncMethodDone(); | |
353 } | |
354 | |
355 void WorkerThreadableWebSocketChannel::Bridge::mainThreadCreateWebSocketChannel(
ScriptExecutionContext* context, Bridge* thisPtr, PassRefPtr<ThreadableWebSocket
ChannelClientWrapper> prpClientWrapper, const String& taskMode) | |
356 { | |
357 ASSERT(isMainThread()); | |
358 ASSERT_UNUSED(context, context->isDocument()); | |
359 | |
360 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWra
pper; | |
361 | |
362 Peer* peer = Peer::create(clientWrapper, thisPtr->m_loaderProxy, context, ta
skMode); | |
363 thisPtr->m_loaderProxy.postTaskForModeToWorkerContext( | |
364 createCallbackTask(&Bridge::setWebSocketChannel, | |
365 AllowCrossThreadAccess(thisPtr), | |
366 AllowCrossThreadAccess(peer), clientWrapper, peer->us
eHixie76Protocol()), taskMode); | |
367 } | |
368 | |
369 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, PassRefPtr<WorkerContext> workerContex
t, const String& taskMode) | 348 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, PassRefPtr<WorkerContext> workerContex
t, const String& taskMode) |
370 : m_workerClientWrapper(workerClientWrapper) | 349 : m_workerClientWrapper(workerClientWrapper) |
371 , m_workerContext(workerContext) | 350 , m_workerContext(workerContext) |
372 , m_loaderProxy(m_workerContext->thread()->workerLoaderProxy()) | 351 , m_loaderProxy(m_workerContext->thread()->workerLoaderProxy()) |
373 , m_taskMode(taskMode) | 352 , m_taskMode(taskMode) |
374 , m_peer(0) | 353 , m_peer(0) |
375 { | 354 { |
376 ASSERT(m_workerClientWrapper.get()); | 355 ASSERT(m_workerClientWrapper.get()); |
377 setMethodNotCompleted(); | |
378 m_loaderProxy.postTaskToLoader( | |
379 createCallbackTask(&Bridge::mainThreadCreateWebSocketChannel, | |
380 AllowCrossThreadAccess(this), m_workerClientWrapper,
m_taskMode)); | |
381 waitForMethodCompletion(); | |
382 ASSERT(m_peer); | |
383 } | 356 } |
384 | 357 |
385 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 358 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
386 { | 359 { |
387 disconnect(); | 360 disconnect(); |
388 } | 361 } |
389 | 362 |
| 363 class WorkerContextDidInitializeTask : public ScriptExecutionContext::Task { |
| 364 public: |
| 365 static PassOwnPtr<ScriptExecutionContext::Task> create(WorkerThreadableWebSo
cketChannel::Peer* peer, |
| 366 PassRefPtr<Threadable
WebSocketChannelClientWrapper> workerClientWrapper, |
| 367 bool useHixie76Protoc
ol) |
| 368 { |
| 369 return adoptPtr(new WorkerContextDidInitializeTask(peer, workerClientWra
pper, useHixie76Protocol)); |
| 370 } |
| 371 |
| 372 virtual ~WorkerContextDidInitializeTask() { } |
| 373 virtual void performTask(ScriptExecutionContext* context) OVERRIDE |
| 374 { |
| 375 ASSERT_UNUSED(context, context->isWorkerContext()); |
| 376 m_workerClientWrapper->didCreateWebSocketChannel(m_peer, m_useHixie76Pro
tocol); |
| 377 } |
| 378 virtual bool isCleanupTask() const OVERRIDE { return true; } |
| 379 |
| 380 private: |
| 381 WorkerContextDidInitializeTask(WorkerThreadableWebSocketChannel::Peer* peer, |
| 382 PassRefPtr<ThreadableWebSocketChannelClientWr
apper> workerClientWrapper, |
| 383 bool useHixie76Protocol) |
| 384 : m_peer(peer) |
| 385 , m_workerClientWrapper(workerClientWrapper) |
| 386 , m_useHixie76Protocol(useHixie76Protocol) |
| 387 { |
| 388 } |
| 389 |
| 390 WorkerThreadableWebSocketChannel::Peer* m_peer; |
| 391 RefPtr<ThreadableWebSocketChannelClientWrapper> m_workerClientWrapper; |
| 392 bool m_useHixie76Protocol; |
| 393 }; |
| 394 |
| 395 void WorkerThreadableWebSocketChannel::Bridge::mainThreadInitialize(ScriptExecut
ionContext* context, WorkerLoaderProxy* loaderProxy, PassRefPtr<ThreadableWebSoc
ketChannelClientWrapper> prpClientWrapper, const String& taskMode) |
| 396 { |
| 397 ASSERT(isMainThread()); |
| 398 ASSERT_UNUSED(context, context->isDocument()); |
| 399 |
| 400 RefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper = prpClientWra
pper; |
| 401 |
| 402 Peer* peer = Peer::create(clientWrapper, *loaderProxy, context, taskMode); |
| 403 bool sent = loaderProxy->postTaskForModeToWorkerContext( |
| 404 WorkerContextDidInitializeTask::create(peer, clientWrapper, peer->useHix
ie76Protocol()), taskMode); |
| 405 if (!sent) { |
| 406 clientWrapper->clearPeer(); |
| 407 delete peer; |
| 408 } |
| 409 } |
| 410 |
| 411 void WorkerThreadableWebSocketChannel::Bridge::initialize() |
| 412 { |
| 413 ASSERT(!m_peer); |
| 414 setMethodNotCompleted(); |
| 415 RefPtr<Bridge> protect(this); |
| 416 m_loaderProxy.postTaskToLoader( |
| 417 createCallbackTask(&Bridge::mainThreadInitialize, |
| 418 AllowCrossThreadAccess(&m_loaderProxy), m_workerClien
tWrapper, m_taskMode)); |
| 419 waitForMethodCompletion(); |
| 420 // m_peer may be null when the nested runloop exited before a peer has creat
ed. |
| 421 m_peer = m_workerClientWrapper->peer(); |
| 422 } |
| 423 |
390 void WorkerThreadableWebSocketChannel::mainThreadConnect(ScriptExecutionContext*
context, Peer* peer, const KURL& url, const String& protocol) | 424 void WorkerThreadableWebSocketChannel::mainThreadConnect(ScriptExecutionContext*
context, Peer* peer, const KURL& url, const String& protocol) |
391 { | 425 { |
392 ASSERT(isMainThread()); | 426 ASSERT(isMainThread()); |
393 ASSERT_UNUSED(context, context->isDocument()); | 427 ASSERT_UNUSED(context, context->isDocument()); |
394 ASSERT(peer); | 428 ASSERT(peer); |
395 | 429 |
396 peer->connect(url, protocol); | 430 peer->connect(url, protocol); |
397 } | 431 } |
398 | 432 |
399 void WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) | 433 void WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) |
400 { | 434 { |
401 ASSERT(m_workerClientWrapper); | 435 ASSERT(m_workerClientWrapper); |
402 ASSERT(m_peer); | 436 if (!m_peer) |
| 437 return; |
403 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadConnect, AllowCrossThreadAccess(m_peer), url, protocol)); | 438 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadConnect, AllowCrossThreadAccess(m_peer), url, protocol)); |
404 } | 439 } |
405 | 440 |
406 void WorkerThreadableWebSocketChannel::mainThreadSend(ScriptExecutionContext* co
ntext, Peer* peer, const String& message) | 441 void WorkerThreadableWebSocketChannel::mainThreadSend(ScriptExecutionContext* co
ntext, Peer* peer, const String& message) |
407 { | 442 { |
408 ASSERT(isMainThread()); | 443 ASSERT(isMainThread()); |
409 ASSERT_UNUSED(context, context->isDocument()); | 444 ASSERT_UNUSED(context, context->isDocument()); |
410 ASSERT(peer); | 445 ASSERT(peer); |
411 | 446 |
412 peer->send(message); | 447 peer->send(message); |
(...skipping 14 matching lines...) Expand all Loading... |
427 ASSERT(isMainThread()); | 462 ASSERT(isMainThread()); |
428 ASSERT_UNUSED(context, context->isDocument()); | 463 ASSERT_UNUSED(context, context->isDocument()); |
429 ASSERT(peer); | 464 ASSERT(peer); |
430 | 465 |
431 RefPtr<Blob> blob = Blob::create(url, type, size); | 466 RefPtr<Blob> blob = Blob::create(url, type, size); |
432 peer->send(*blob); | 467 peer->send(*blob); |
433 } | 468 } |
434 | 469 |
435 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const String& message) | 470 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const String& message) |
436 { | 471 { |
437 if (!m_workerClientWrapper) | 472 if (!m_workerClientWrapper || !m_peer) |
438 return ThreadableWebSocketChannel::SendFail; | 473 return ThreadableWebSocketChannel::SendFail; |
439 ASSERT(m_peer); | |
440 setMethodNotCompleted(); | 474 setMethodNotCompleted(); |
441 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSend, AllowCrossThreadAccess(m_peer), message)); | 475 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSend, AllowCrossThreadAccess(m_peer), message)); |
442 RefPtr<Bridge> protect(this); | 476 RefPtr<Bridge> protect(this); |
443 waitForMethodCompletion(); | 477 waitForMethodCompletion(); |
444 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 478 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
445 if (!clientWrapper) | 479 if (!clientWrapper) |
446 return ThreadableWebSocketChannel::SendFail; | 480 return ThreadableWebSocketChannel::SendFail; |
447 return clientWrapper->sendRequestResult(); | 481 return clientWrapper->sendRequestResult(); |
448 } | 482 } |
449 | 483 |
450 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const ArrayBuffer& binaryData) | 484 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const ArrayBuffer& binaryData) |
451 { | 485 { |
452 if (!m_workerClientWrapper) | 486 if (!m_workerClientWrapper || !m_peer) |
453 return ThreadableWebSocketChannel::SendFail; | 487 return ThreadableWebSocketChannel::SendFail; |
454 ASSERT(m_peer); | |
455 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. | 488 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. |
456 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(binaryData.byteLength
())); | 489 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(binaryData.byteLength
())); |
457 if (binaryData.byteLength()) | 490 if (binaryData.byteLength()) |
458 memcpy(data->data(), binaryData.data(), binaryData.byteLength()); | 491 memcpy(data->data(), binaryData.data(), binaryData.byteLength()); |
459 setMethodNotCompleted(); | 492 setMethodNotCompleted(); |
460 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release
())); | 493 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release
())); |
461 RefPtr<Bridge> protect(this); | 494 RefPtr<Bridge> protect(this); |
462 waitForMethodCompletion(); | 495 waitForMethodCompletion(); |
463 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 496 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
464 if (!clientWrapper) | 497 if (!clientWrapper) |
465 return ThreadableWebSocketChannel::SendFail; | 498 return ThreadableWebSocketChannel::SendFail; |
466 return clientWrapper->sendRequestResult(); | 499 return clientWrapper->sendRequestResult(); |
467 } | 500 } |
468 | 501 |
469 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const Blob& binaryData) | 502 ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge:
:send(const Blob& binaryData) |
470 { | 503 { |
471 if (!m_workerClientWrapper) | 504 if (!m_workerClientWrapper || !m_peer) |
472 return ThreadableWebSocketChannel::SendFail; | 505 return ThreadableWebSocketChannel::SendFail; |
473 ASSERT(m_peer); | |
474 setMethodNotCompleted(); | 506 setMethodNotCompleted(); |
475 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendBlob, AllowCrossThreadAccess(m_peer), binaryData.url(), b
inaryData.type(), binaryData.size())); | 507 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendBlob, AllowCrossThreadAccess(m_peer), binaryData.url(), b
inaryData.type(), binaryData.size())); |
476 RefPtr<Bridge> protect(this); | 508 RefPtr<Bridge> protect(this); |
477 waitForMethodCompletion(); | 509 waitForMethodCompletion(); |
478 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 510 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
479 if (!clientWrapper) | 511 if (!clientWrapper) |
480 return ThreadableWebSocketChannel::SendFail; | 512 return ThreadableWebSocketChannel::SendFail; |
481 return clientWrapper->sendRequestResult(); | 513 return clientWrapper->sendRequestResult(); |
482 } | 514 } |
483 | 515 |
484 void WorkerThreadableWebSocketChannel::mainThreadBufferedAmount(ScriptExecutionC
ontext* context, Peer* peer) | 516 void WorkerThreadableWebSocketChannel::mainThreadBufferedAmount(ScriptExecutionC
ontext* context, Peer* peer) |
485 { | 517 { |
486 ASSERT(isMainThread()); | 518 ASSERT(isMainThread()); |
487 ASSERT_UNUSED(context, context->isDocument()); | 519 ASSERT_UNUSED(context, context->isDocument()); |
488 ASSERT(peer); | 520 ASSERT(peer); |
489 | 521 |
490 peer->bufferedAmount(); | 522 peer->bufferedAmount(); |
491 } | 523 } |
492 | 524 |
493 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() | 525 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() |
494 { | 526 { |
495 if (!m_workerClientWrapper) | 527 if (!m_workerClientWrapper || !m_peer) |
496 return 0; | 528 return 0; |
497 ASSERT(m_peer); | |
498 setMethodNotCompleted(); | 529 setMethodNotCompleted(); |
499 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadBufferedAmount, AllowCrossThreadAccess(m_peer))); | 530 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadBufferedAmount, AllowCrossThreadAccess(m_peer))); |
500 RefPtr<Bridge> protect(this); | 531 RefPtr<Bridge> protect(this); |
501 waitForMethodCompletion(); | 532 waitForMethodCompletion(); |
502 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 533 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
503 if (clientWrapper) | 534 if (clientWrapper) |
504 return clientWrapper->bufferedAmount(); | 535 return clientWrapper->bufferedAmount(); |
505 return 0; | 536 return 0; |
506 } | 537 } |
507 | 538 |
508 void WorkerThreadableWebSocketChannel::mainThreadClose(ScriptExecutionContext* c
ontext, Peer* peer, int code, const String&reason) | 539 void WorkerThreadableWebSocketChannel::mainThreadClose(ScriptExecutionContext* c
ontext, Peer* peer, int code, const String& reason) |
509 { | 540 { |
510 ASSERT(isMainThread()); | 541 ASSERT(isMainThread()); |
511 ASSERT_UNUSED(context, context->isDocument()); | 542 ASSERT_UNUSED(context, context->isDocument()); |
512 ASSERT(peer); | 543 ASSERT(peer); |
513 | 544 |
514 peer->close(code, reason); | 545 peer->close(code, reason); |
515 } | 546 } |
516 | 547 |
517 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) | 548 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) |
518 { | 549 { |
519 ASSERT(m_peer); | 550 if (!m_peer) |
| 551 return; |
520 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadClose, AllowCrossThreadAccess(m_peer), code, reason)); | 552 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadClose, AllowCrossThreadAccess(m_peer), code, reason)); |
521 } | 553 } |
522 | 554 |
523 void WorkerThreadableWebSocketChannel::mainThreadFail(ScriptExecutionContext* co
ntext, Peer* peer, const String& reason) | 555 void WorkerThreadableWebSocketChannel::mainThreadFail(ScriptExecutionContext* co
ntext, Peer* peer, const String& reason) |
524 { | 556 { |
525 ASSERT(isMainThread()); | 557 ASSERT(isMainThread()); |
526 ASSERT_UNUSED(context, context->isDocument()); | 558 ASSERT_UNUSED(context, context->isDocument()); |
527 ASSERT(peer); | 559 ASSERT(peer); |
528 | 560 |
529 peer->fail(reason); | 561 peer->fail(reason); |
530 } | 562 } |
531 | 563 |
532 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason) | 564 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason) |
533 { | 565 { |
534 ASSERT(m_peer); | 566 if (!m_peer) |
| 567 return; |
535 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason)); | 568 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadFail, AllowCrossThreadAccess(m_peer), reason)); |
536 } | 569 } |
537 | 570 |
538 void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext*
context, Peer* peer) | 571 void WorkerThreadableWebSocketChannel::mainThreadDestroy(ScriptExecutionContext*
context, Peer* peer) |
539 { | 572 { |
540 ASSERT(isMainThread()); | 573 ASSERT(isMainThread()); |
541 ASSERT_UNUSED(context, context->isDocument()); | 574 ASSERT_UNUSED(context, context->isDocument()); |
542 ASSERT(peer); | 575 ASSERT(peer); |
543 | 576 |
544 delete peer; | 577 delete peer; |
(...skipping 14 matching lines...) Expand all Loading... |
559 { | 592 { |
560 ASSERT(isMainThread()); | 593 ASSERT(isMainThread()); |
561 ASSERT_UNUSED(context, context->isDocument()); | 594 ASSERT_UNUSED(context, context->isDocument()); |
562 ASSERT(peer); | 595 ASSERT(peer); |
563 | 596 |
564 peer->suspend(); | 597 peer->suspend(); |
565 } | 598 } |
566 | 599 |
567 void WorkerThreadableWebSocketChannel::Bridge::suspend() | 600 void WorkerThreadableWebSocketChannel::Bridge::suspend() |
568 { | 601 { |
569 ASSERT(m_peer); | 602 if (!m_peer) |
| 603 return; |
570 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSuspend, AllowCrossThreadAccess(m_peer))); | 604 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSuspend, AllowCrossThreadAccess(m_peer))); |
571 } | 605 } |
572 | 606 |
573 void WorkerThreadableWebSocketChannel::mainThreadResume(ScriptExecutionContext*
context, Peer* peer) | 607 void WorkerThreadableWebSocketChannel::mainThreadResume(ScriptExecutionContext*
context, Peer* peer) |
574 { | 608 { |
575 ASSERT(isMainThread()); | 609 ASSERT(isMainThread()); |
576 ASSERT_UNUSED(context, context->isDocument()); | 610 ASSERT_UNUSED(context, context->isDocument()); |
577 ASSERT(peer); | 611 ASSERT(peer); |
578 | 612 |
579 peer->resume(); | 613 peer->resume(); |
580 } | 614 } |
581 | 615 |
582 void WorkerThreadableWebSocketChannel::Bridge::resume() | 616 void WorkerThreadableWebSocketChannel::Bridge::resume() |
583 { | 617 { |
584 ASSERT(m_peer); | 618 if (!m_peer) |
| 619 return; |
585 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadResume, AllowCrossThreadAccess(m_peer))); | 620 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadResume, AllowCrossThreadAccess(m_peer))); |
586 } | 621 } |
587 | 622 |
588 void WorkerThreadableWebSocketChannel::Bridge::clearClientWrapper() | 623 void WorkerThreadableWebSocketChannel::Bridge::clearClientWrapper() |
589 { | 624 { |
590 m_workerClientWrapper->clearClient(); | 625 m_workerClientWrapper->clearClient(); |
591 } | 626 } |
592 | 627 |
593 void WorkerThreadableWebSocketChannel::Bridge::setMethodNotCompleted() | 628 void WorkerThreadableWebSocketChannel::Bridge::setMethodNotCompleted() |
594 { | 629 { |
(...skipping 12 matching lines...) Expand all Loading... |
607 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 642 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
608 while (m_workerContext && clientWrapper && !clientWrapper->syncMethodDone()
&& result != MessageQueueTerminated) { | 643 while (m_workerContext && clientWrapper && !clientWrapper->syncMethodDone()
&& result != MessageQueueTerminated) { |
609 result = runLoop.runInMode(m_workerContext.get(), m_taskMode); // May ca
use this bridge to get disconnected, which makes m_workerContext become null. | 644 result = runLoop.runInMode(m_workerContext.get(), m_taskMode); // May ca
use this bridge to get disconnected, which makes m_workerContext become null. |
610 clientWrapper = m_workerClientWrapper.get(); | 645 clientWrapper = m_workerClientWrapper.get(); |
611 } | 646 } |
612 } | 647 } |
613 | 648 |
614 } // namespace WebCore | 649 } // namespace WebCore |
615 | 650 |
616 #endif // ENABLE(WEB_SOCKETS) | 651 #endif // ENABLE(WEB_SOCKETS) |
OLD | NEW |