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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 m_bridge->suspend(); | 221 m_bridge->suspend(); |
222 } | 222 } |
223 | 223 |
224 void WorkerThreadableWebSocketChannel::resume() | 224 void WorkerThreadableWebSocketChannel::resume() |
225 { | 225 { |
226 m_workerClientWrapper->resume(); | 226 m_workerClientWrapper->resume(); |
227 if (m_bridge) | 227 if (m_bridge) |
228 m_bridge->resume(); | 228 m_bridge->resume(); |
229 } | 229 } |
230 | 230 |
231 void WorkerThreadableWebSocketChannel::trace(Visitor* visitor) | 231 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re
ference, PassRefPtr<ThreadableWebSocketChannelClientWrapper> clientWrapper, Work
erLoaderProxy& loaderProxy, ExecutionContext* context, const String& sourceURL,
unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper> syncHelper
) |
232 { | |
233 visitor->trace(m_workerClientWrapper); | |
234 WebSocketChannel::trace(visitor); | |
235 } | |
236 | |
237 WorkerThreadableWebSocketChannel::Peer::Peer(PassRefPtr<WeakReference<Peer> > re
ference, PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> clientW
rapper, WorkerLoaderProxy& loaderProxy, ExecutionContext* context, const String&
sourceURL, unsigned lineNumber, PassOwnPtr<ThreadableWebSocketChannelSyncHelper
> syncHelper) | |
238 : m_workerClientWrapper(clientWrapper) | 232 : m_workerClientWrapper(clientWrapper) |
239 , m_loaderProxy(loaderProxy) | 233 , m_loaderProxy(loaderProxy) |
240 , m_mainWebSocketChannel(nullptr) | 234 , m_mainWebSocketChannel(nullptr) |
241 , m_syncHelper(syncHelper) | 235 , m_syncHelper(syncHelper) |
242 , m_weakFactory(reference, this) | 236 , m_weakFactory(reference, this) |
243 { | 237 { |
244 ASSERT(isMainThread()); | 238 ASSERT(isMainThread()); |
245 ASSERT(m_workerClientWrapper.get()); | 239 ASSERT(m_workerClientWrapper.get()); |
246 | 240 |
247 Document* document = toDocument(context); | 241 Document* document = toDocument(context); |
248 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { | 242 if (RuntimeEnabledFeatures::experimentalWebSocketEnabled()) { |
249 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this,
sourceURL, lineNumber); | 243 m_mainWebSocketChannel = NewWebSocketChannelImpl::create(document, this,
sourceURL, lineNumber); |
250 } else { | 244 } else { |
251 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th
is, sourceURL, lineNumber); | 245 m_mainWebSocketChannel = MainThreadWebSocketChannel::create(document, th
is, sourceURL, lineNumber); |
252 } | 246 } |
253 | 247 |
254 m_syncHelper->signalWorkerThread(); | 248 m_syncHelper->signalWorkerThread(); |
255 } | 249 } |
256 | 250 |
257 WorkerThreadableWebSocketChannel::Peer::~Peer() | 251 WorkerThreadableWebSocketChannel::Peer::~Peer() |
258 { | 252 { |
259 ASSERT(isMainThread()); | 253 ASSERT(isMainThread()); |
260 if (m_mainWebSocketChannel) | 254 if (m_mainWebSocketChannel) |
261 m_mainWebSocketChannel->disconnect(); | 255 m_mainWebSocketChannel->disconnect(); |
262 } | 256 } |
263 | 257 |
264 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) | 258 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) |
265 { | 259 { |
266 // The caller must call destroy() to free the peer. | 260 // The caller must call destroy() to free the peer. |
267 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect
ion, lineNumberAtConnection, syncHelper); | 261 new Peer(reference, clientWrapper, *loaderProxy, context, sourceURLAtConnect
ion, lineNumberAtConnection, syncHelper); |
268 } | 262 } |
269 | 263 |
270 void WorkerThreadableWebSocketChannel::Peer::destroy() | 264 void WorkerThreadableWebSocketChannel::Peer::destroy() |
271 { | 265 { |
272 ASSERT(isMainThread()); | 266 ASSERT(isMainThread()); |
273 delete this; | 267 delete this; |
274 } | 268 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 } | 361 } |
368 | 362 |
369 void WorkerThreadableWebSocketChannel::Peer::resume() | 363 void WorkerThreadableWebSocketChannel::Peer::resume() |
370 { | 364 { |
371 ASSERT(isMainThread()); | 365 ASSERT(isMainThread()); |
372 if (!m_mainWebSocketChannel) | 366 if (!m_mainWebSocketChannel) |
373 return; | 367 return; |
374 m_mainWebSocketChannel->resume(); | 368 m_mainWebSocketChannel->resume(); |
375 } | 369 } |
376 | 370 |
377 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtrWil
lBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const St
ring& subprotocol, const String& extensions) | 371 static void workerGlobalScopeDidConnect(ExecutionContext* context, PassRefPtr<Th
readableWebSocketChannelClientWrapper> workerClientWrapper, const String& subpro
tocol, const String& extensions) |
378 { | 372 { |
379 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 373 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
380 workerClientWrapper->setSubprotocol(subprotocol); | 374 workerClientWrapper->setSubprotocol(subprotocol); |
381 workerClientWrapper->setExtensions(extensions); | 375 workerClientWrapper->setExtensions(extensions); |
382 workerClientWrapper->didConnect(); | 376 workerClientWrapper->didConnect(); |
383 } | 377 } |
384 | 378 |
385 void WorkerThreadableWebSocketChannel::Peer::didConnect() | 379 void WorkerThreadableWebSocketChannel::Peer::didConnect() |
386 { | 380 { |
387 ASSERT(isMainThread()); | 381 ASSERT(isMainThread()); |
388 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConnect, m_workerClientWrapper.get(), m_mainWebSocketChannel->subprotocol(
), m_mainWebSocketChannel->extensions())); | 382 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConnect, m_workerClientWrapper, m_mainWebSocketChannel->subprotocol(), m_m
ainWebSocketChannel->extensions())); |
389 } | 383 } |
390 | 384 |
391 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe
fPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, c
onst String& message) | 385 static void workerGlobalScopeDidReceiveMessage(ExecutionContext* context, PassRe
fPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, const String&
message) |
392 { | 386 { |
393 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 387 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
394 workerClientWrapper->didReceiveMessage(message); | 388 workerClientWrapper->didReceiveMessage(message); |
395 } | 389 } |
396 | 390 |
397 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes
sage) | 391 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessage(const String& mes
sage) |
398 { | 392 { |
399 ASSERT(isMainThread()); | 393 ASSERT(isMainThread()); |
400 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessage, m_workerClientWrapper.get(), message)); | 394 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessage, m_workerClientWrapper, message)); |
401 } | 395 } |
402 | 396 |
403 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas
sRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper
, PassOwnPtr<Vector<char> > binaryData) | 397 static void workerGlobalScopeDidReceiveBinaryData(ExecutionContext* context, Pas
sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, PassOwnPtr
<Vector<char> > binaryData) |
404 { | 398 { |
405 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 399 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
406 workerClientWrapper->didReceiveBinaryData(binaryData); | 400 workerClientWrapper->didReceiveBinaryData(binaryData); |
407 } | 401 } |
408 | 402 |
409 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) | 403 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) |
410 { | 404 { |
411 ASSERT(isMainThread()); | 405 ASSERT(isMainThread()); |
412 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); | 406 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper, binaryData)); |
413 } | 407 } |
414 | 408 |
415 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap
per, unsigned long bufferedAmount) | 409 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigne
d long bufferedAmount) |
416 { | 410 { |
417 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 411 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
418 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); | 412 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
419 } | 413 } |
420 | 414 |
421 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) | 415 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) |
422 { | 416 { |
423 ASSERT(isMainThread()); | 417 ASSERT(isMainThread()); |
424 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); | 418 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper, bufferedAmount)); |
425 } | 419 } |
426 | 420 |
427 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) | 421 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
428 { | 422 { |
429 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 423 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
430 workerClientWrapper->didStartClosingHandshake(); | 424 workerClientWrapper->didStartClosingHandshake(); |
431 } | 425 } |
432 | 426 |
433 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 427 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
434 { | 428 { |
435 ASSERT(isMainThread()); | 429 ASSERT(isMainThread()); |
436 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); | 430 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper)); |
437 } | 431 } |
438 | 432 |
439 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS
tatus closingHandshakeCompletion, unsigned short code, const String& reason) | 433 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtr<Thre
adableWebSocketChannelClientWrapper> workerClientWrapper, unsigned long unhandle
dBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionStatus closin
gHandshakeCompletion, unsigned short code, const String& reason) |
440 { | 434 { |
441 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 435 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
442 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); | 436 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); |
443 } | 437 } |
444 | 438 |
445 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) | 439 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) |
446 { | 440 { |
447 ASSERT(isMainThread()); | 441 ASSERT(isMainThread()); |
448 m_mainWebSocketChannel = nullptr; | 442 m_mainWebSocketChannel = nullptr; |
449 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh
akeCompletion, code, reason)); | 443 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper, unhandledBufferedAmount, closingHandshakeCom
pletion, code, reason)); |
450 } | 444 } |
451 | 445 |
452 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) | 446 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper) |
453 { | 447 { |
454 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 448 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
455 workerClientWrapper->didReceiveMessageError(); | 449 workerClientWrapper->didReceiveMessageError(); |
456 } | 450 } |
457 | 451 |
458 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 452 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
459 { | 453 { |
460 ASSERT(isMainThread()); | 454 ASSERT(isMainThread()); |
461 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper.get())); | 455 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveMessageError, m_workerClientWrapper)); |
462 } | 456 } |
463 | 457 |
464 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtrWillBeRawPtr<Threadab
leWebSocketChannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerG
lobalScope) | 458 WorkerThreadableWebSocketChannel::Bridge::Bridge(PassRefPtr<ThreadableWebSocketC
hannelClientWrapper> workerClientWrapper, WorkerGlobalScope& workerGlobalScope) |
465 : m_workerClientWrapper(workerClientWrapper) | 459 : m_workerClientWrapper(workerClientWrapper) |
466 , m_workerGlobalScope(workerGlobalScope) | 460 , m_workerGlobalScope(workerGlobalScope) |
467 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) | 461 , m_loaderProxy(m_workerGlobalScope->thread()->workerLoaderProxy()) |
468 , m_syncHelper(0) | 462 , m_syncHelper(0) |
469 { | 463 { |
470 ASSERT(m_workerClientWrapper.get()); | 464 ASSERT(m_workerClientWrapper.get()); |
471 } | 465 } |
472 | 466 |
473 WorkerThreadableWebSocketChannel::Bridge::~Bridge() | 467 WorkerThreadableWebSocketChannel::Bridge::~Bridge() |
474 { | 468 { |
475 disconnect(); | 469 disconnect(); |
476 } | 470 } |
477 | 471 |
478 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) | 472 void WorkerThreadableWebSocketChannel::Bridge::initialize(const String& sourceUR
L, unsigned lineNumber) |
479 { | 473 { |
480 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); | 474 RefPtr<WeakReference<Peer> > reference = WeakReference<Peer>::createUnbound(
); |
481 m_peer = WeakPtr<Peer>(reference); | 475 m_peer = WeakPtr<Peer>(reference); |
482 | 476 |
483 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())); |
484 // This pointer is guaranteed to be valid until we call terminatePeer. | 478 // This pointer is guaranteed to be valid until we call terminatePeer. |
485 m_syncHelper = syncHelper.get(); | 479 m_syncHelper = syncHelper.get(); |
486 | 480 |
487 RefPtr<Bridge> protect(this); | 481 RefPtr<Bridge> protect(this); |
488 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference
.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper.get(),
sourceURL, lineNumber, syncHelper.release()))) { | 482 if (!waitForMethodCompletion(createCallbackTask(&Peer::initialize, reference
.release(), AllowCrossThreadAccess(&m_loaderProxy), m_workerClientWrapper, sourc
eURL, lineNumber, syncHelper.release()))) { |
489 // 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. |
490 terminatePeer(); | 484 terminatePeer(); |
491 } | 485 } |
492 } | 486 } |
493 | 487 |
494 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) | 488 bool WorkerThreadableWebSocketChannel::Bridge::connect(const KURL& url, const St
ring& protocol) |
495 { | 489 { |
496 if (hasTerminatedPeer()) | 490 if (hasTerminatedPeer()) |
497 return false; | 491 return false; |
498 | 492 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); | 617 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); |
624 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. | 618 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
625 // We must not touch m_syncHelper any more. | 619 // We must not touch m_syncHelper any more. |
626 m_syncHelper = 0; | 620 m_syncHelper = 0; |
627 | 621 |
628 // We won't use this any more. | 622 // We won't use this any more. |
629 m_workerGlobalScope = nullptr; | 623 m_workerGlobalScope = nullptr; |
630 } | 624 } |
631 | 625 |
632 } // namespace WebCore | 626 } // namespace WebCore |
OLD | NEW |