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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 return m_bridge->send(message); | 108 return m_bridge->send(message); |
109 } | 109 } |
110 | 110 |
111 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const ArrayB
uffer& binaryData, unsigned byteOffset, unsigned byteLength) | 111 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const ArrayB
uffer& binaryData, unsigned byteOffset, unsigned byteLength) |
112 { | 112 { |
113 if (!m_bridge) | 113 if (!m_bridge) |
114 return WebSocketChannel::SendFail; | 114 return WebSocketChannel::SendFail; |
115 return m_bridge->send(binaryData, byteOffset, byteLength); | 115 return m_bridge->send(binaryData, byteOffset, byteLength); |
116 } | 116 } |
117 | 117 |
118 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(const Blob&
binaryData) | 118 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(PassRefPtr<B
lobDataHandle> blobData) |
119 { | 119 { |
120 if (!m_bridge) | 120 if (!m_bridge) |
121 return WebSocketChannel::SendFail; | 121 return WebSocketChannel::SendFail; |
122 return m_bridge->send(binaryData); | 122 return m_bridge->send(blobData); |
123 } | 123 } |
124 | 124 |
125 unsigned long WorkerThreadableWebSocketChannel::bufferedAmount() const | 125 unsigned long WorkerThreadableWebSocketChannel::bufferedAmount() const |
126 { | 126 { |
127 if (!m_bridge) | 127 if (!m_bridge) |
128 return 0; | 128 return 0; |
129 return m_bridge->bufferedAmount(); | 129 return m_bridge->bufferedAmount(); |
130 } | 130 } |
131 | 131 |
132 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) | 132 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 | 224 |
225 void WorkerThreadableWebSocketChannel::Peer::send(const ArrayBuffer& binaryData) | 225 void WorkerThreadableWebSocketChannel::Peer::send(const ArrayBuffer& binaryData) |
226 { | 226 { |
227 ASSERT(isMainThread()); | 227 ASSERT(isMainThread()); |
228 if (!m_mainWebSocketChannel || !m_workerClientWrapper) | 228 if (!m_mainWebSocketChannel || !m_workerClientWrapper) |
229 return; | 229 return; |
230 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->sen
d(binaryData, 0, binaryData.byteLength()); | 230 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->sen
d(binaryData, 0, binaryData.byteLength()); |
231 m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerG
lobalScopeDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode); | 231 m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerG
lobalScopeDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode); |
232 } | 232 } |
233 | 233 |
234 void WorkerThreadableWebSocketChannel::Peer::send(const Blob& binaryData) | 234 void WorkerThreadableWebSocketChannel::Peer::send(PassRefPtr<BlobDataHandle> blo
bData) |
235 { | 235 { |
236 ASSERT(isMainThread()); | 236 ASSERT(isMainThread()); |
237 if (!m_mainWebSocketChannel || !m_workerClientWrapper) | 237 if (!m_mainWebSocketChannel || !m_workerClientWrapper) |
238 return; | 238 return; |
239 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->sen
d(binaryData); | 239 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->sen
d(blobData); |
240 m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerG
lobalScopeDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode); | 240 m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerG
lobalScopeDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode); |
241 } | 241 } |
242 | 242 |
243 static void workerGlobalScopeDidGetBufferedAmount(ExecutionContext* context, Pas
sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong bufferedAmount) | 243 static void workerGlobalScopeDidGetBufferedAmount(ExecutionContext* context, Pas
sRefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong bufferedAmount) |
244 { | 244 { |
245 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 245 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
246 workerClientWrapper->setBufferedAmount(bufferedAmount); | 246 workerClientWrapper->setBufferedAmount(bufferedAmount); |
247 } | 247 } |
248 | 248 |
249 void WorkerThreadableWebSocketChannel::Peer::bufferedAmount() | 249 void WorkerThreadableWebSocketChannel::Peer::bufferedAmount() |
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 void WorkerThreadableWebSocketChannel::mainThreadSendArrayBuffer(ExecutionContex
t* context, Peer* peer, PassOwnPtr<Vector<char> > data) | 491 void WorkerThreadableWebSocketChannel::mainThreadSendArrayBuffer(ExecutionContex
t* context, Peer* peer, PassOwnPtr<Vector<char> > data) |
492 { | 492 { |
493 ASSERT(isMainThread()); | 493 ASSERT(isMainThread()); |
494 ASSERT_UNUSED(context, context->isDocument()); | 494 ASSERT_UNUSED(context, context->isDocument()); |
495 ASSERT(peer); | 495 ASSERT(peer); |
496 | 496 |
497 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(data->data(), data->si
ze()); | 497 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(data->data(), data->si
ze()); |
498 peer->send(*arrayBuffer); | 498 peer->send(*arrayBuffer); |
499 } | 499 } |
500 | 500 |
501 void WorkerThreadableWebSocketChannel::mainThreadSendBlob(ExecutionContext* cont
ext, Peer* peer, const KURL& url, const String& type, long long size) | 501 void WorkerThreadableWebSocketChannel::mainThreadSendBlob(ExecutionContext* cont
ext, Peer* peer, PassRefPtr<BlobDataHandle> data) |
502 { | 502 { |
503 ASSERT(isMainThread()); | 503 ASSERT(isMainThread()); |
504 ASSERT_UNUSED(context, context->isDocument()); | 504 ASSERT_UNUSED(context, context->isDocument()); |
505 ASSERT(peer); | 505 ASSERT(peer); |
506 | 506 peer->send(data); |
507 RefPtr<Blob> blob = Blob::create(url, type, size); | |
508 peer->send(*blob); | |
509 } | 507 } |
510 | 508 |
511 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t String& message) | 509 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t String& message) |
512 { | 510 { |
513 if (!m_workerClientWrapper || !m_peer) | 511 if (!m_workerClientWrapper || !m_peer) |
514 return WebSocketChannel::SendFail; | 512 return WebSocketChannel::SendFail; |
515 setMethodNotCompleted(); | 513 setMethodNotCompleted(); |
516 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSend, AllowCrossThreadAccess(m_peer), message)); | 514 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSend, AllowCrossThreadAccess(m_peer), message)); |
517 RefPtr<Bridge> protect(this); | 515 RefPtr<Bridge> protect(this); |
518 waitForMethodCompletion(); | 516 waitForMethodCompletion(); |
(...skipping 14 matching lines...) Expand all Loading... |
533 setMethodNotCompleted(); | 531 setMethodNotCompleted(); |
534 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release
())); | 532 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release
())); |
535 RefPtr<Bridge> protect(this); | 533 RefPtr<Bridge> protect(this); |
536 waitForMethodCompletion(); | 534 waitForMethodCompletion(); |
537 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 535 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
538 if (!clientWrapper) | 536 if (!clientWrapper) |
539 return WebSocketChannel::SendFail; | 537 return WebSocketChannel::SendFail; |
540 return clientWrapper->sendRequestResult(); | 538 return clientWrapper->sendRequestResult(); |
541 } | 539 } |
542 | 540 |
543 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(cons
t Blob& binaryData) | 541 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(Pass
RefPtr<BlobDataHandle> data) |
544 { | 542 { |
545 if (!m_workerClientWrapper || !m_peer) | 543 if (!m_workerClientWrapper || !m_peer) |
546 return WebSocketChannel::SendFail; | 544 return WebSocketChannel::SendFail; |
547 setMethodNotCompleted(); | 545 setMethodNotCompleted(); |
548 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendBlob, AllowCrossThreadAccess(m_peer), binaryData.url(), b
inaryData.type(), binaryData.size())); | 546 m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocket
Channel::mainThreadSendBlob, AllowCrossThreadAccess(m_peer), data)); |
549 RefPtr<Bridge> protect(this); | 547 RefPtr<Bridge> protect(this); |
550 waitForMethodCompletion(); | 548 waitForMethodCompletion(); |
551 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 549 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
552 if (!clientWrapper) | 550 if (!clientWrapper) |
553 return WebSocketChannel::SendFail; | 551 return WebSocketChannel::SendFail; |
554 return clientWrapper->sendRequestResult(); | 552 return clientWrapper->sendRequestResult(); |
555 } | 553 } |
556 | 554 |
557 void WorkerThreadableWebSocketChannel::mainThreadBufferedAmount(ExecutionContext
* context, Peer* peer) | 555 void WorkerThreadableWebSocketChannel::mainThreadBufferedAmount(ExecutionContext
* context, Peer* peer) |
558 { | 556 { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 WorkerRunLoop& runLoop = m_workerGlobalScope->thread()->runLoop(); | 680 WorkerRunLoop& runLoop = m_workerGlobalScope->thread()->runLoop(); |
683 MessageQueueWaitResult result = MessageQueueMessageReceived; | 681 MessageQueueWaitResult result = MessageQueueMessageReceived; |
684 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); | 682 ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapp
er.get(); |
685 while (m_workerGlobalScope && clientWrapper && !clientWrapper->syncMethodDon
e() && result != MessageQueueTerminated) { | 683 while (m_workerGlobalScope && clientWrapper && !clientWrapper->syncMethodDon
e() && result != MessageQueueTerminated) { |
686 result = runLoop.runInMode(m_workerGlobalScope.get(), m_taskMode); // Ma
y cause this bridge to get disconnected, which makes m_workerGlobalScope become
null. | 684 result = runLoop.runInMode(m_workerGlobalScope.get(), m_taskMode); // Ma
y cause this bridge to get disconnected, which makes m_workerGlobalScope become
null. |
687 clientWrapper = m_workerClientWrapper.get(); | 685 clientWrapper = m_workerClientWrapper.get(); |
688 } | 686 } |
689 } | 687 } |
690 | 688 |
691 } // namespace WebCore | 689 } // namespace WebCore |
OLD | NEW |