Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(486)

Side by Side Diff: Source/WebCore/Modules/websockets/WorkerThreadableWebSocketChannel.cpp

Issue 10270006: Merge 113138 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1084/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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)
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698