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 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
377 { | 377 { |
378 } | 378 } |
379 | 379 |
380 Bridge::~Bridge() | 380 Bridge::~Bridge() |
381 { | 381 { |
382 ASSERT(!m_peer); | 382 ASSERT(!m_peer); |
383 } | 383 } |
384 | 384 |
385 void Bridge::initialize(const String& sourceURL, unsigned lineNumber) | 385 void Bridge::initialize(const String& sourceURL, unsigned lineNumber) |
386 { | 386 { |
387 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::initialize, AllowC
rossThreadAccess(m_peer.get()), sourceURL, lineNumber))) { | 387 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::initialize, m_peer
.get(), sourceURL, lineNumber))) { |
388 // The worker thread has been signalled to shutdown before method comple
tion. | 388 // The worker thread has been signalled to shutdown before method comple
tion. |
389 disconnect(); | 389 disconnect(); |
390 } | 390 } |
391 } | 391 } |
392 | 392 |
393 bool Bridge::connect(const KURL& url, const String& protocol) | 393 bool Bridge::connect(const KURL& url, const String& protocol) |
394 { | 394 { |
395 if (!m_peer) | 395 if (!m_peer) |
396 return false; | 396 return false; |
397 | 397 |
398 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::connect, AllowCros
sThreadAccess(m_peer.get()), url, protocol))) | 398 if (!waitForMethodCompletion(createCrossThreadTask(&Peer::connect, m_peer.ge
t(), url, protocol))) |
399 return false; | 399 return false; |
400 | 400 |
401 return m_syncHelper->connectRequestResult(); | 401 return m_syncHelper->connectRequestResult(); |
402 } | 402 } |
403 | 403 |
404 void Bridge::send(const CString& message) | 404 void Bridge::send(const CString& message) |
405 { | 405 { |
406 ASSERT(m_peer); | 406 ASSERT(m_peer); |
407 OwnPtr<Vector<char>> data = adoptPtr(new Vector<char>(message.length())); | 407 OwnPtr<Vector<char>> data = adoptPtr(new Vector<char>(message.length())); |
408 if (message.length()) | 408 if (message.length()) |
409 memcpy(data->data(), static_cast<const char*>(message.data()), message.l
ength()); | 409 memcpy(data->data(), static_cast<const char*>(message.data()), message.l
ength()); |
410 | 410 |
411 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendTextAsCharV
ector, AllowCrossThreadAccess(m_peer.get()), passed(data.release()))); | 411 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendTextAsCharV
ector, m_peer.get(), passed(data.release()))); |
412 } | 412 } |
413 | 413 |
414 void Bridge::send(const DOMArrayBuffer& binaryData, unsigned byteOffset, unsigne
d byteLength) | 414 void Bridge::send(const DOMArrayBuffer& binaryData, unsigned byteOffset, unsigne
d byteLength) |
415 { | 415 { |
416 ASSERT(m_peer); | 416 ASSERT(m_peer); |
417 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. | 417 // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied
into Vector<char>. |
418 OwnPtr<Vector<char>> data = adoptPtr(new Vector<char>(byteLength)); | 418 OwnPtr<Vector<char>> data = adoptPtr(new Vector<char>(byteLength)); |
419 if (binaryData.byteLength()) | 419 if (binaryData.byteLength()) |
420 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO
ffset, byteLength); | 420 memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteO
ffset, byteLength); |
421 | 421 |
422 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendBinaryAsCha
rVector, AllowCrossThreadAccess(m_peer.get()), passed(data.release()))); | 422 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendBinaryAsCha
rVector, m_peer.get(), passed(data.release()))); |
423 } | 423 } |
424 | 424 |
425 void Bridge::send(PassRefPtr<BlobDataHandle> data) | 425 void Bridge::send(PassRefPtr<BlobDataHandle> data) |
426 { | 426 { |
427 ASSERT(m_peer); | 427 ASSERT(m_peer); |
428 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendBlob, Allow
CrossThreadAccess(m_peer.get()), data)); | 428 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::sendBlob, m_pee
r.get(), data)); |
429 } | 429 } |
430 | 430 |
431 void Bridge::close(int code, const String& reason) | 431 void Bridge::close(int code, const String& reason) |
432 { | 432 { |
433 ASSERT(m_peer); | 433 ASSERT(m_peer); |
434 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::close, AllowCro
ssThreadAccess(m_peer.get()), code, reason)); | 434 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::close, m_peer.g
et(), code, reason)); |
435 } | 435 } |
436 | 436 |
437 void Bridge::fail(const String& reason, MessageLevel level, const String& source
URL, unsigned lineNumber) | 437 void Bridge::fail(const String& reason, MessageLevel level, const String& source
URL, unsigned lineNumber) |
438 { | 438 { |
439 ASSERT(m_peer); | 439 ASSERT(m_peer); |
440 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::fail, AllowCros
sThreadAccess(m_peer.get()), reason, level, sourceURL, lineNumber)); | 440 m_loaderProxy->postTaskToLoader(createCrossThreadTask(&Peer::fail, m_peer.ge
t(), reason, level, sourceURL, lineNumber)); |
441 } | 441 } |
442 | 442 |
443 void Bridge::disconnect() | 443 void Bridge::disconnect() |
444 { | 444 { |
445 if (!m_peer) | 445 if (!m_peer) |
446 return; | 446 return; |
447 | 447 |
448 waitForMethodCompletion(createCrossThreadTask(&Peer::disconnect, AllowCrossT
hreadAccess(m_peer.get()))); | 448 waitForMethodCompletion(createCrossThreadTask(&Peer::disconnect, m_peer.get(
))); |
449 // Here |m_peer| is detached from the main thread and we can delete it. | 449 // Here |m_peer| is detached from the main thread and we can delete it. |
450 | 450 |
451 m_client = nullptr; | 451 m_client = nullptr; |
452 m_peer = nullptr; | 452 m_peer = nullptr; |
453 m_syncHelper = nullptr; | 453 m_syncHelper = nullptr; |
454 // We won't use this any more. | 454 // We won't use this any more. |
455 m_workerGlobalScope.clear(); | 455 m_workerGlobalScope.clear(); |
456 } | 456 } |
457 | 457 |
458 // Caller of this function should hold a reference to the bridge, because this f
unction may call WebSocket::didClose() in the end, | 458 // Caller of this function should hold a reference to the bridge, because this f
unction may call WebSocket::didClose() in the end, |
(...skipping 15 matching lines...) Expand all Loading... |
474 | 474 |
475 DEFINE_TRACE(Bridge) | 475 DEFINE_TRACE(Bridge) |
476 { | 476 { |
477 visitor->trace(m_client); | 477 visitor->trace(m_client); |
478 visitor->trace(m_workerGlobalScope); | 478 visitor->trace(m_workerGlobalScope); |
479 visitor->trace(m_syncHelper); | 479 visitor->trace(m_syncHelper); |
480 visitor->trace(m_peer); | 480 visitor->trace(m_peer); |
481 } | 481 } |
482 | 482 |
483 } // namespace blink | 483 } // namespace blink |
OLD | NEW |