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 19 matching lines...) Expand all Loading... |
30 | 30 |
31 #include "config.h" | 31 #include "config.h" |
32 | 32 |
33 #include "modules/websockets/WorkerThreadableWebSocketChannel.h" | 33 #include "modules/websockets/WorkerThreadableWebSocketChannel.h" |
34 | 34 |
35 #include "RuntimeEnabledFeatures.h" | 35 #include "RuntimeEnabledFeatures.h" |
36 #include "bindings/v8/ScriptCallStackFactory.h" | 36 #include "bindings/v8/ScriptCallStackFactory.h" |
37 #include "core/dom/CrossThreadTask.h" | 37 #include "core/dom/CrossThreadTask.h" |
38 #include "core/dom/Document.h" | 38 #include "core/dom/Document.h" |
39 #include "core/dom/ExecutionContext.h" | 39 #include "core/dom/ExecutionContext.h" |
40 #include "core/dom/ExecutionContextTask.h" | |
41 #include "core/fileapi/Blob.h" | 40 #include "core/fileapi/Blob.h" |
42 #include "core/inspector/ScriptCallFrame.h" | 41 #include "core/inspector/ScriptCallFrame.h" |
43 #include "core/inspector/ScriptCallStack.h" | 42 #include "core/inspector/ScriptCallStack.h" |
44 #include "core/workers/WorkerLoaderProxy.h" | 43 #include "core/workers/WorkerLoaderProxy.h" |
45 #include "core/workers/WorkerRunLoop.h" | 44 #include "core/workers/WorkerRunLoop.h" |
46 #include "core/workers/WorkerThread.h" | 45 #include "core/workers/WorkerThread.h" |
47 #include "modules/websockets/MainThreadWebSocketChannel.h" | 46 #include "modules/websockets/MainThreadWebSocketChannel.h" |
48 #include "modules/websockets/NewWebSocketChannelImpl.h" | 47 #include "modules/websockets/NewWebSocketChannelImpl.h" |
49 #include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h" | 48 #include "modules/websockets/ThreadableWebSocketChannelClientWrapper.h" |
50 #include "public/platform/Platform.h" | 49 #include "public/platform/Platform.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 , m_bufferedAmount(0) | 112 , m_bufferedAmount(0) |
114 { | 113 { |
115 } | 114 } |
116 | 115 |
117 OwnPtr<blink::WebWaitableEvent> m_event; | 116 OwnPtr<blink::WebWaitableEvent> m_event; |
118 bool m_connectRequestResult; | 117 bool m_connectRequestResult; |
119 WebSocketChannel::SendResult m_sendRequestResult; | 118 WebSocketChannel::SendResult m_sendRequestResult; |
120 unsigned long m_bufferedAmount; | 119 unsigned long m_bufferedAmount; |
121 }; | 120 }; |
122 | 121 |
123 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& context, WebSocketChannelClient* client, const String& sourceURL, unsigned
lineNumber) | 122 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& workerGlobalScope, WebSocketChannelClient* client, const String& sourceURL
, unsigned lineNumber) |
124 : m_workerGlobalScope(context) | 123 : m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) |
125 , m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) | 124 , m_bridge(Bridge::create(m_workerClientWrapper, workerGlobalScope)) |
126 , m_bridge(Bridge::create(m_workerClientWrapper, m_workerGlobalScope)) | |
127 , m_sourceURLAtConnection(sourceURL) | 125 , m_sourceURLAtConnection(sourceURL) |
128 , m_lineNumberAtConnection(lineNumber) | 126 , m_lineNumberAtConnection(lineNumber) |
129 { | 127 { |
130 ASSERT(m_workerClientWrapper.get()); | 128 ASSERT(m_workerClientWrapper.get()); |
131 m_bridge->initialize(sourceURL, lineNumber); | 129 m_bridge->initialize(sourceURL, lineNumber); |
132 } | 130 } |
133 | 131 |
134 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel() | 132 WorkerThreadableWebSocketChannel::~WorkerThreadableWebSocketChannel() |
135 { | 133 { |
136 if (m_bridge) | 134 if (m_bridge) |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 m_bridge->suspend(); | 220 m_bridge->suspend(); |
223 } | 221 } |
224 | 222 |
225 void WorkerThreadableWebSocketChannel::resume() | 223 void WorkerThreadableWebSocketChannel::resume() |
226 { | 224 { |
227 m_workerClientWrapper->resume(); | 225 m_workerClientWrapper->resume(); |
228 if (m_bridge) | 226 if (m_bridge) |
229 m_bridge->resume(); | 227 m_bridge->resume(); |
230 } | 228 } |
231 | 229 |
232 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) | |
233 { | |
234 visitor->trace(m_workerGlobalScope); | |
235 WebSocketChannel::trace(visitor); | |
236 } | |
237 | |
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
) | 230 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 : m_workerClientWrapper(clientWrapper) | 231 : m_workerClientWrapper(clientWrapper) |
240 , m_loaderProxy(loaderProxy) | 232 , m_loaderProxy(loaderProxy) |
241 , m_mainWebSocketChannel(nullptr) | 233 , m_mainWebSocketChannel(nullptr) |
242 , m_syncHelper(syncHelper) | 234 , m_syncHelper(syncHelper) |
243 , m_weakFactory(reference, this) | 235 , m_weakFactory(reference, this) |
244 { | 236 { |
245 ASSERT(isMainThread()); | 237 ASSERT(isMainThread()); |
246 ASSERT(m_workerClientWrapper.get()); | 238 ASSERT(m_workerClientWrapper.get()); |
247 | 239 |
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
457 workerClientWrapper->didReceiveMessageError(); | 449 workerClientWrapper->didReceiveMessageError(); |
458 } | 450 } |
459 | 451 |
460 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 452 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
461 { | 453 { |
462 ASSERT(isMainThread()); | 454 ASSERT(isMainThread()); |
463 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper)); | 455 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper)); |
464 } | 456 } |
465 | 457 |
466 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, PassRefPtrWillBeRawPtr<WorkerGlobalSco
pe> workerGlobalScope) | 458 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) |
467 : m_workerClientWrapper(workerClientWrapper) | 459 : m_workerClientWrapper(workerClientWrapper) |
468 , m_workerGlobalScope(workerGlobalScope) | 460 , m_workerGlobalScope(workerGlobalScope) |
469 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) | 461 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
470 , m_syncHelper(0) | 462 , m_syncHelper(0) |
471 { | 463 { |
472 ASSERT(m_workerClientWrapper.get()); | 464 ASSERT(m_workerClientWrapper.get()); |
473 } | 465 } |
474 | 466 |
475 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 467 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
476 { | 468 { |
477 disconnect(); | 469 disconnect(); |
478 } | 470 } |
479 | 471 |
480 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) | 472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) |
481 { | 473 { |
482 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); | 474 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); |
483 m_peer = WeakPtr<Peer>(reference); | 475 m_peer = WeakPtr<Peer>(reference); |
484 | 476 |
485 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke
tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv
ent())); | 477 OwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper = ThreadableWebSocke
tChannelSyncHelper::create(adoptPtr(blink::Platform::current()->createWaitableEv
ent())); |
486 // This pointer is guaranteed to be valid until we call terminatePeer. | 478 // This pointer is guaranteed to be valid until we call terminatePeer. |
487 m_syncHelper = syncHelper.get(); | 479 m_syncHelper = syncHelper.get(); |
488 | 480 |
489 RefPtr<Bridge> protect(this); | 481 RefPtr<Bridge> protect(this); |
490 m_loaderProxy.postTaskToLoader(createCallbackTask(&Peer::initialize, referen
ce.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sou
rceURL, lineNumber, syncHelper.release())); | 482 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference
.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc
eURL, lineNumber, syncHelper.release()))) { |
491 if (!waitForMethodCompletion()) { | |
492 // The worker thread has been signalled to shutdown before method comple
tion. | 483 // The worker thread has been signalled to shutdown before method comple
tion. |
493 terminatePeer(); | 484 terminatePeer(); |
494 } | 485 } |
495 } | 486 } |
496 | 487 |
497 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) | 488 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) |
498 { | 489 { |
499 if (!m_workerGlobalScope) | 490 if (hasTerminatedPeer()) |
500 return false; | 491 return false; |
501 ASSERT(m_syncHelper); | 492 |
502 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::connect,
m_peer, url.copy(), protocol.isolatedCopy()))); | |
503 RefPtr<Bridge> protect(this); | 493 RefPtr<Bridge> protect(this); |
504 waitForMethodCompletion(); | 494 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::connect, m_
peer, url.copy(), protocol.isolatedCopy())))) |
| 495 return false; |
| 496 |
505 return m_syncHelper->connectRequestResult(); | 497 return m_syncHelper->connectRequestResult(); |
506 } | 498 } |
507 | 499 |
508 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t String& message) | 500 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t String& message) |
509 { | 501 { |
510 if (!m_workerGlobalScope) | 502 if (hasTerminatedPeer()) |
511 return WebSocketChannel::SendFail; | 503 return WebSocketChannel::SendFail; |
512 ASSERT(m_syncHelper); | 504 |
513 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::send, m_p
eer, message.isolatedCopy()))); | |
514 RefPtr<Bridge> protect(this); | 505 RefPtr<Bridge> protect(this); |
515 waitForMethodCompletion(); | 506 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::send, m_pee
r, message.isolatedCopy())))) |
| 507 return WebSocketChannel::SendFail; |
| 508 |
516 return m_syncHelper->sendRequestResult(); | 509 return m_syncHelper->sendRequestResult(); |
517 } | 510 } |
518 | 511 |
519 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) | 512 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) |
520 { | 513 { |
521 if (!m_workerGlobalScope) | 514 if (hasTerminatedPeer()) |
522 return WebSocketChannel::SendFail; | 515 return WebSocketChannel::SendFail; |
523 ASSERT(m_syncHelper); | 516 |
524 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. | 517 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. |
525 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(byteLength)); | 518 OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(byteLength)); |
526 if (binaryData.byteLength()) | 519 if (binaryData.byteLength()) |
527 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO
ffset, byteLength); | 520 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO
ffset, byteLength); |
528 | 521 |
529 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::sendArray
Buffer, m_peer, data.release()))); | |
530 RefPtr<Bridge> protect(this); | 522 RefPtr<Bridge> protect(this); |
531 waitForMethodCompletion(); | 523 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendArrayBu
ffer, m_peer, data.release())))) |
| 524 return WebSocketChannel::SendFail; |
| 525 |
532 return m_syncHelper->sendRequestResult(); | 526 return m_syncHelper->sendRequestResult(); |
533 } | 527 } |
534 | 528 |
535 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Pass
RefPtr<BlobDataHandle> data) | 529 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Pass
RefPtr<BlobDataHandle> data) |
536 { | 530 { |
537 if (!m_workerGlobalScope) | 531 if (hasTerminatedPeer()) |
538 return WebSocketChannel::SendFail; | 532 return WebSocketChannel::SendFail; |
539 ASSERT(m_syncHelper); | 533 |
540 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::sendBlob,
m_peer, data))); | |
541 RefPtr<Bridge> protect(this); | 534 RefPtr<Bridge> protect(this); |
542 waitForMethodCompletion(); | 535 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m
_peer, data)))) |
| 536 return WebSocketChannel::SendFail; |
| 537 |
543 return m_syncHelper->sendRequestResult(); | 538 return m_syncHelper->sendRequestResult(); |
544 } | 539 } |
545 | 540 |
546 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() | 541 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() |
547 { | 542 { |
548 if (!m_workerGlobalScope) | 543 if (hasTerminatedPeer()) |
549 return 0; | 544 return 0; |
550 ASSERT(m_syncHelper); | 545 |
551 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::bufferedA
mount, m_peer))); | |
552 RefPtr<Bridge> protect(this); | 546 RefPtr<Bridge> protect(this); |
553 waitForMethodCompletion(); | 547 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::bufferedAmo
unt, m_peer)))) |
| 548 return 0; |
| 549 |
554 return m_syncHelper->bufferedAmount(); | 550 return m_syncHelper->bufferedAmount(); |
555 } | 551 } |
556 | 552 |
557 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) | 553 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) |
558 { | 554 { |
| 555 if (hasTerminatedPeer()) |
| 556 return; |
| 557 |
559 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); | 558 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); |
560 } | 559 } |
561 | 560 |
562 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) | 561 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) |
563 { | 562 { |
| 563 if (hasTerminatedPeer()) |
| 564 return; |
| 565 |
564 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::fail, m_p
eer, reason.isolatedCopy(), level, sourceURL.isolatedCopy(), lineNumber))); | 566 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::fail, m_p
eer, reason.isolatedCopy(), level, sourceURL.isolatedCopy(), lineNumber))); |
565 } | 567 } |
566 | 568 |
567 void WorkerThreadableWebSocketChannel::Bridge::disconnect() | 569 void WorkerThreadableWebSocketChannel::Bridge::disconnect() |
568 { | 570 { |
569 clearClientWrapper(); | 571 clearClientWrapper(); |
570 terminatePeer(); | 572 terminatePeer(); |
571 } | 573 } |
572 | 574 |
573 void WorkerThreadableWebSocketChannel::Bridge::suspend() | 575 void WorkerThreadableWebSocketChannel::Bridge::suspend() |
574 { | 576 { |
| 577 if (hasTerminatedPeer()) |
| 578 return; |
| 579 |
575 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::suspend,
m_peer))); | 580 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::suspend,
m_peer))); |
576 } | 581 } |
577 | 582 |
578 void WorkerThreadableWebSocketChannel::Bridge::resume() | 583 void WorkerThreadableWebSocketChannel::Bridge::resume() |
579 { | 584 { |
| 585 if (hasTerminatedPeer()) |
| 586 return; |
| 587 |
580 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::resume, m
_peer))); | 588 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::resume, m
_peer))); |
581 } | 589 } |
582 | 590 |
583 void WorkerThreadableWebSocketChannel::Bridge::clearClientWrapper() | 591 void WorkerThreadableWebSocketChannel::Bridge::clearClientWrapper() |
584 { | 592 { |
585 m_workerClientWrapper->clearClient(); | 593 m_workerClientWrapper->clearClient(); |
586 } | 594 } |
587 | 595 |
588 // Caller of this function should hold a reference to the bridge, because this f
unction may call WebSocket::didClose() in the end, | 596 // Caller of this function should hold a reference to the bridge, because this f
unction may call WebSocket::didClose() in the end, |
589 // which causes the bridge to get disconnected from the WebSocket and deleted if
there is no other reference. | 597 // which causes the bridge to get disconnected from the WebSocket and deleted if
there is no other reference. |
590 bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion() | 598 bool WorkerThreadableWebSocketChannel::Bridge::waitForMethodCompletion(PassOwnPt
r<ExecutionContextTask> task) |
591 { | 599 { |
592 if (!m_syncHelper) | 600 ASSERT(m_workerGlobalScope); |
593 return true; | 601 ASSERT(m_syncHelper); |
| 602 |
| 603 m_loaderProxy.postTaskToLoader(task); |
594 | 604 |
595 blink::WebWaitableEvent* shutdownEvent = m_workerGlobalScope->thread()->shut
downEvent(); | 605 blink::WebWaitableEvent* shutdownEvent = m_workerGlobalScope->thread()->shut
downEvent(); |
596 Vector<blink::WebWaitableEvent*> events; | 606 Vector<blink::WebWaitableEvent*> events; |
597 events.append(shutdownEvent); | 607 events.append(shutdownEvent); |
598 events.append(m_syncHelper->event()); | 608 events.append(m_syncHelper->event()); |
599 | 609 |
600 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); | 610 ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack); |
601 blink::WebWaitableEvent* signalled = blink::Platform::current()->waitMultipl
eEvents(events); | 611 blink::WebWaitableEvent* signalled = blink::Platform::current()->waitMultipl
eEvents(events); |
602 return signalled != shutdownEvent; | 612 return signalled != shutdownEvent; |
603 } | 613 } |
604 | 614 |
605 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() | 615 void WorkerThreadableWebSocketChannel::Bridge::terminatePeer() |
606 { | 616 { |
607 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); | 617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); |
| 618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
| 619 // We must not touch m_syncHelper any more. |
| 620 m_syncHelper = 0; |
| 621 |
| 622 // We won't use this any more. |
608 m_workerGlobalScope = nullptr; | 623 m_workerGlobalScope = nullptr; |
609 m_syncHelper = 0; | |
610 } | 624 } |
611 | 625 |
612 } // namespace WebCore | 626 } // namespace WebCore |
OLD | NEW |