| 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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 | 67 |
| 68 // All setters are called on the main thread. | 68 // All setters are called on the main thread. |
| 69 void setConnectRequestResult(bool connectRequestResult) | 69 void setConnectRequestResult(bool connectRequestResult) |
| 70 { | 70 { |
| 71 m_connectRequestResult = connectRequestResult; | 71 m_connectRequestResult = connectRequestResult; |
| 72 } | 72 } |
| 73 void setSendRequestResult(WebSocketChannel::SendResult sendRequestResult) | 73 void setSendRequestResult(WebSocketChannel::SendResult sendRequestResult) |
| 74 { | 74 { |
| 75 m_sendRequestResult = sendRequestResult; | 75 m_sendRequestResult = sendRequestResult; |
| 76 } | 76 } |
| 77 void setBufferedAmount(unsigned long bufferedAmount) |
| 78 { |
| 79 m_bufferedAmount = bufferedAmount; |
| 80 } |
| 77 | 81 |
| 78 // All getter are called on the worker thread. | 82 // All getter are called on the worker thread. |
| 79 bool connectRequestResult() const | 83 bool connectRequestResult() const |
| 80 { | 84 { |
| 81 return m_connectRequestResult; | 85 return m_connectRequestResult; |
| 82 } | 86 } |
| 83 WebSocketChannel::SendResult sendRequestResult() const | 87 WebSocketChannel::SendResult sendRequestResult() const |
| 84 { | 88 { |
| 85 return m_sendRequestResult; | 89 return m_sendRequestResult; |
| 86 } | 90 } |
| 91 unsigned long bufferedAmount() const |
| 92 { |
| 93 return m_bufferedAmount; |
| 94 } |
| 87 | 95 |
| 88 // This should be called after all setters are called and before any | 96 // This should be called after all setters are called and before any |
| 89 // getters are called. | 97 // getters are called. |
| 90 void signalWorkerThread() | 98 void signalWorkerThread() |
| 91 { | 99 { |
| 92 m_event->signal(); | 100 m_event->signal(); |
| 93 } | 101 } |
| 94 | 102 |
| 95 blink::WebWaitableEvent* event() const | 103 blink::WebWaitableEvent* event() const |
| 96 { | 104 { |
| 97 return m_event.get(); | 105 return m_event.get(); |
| 98 } | 106 } |
| 99 | 107 |
| 100 private: | 108 private: |
| 101 ThreadableWebSocketChannelSyncHelper(PassOwnPtr<blink::WebWaitableEvent> eve
nt) | 109 ThreadableWebSocketChannelSyncHelper(PassOwnPtr<blink::WebWaitableEvent> eve
nt) |
| 102 : m_event(event) | 110 : m_event(event) |
| 103 , m_connectRequestResult(false) | 111 , m_connectRequestResult(false) |
| 104 , m_sendRequestResult(WebSocketChannel::SendFail) | 112 , m_sendRequestResult(WebSocketChannel::SendFail) |
| 113 , m_bufferedAmount(0) |
| 105 { | 114 { |
| 106 } | 115 } |
| 107 | 116 |
| 108 OwnPtr<blink::WebWaitableEvent> m_event; | 117 OwnPtr<blink::WebWaitableEvent> m_event; |
| 109 bool m_connectRequestResult; | 118 bool m_connectRequestResult; |
| 110 WebSocketChannel::SendResult m_sendRequestResult; | 119 WebSocketChannel::SendResult m_sendRequestResult; |
| 120 unsigned long m_bufferedAmount; |
| 111 }; | 121 }; |
| 112 | 122 |
| 113 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& workerGlobalScope, WebSocketChannelClient* client, const String& sourceURL
, unsigned lineNumber) | 123 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& workerGlobalScope, WebSocketChannelClient* client, const String& sourceURL
, unsigned lineNumber) |
| 114 : m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) | 124 : m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) |
| 115 , m_bridge(Bridge::create(m_workerClientWrapper, workerGlobalScope)) | 125 , m_bridge(Bridge::create(m_workerClientWrapper, workerGlobalScope)) |
| 116 , m_sourceURLAtConnection(sourceURL) | 126 , m_sourceURLAtConnection(sourceURL) |
| 117 , m_lineNumberAtConnection(lineNumber) | 127 , m_lineNumberAtConnection(lineNumber) |
| 118 { | 128 { |
| 119 ASSERT(m_workerClientWrapper.get()); | 129 ASSERT(m_workerClientWrapper.get()); |
| 120 m_bridge->initialize(sourceURL, lineNumber); | 130 m_bridge->initialize(sourceURL, lineNumber); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 147 return m_bridge->send(binaryData, byteOffset, byteLength); | 157 return m_bridge->send(binaryData, byteOffset, byteLength); |
| 148 } | 158 } |
| 149 | 159 |
| 150 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(PassRefPtr<B
lobDataHandle> blobData) | 160 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(PassRefPtr<B
lobDataHandle> blobData) |
| 151 { | 161 { |
| 152 if (!m_bridge) | 162 if (!m_bridge) |
| 153 return WebSocketChannel::SendFail; | 163 return WebSocketChannel::SendFail; |
| 154 return m_bridge->send(blobData); | 164 return m_bridge->send(blobData); |
| 155 } | 165 } |
| 156 | 166 |
| 167 unsigned long WorkerThreadableWebSocketChannel::bufferedAmount() const |
| 168 { |
| 169 if (!m_bridge) |
| 170 return 0; |
| 171 return m_bridge->bufferedAmount(); |
| 172 } |
| 173 |
| 157 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) | 174 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) |
| 158 { | 175 { |
| 159 if (m_bridge) | 176 if (m_bridge) |
| 160 m_bridge->close(code, reason); | 177 m_bridge->close(code, reason); |
| 161 } | 178 } |
| 162 | 179 |
| 163 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l
evel, const String& sourceURL, unsigned lineNumber) | 180 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l
evel, const String& sourceURL, unsigned lineNumber) |
| 164 { | 181 { |
| 165 if (!m_bridge) | 182 if (!m_bridge) |
| 166 return; | 183 return; |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 287 ASSERT(isMainThread()); | 304 ASSERT(isMainThread()); |
| 288 if (!m_mainWebSocketChannel) { | 305 if (!m_mainWebSocketChannel) { |
| 289 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); | 306 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); |
| 290 } else { | 307 } else { |
| 291 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel-
>send(blobData); | 308 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel-
>send(blobData); |
| 292 m_syncHelper->setSendRequestResult(sendRequestResult); | 309 m_syncHelper->setSendRequestResult(sendRequestResult); |
| 293 } | 310 } |
| 294 m_syncHelper->signalWorkerThread(); | 311 m_syncHelper->signalWorkerThread(); |
| 295 } | 312 } |
| 296 | 313 |
| 314 void WorkerThreadableWebSocketChannel::Peer::bufferedAmount() |
| 315 { |
| 316 ASSERT(isMainThread()); |
| 317 if (!m_mainWebSocketChannel) { |
| 318 m_syncHelper->setBufferedAmount(0); |
| 319 } else { |
| 320 unsigned long bufferedAmount = m_mainWebSocketChannel->bufferedAmount(); |
| 321 m_syncHelper->setBufferedAmount(bufferedAmount); |
| 322 } |
| 323 m_syncHelper->signalWorkerThread(); |
| 324 } |
| 325 |
| 297 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso
n) | 326 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso
n) |
| 298 { | 327 { |
| 299 ASSERT(isMainThread()); | 328 ASSERT(isMainThread()); |
| 300 if (!m_mainWebSocketChannel) | 329 if (!m_mainWebSocketChannel) |
| 301 return; | 330 return; |
| 302 m_mainWebSocketChannel->close(code, reason); | 331 m_mainWebSocketChannel->close(code, reason); |
| 303 } | 332 } |
| 304 | 333 |
| 305 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL
evel level, const String& sourceURL, unsigned lineNumber) | 334 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL
evel level, const String& sourceURL, unsigned lineNumber) |
| 306 { | 335 { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 364 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 393 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 365 workerClientWrapper->didReceiveBinaryData(binaryData); | 394 workerClientWrapper->didReceiveBinaryData(binaryData); |
| 366 } | 395 } |
| 367 | 396 |
| 368 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) | 397 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) |
| 369 { | 398 { |
| 370 ASSERT(isMainThread()); | 399 ASSERT(isMainThread()); |
| 371 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); | 400 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
| 372 } | 401 } |
| 373 | 402 |
| 374 static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper, unsigned long consumed) | 403 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap
per, unsigned long bufferedAmount) |
| 375 { | 404 { |
| 376 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 405 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 377 workerClientWrapper->didConsumeBufferedAmount(consumed); | 406 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); |
| 378 } | 407 } |
| 379 | 408 |
| 380 void WorkerThreadableWebSocketChannel::Peer::didConsumeBufferedAmount(unsigned l
ong consumed) | 409 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) |
| 381 { | 410 { |
| 382 ASSERT(isMainThread()); | 411 ASSERT(isMainThread()); |
| 383 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed)); | 412 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); |
| 384 } | 413 } |
| 385 | 414 |
| 386 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) | 415 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) |
| 387 { | 416 { |
| 388 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 417 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 389 workerClientWrapper->didStartClosingHandshake(); | 418 workerClientWrapper->didStartClosingHandshake(); |
| 390 } | 419 } |
| 391 | 420 |
| 392 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 421 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
| 393 { | 422 { |
| 394 ASSERT(isMainThread()); | 423 ASSERT(isMainThread()); |
| 395 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); | 424 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); |
| 396 } | 425 } |
| 397 | 426 |
| 398 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WebSocketC
hannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsig
ned short code, const String& reason) | 427 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS
tatus closingHandshakeCompletion, unsigned short code, const String& reason) |
| 399 { | 428 { |
| 400 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 429 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 401 workerClientWrapper->didClose(closingHandshakeCompletion, code, reason); | 430 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); |
| 402 } | 431 } |
| 403 | 432 |
| 404 void WorkerThreadableWebSocketChannel::Peer::didClose(ClosingHandshakeCompletion
Status closingHandshakeCompletion, unsigned short code, const String& reason) | 433 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) |
| 405 { | 434 { |
| 406 ASSERT(isMainThread()); | 435 ASSERT(isMainThread()); |
| 407 m_mainWebSocketChannel = nullptr; | 436 m_mainWebSocketChannel = nullptr; |
| 408 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reas
on)); | 437 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh
akeCompletion, code, reason)); |
| 409 } | 438 } |
| 410 | 439 |
| 411 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) | 440 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) |
| 412 { | 441 { |
| 413 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 442 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 414 workerClientWrapper->didReceiveMessageError(); | 443 workerClientWrapper->didReceiveMessageError(); |
| 415 } | 444 } |
| 416 | 445 |
| 417 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 446 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
| 418 { | 447 { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 496 if (hasTerminatedPeer()) | 525 if (hasTerminatedPeer()) |
| 497 return WebSocketChannel::SendFail; | 526 return WebSocketChannel::SendFail; |
| 498 | 527 |
| 499 RefPtr<Bridge> protect(this); | 528 RefPtr<Bridge> protect(this); |
| 500 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m
_peer, data)))) | 529 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m
_peer, data)))) |
| 501 return WebSocketChannel::SendFail; | 530 return WebSocketChannel::SendFail; |
| 502 | 531 |
| 503 return m_syncHelper->sendRequestResult(); | 532 return m_syncHelper->sendRequestResult(); |
| 504 } | 533 } |
| 505 | 534 |
| 535 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() |
| 536 { |
| 537 if (hasTerminatedPeer()) |
| 538 return 0; |
| 539 |
| 540 RefPtr<Bridge> protect(this); |
| 541 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::bufferedAmo
unt, m_peer)))) |
| 542 return 0; |
| 543 |
| 544 return m_syncHelper->bufferedAmount(); |
| 545 } |
| 546 |
| 506 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) | 547 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) |
| 507 { | 548 { |
| 508 if (hasTerminatedPeer()) | 549 if (hasTerminatedPeer()) |
| 509 return; | 550 return; |
| 510 | 551 |
| 511 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); | 552 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); |
| 512 } | 553 } |
| 513 | 554 |
| 514 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) | 555 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) |
| 515 { | 556 { |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); | 611 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); |
| 571 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. | 612 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
| 572 // We must not touch m_syncHelper any more. | 613 // We must not touch m_syncHelper any more. |
| 573 m_syncHelper = 0; | 614 m_syncHelper = 0; |
| 574 | 615 |
| 575 // We won't use this any more. | 616 // We won't use this any more. |
| 576 m_workerGlobalScope = nullptr; | 617 m_workerGlobalScope = nullptr; |
| 577 } | 618 } |
| 578 | 619 |
| 579 } // namespace WebCore | 620 } // namespace WebCore |
| OLD | NEW |