| 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 } | |
| 81 | 77 |
| 82 // All getter are called on the worker thread. | 78 // All getter are called on the worker thread. |
| 83 bool connectRequestResult() const | 79 bool connectRequestResult() const |
| 84 { | 80 { |
| 85 return m_connectRequestResult; | 81 return m_connectRequestResult; |
| 86 } | 82 } |
| 87 WebSocketChannel::SendResult sendRequestResult() const | 83 WebSocketChannel::SendResult sendRequestResult() const |
| 88 { | 84 { |
| 89 return m_sendRequestResult; | 85 return m_sendRequestResult; |
| 90 } | 86 } |
| 91 unsigned long bufferedAmount() const | |
| 92 { | |
| 93 return m_bufferedAmount; | |
| 94 } | |
| 95 | 87 |
| 96 // This should be called after all setters are called and before any | 88 // This should be called after all setters are called and before any |
| 97 // getters are called. | 89 // getters are called. |
| 98 void signalWorkerThread() | 90 void signalWorkerThread() |
| 99 { | 91 { |
| 100 m_event->signal(); | 92 m_event->signal(); |
| 101 } | 93 } |
| 102 | 94 |
| 103 blink::WebWaitableEvent* event() const | 95 blink::WebWaitableEvent* event() const |
| 104 { | 96 { |
| 105 return m_event.get(); | 97 return m_event.get(); |
| 106 } | 98 } |
| 107 | 99 |
| 108 private: | 100 private: |
| 109 ThreadableWebSocketChannelSyncHelper(PassOwnPtr<blink::WebWaitableEvent> eve
nt) | 101 ThreadableWebSocketChannelSyncHelper(PassOwnPtr<blink::WebWaitableEvent> eve
nt) |
| 110 : m_event(event) | 102 : m_event(event) |
| 111 , m_connectRequestResult(false) | 103 , m_connectRequestResult(false) |
| 112 , m_sendRequestResult(WebSocketChannel::SendFail) | 104 , m_sendRequestResult(WebSocketChannel::SendFail) |
| 113 , m_bufferedAmount(0) | |
| 114 { | 105 { |
| 115 } | 106 } |
| 116 | 107 |
| 117 OwnPtr<blink::WebWaitableEvent> m_event; | 108 OwnPtr<blink::WebWaitableEvent> m_event; |
| 118 bool m_connectRequestResult; | 109 bool m_connectRequestResult; |
| 119 WebSocketChannel::SendResult m_sendRequestResult; | 110 WebSocketChannel::SendResult m_sendRequestResult; |
| 120 unsigned long m_bufferedAmount; | |
| 121 }; | 111 }; |
| 122 | 112 |
| 123 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& workerGlobalScope, WebSocketChannelClient* client, const String& sourceURL
, unsigned lineNumber) | 113 WorkerThreadableWebSocketChannel::WorkerThreadableWebSocketChannel(WorkerGlobalS
cope& workerGlobalScope, WebSocketChannelClient* client, const String& sourceURL
, unsigned lineNumber) |
| 124 : m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) | 114 : m_workerClientWrapper(ThreadableWebSocketChannelClientWrapper::create(clie
nt)) |
| 125 , m_bridge(Bridge::create(m_workerClientWrapper, workerGlobalScope)) | 115 , m_bridge(Bridge::create(m_workerClientWrapper, workerGlobalScope)) |
| 126 , m_sourceURLAtConnection(sourceURL) | 116 , m_sourceURLAtConnection(sourceURL) |
| 127 , m_lineNumberAtConnection(lineNumber) | 117 , m_lineNumberAtConnection(lineNumber) |
| 128 { | 118 { |
| 129 ASSERT(m_workerClientWrapper.get()); | 119 ASSERT(m_workerClientWrapper.get()); |
| 130 m_bridge->initialize(sourceURL, lineNumber); | 120 m_bridge->initialize(sourceURL, lineNumber); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 157 return m_bridge->send(binaryData, byteOffset, byteLength); | 147 return m_bridge->send(binaryData, byteOffset, byteLength); |
| 158 } | 148 } |
| 159 | 149 |
| 160 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(PassRefPtr<B
lobDataHandle> blobData) | 150 WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::send(PassRefPtr<B
lobDataHandle> blobData) |
| 161 { | 151 { |
| 162 if (!m_bridge) | 152 if (!m_bridge) |
| 163 return WebSocketChannel::SendFail; | 153 return WebSocketChannel::SendFail; |
| 164 return m_bridge->send(blobData); | 154 return m_bridge->send(blobData); |
| 165 } | 155 } |
| 166 | 156 |
| 167 unsigned long WorkerThreadableWebSocketChannel::bufferedAmount() const | |
| 168 { | |
| 169 if (!m_bridge) | |
| 170 return 0; | |
| 171 return m_bridge->bufferedAmount(); | |
| 172 } | |
| 173 | |
| 174 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) | 157 void WorkerThreadableWebSocketChannel::close(int code, const String& reason) |
| 175 { | 158 { |
| 176 if (m_bridge) | 159 if (m_bridge) |
| 177 m_bridge->close(code, reason); | 160 m_bridge->close(code, reason); |
| 178 } | 161 } |
| 179 | 162 |
| 180 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l
evel, const String& sourceURL, unsigned lineNumber) | 163 void WorkerThreadableWebSocketChannel::fail(const String& reason, MessageLevel l
evel, const String& sourceURL, unsigned lineNumber) |
| 181 { | 164 { |
| 182 if (!m_bridge) | 165 if (!m_bridge) |
| 183 return; | 166 return; |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 ASSERT(isMainThread()); | 273 ASSERT(isMainThread()); |
| 291 if (!m_mainWebSocketChannel) { | 274 if (!m_mainWebSocketChannel) { |
| 292 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); | 275 m_syncHelper->setSendRequestResult(WebSocketChannel::SendFail); |
| 293 } else { | 276 } else { |
| 294 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel-
>send(blobData); | 277 WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel-
>send(blobData); |
| 295 m_syncHelper->setSendRequestResult(sendRequestResult); | 278 m_syncHelper->setSendRequestResult(sendRequestResult); |
| 296 } | 279 } |
| 297 m_syncHelper->signalWorkerThread(); | 280 m_syncHelper->signalWorkerThread(); |
| 298 } | 281 } |
| 299 | 282 |
| 300 void WorkerThreadableWebSocketChannel::Peer::bufferedAmount() | |
| 301 { | |
| 302 ASSERT(isMainThread()); | |
| 303 if (!m_mainWebSocketChannel) { | |
| 304 m_syncHelper->setBufferedAmount(0); | |
| 305 } else { | |
| 306 unsigned long bufferedAmount = m_mainWebSocketChannel->bufferedAmount(); | |
| 307 m_syncHelper->setBufferedAmount(bufferedAmount); | |
| 308 } | |
| 309 m_syncHelper->signalWorkerThread(); | |
| 310 } | |
| 311 | |
| 312 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso
n) | 283 void WorkerThreadableWebSocketChannel::Peer::close(int code, const String& reaso
n) |
| 313 { | 284 { |
| 314 ASSERT(isMainThread()); | 285 ASSERT(isMainThread()); |
| 315 if (!m_mainWebSocketChannel) | 286 if (!m_mainWebSocketChannel) |
| 316 return; | 287 return; |
| 317 m_mainWebSocketChannel->close(code, reason); | 288 m_mainWebSocketChannel->close(code, reason); |
| 318 } | 289 } |
| 319 | 290 |
| 320 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL
evel level, const String& sourceURL, unsigned lineNumber) | 291 void WorkerThreadableWebSocketChannel::Peer::fail(const String& reason, MessageL
evel level, const String& sourceURL, unsigned lineNumber) |
| 321 { | 292 { |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 363 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 334 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 364 workerClientWrapper->didReceiveBinaryData(binaryData); | 335 workerClientWrapper->didReceiveBinaryData(binaryData); |
| 365 } | 336 } |
| 366 | 337 |
| 367 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) | 338 void WorkerThreadableWebSocketChannel::Peer::didReceiveBinaryData(PassOwnPtr<Vec
tor<char> > binaryData) |
| 368 { | 339 { |
| 369 ASSERT(isMainThread()); | 340 ASSERT(isMainThread()); |
| 370 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); | 341 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidReceiveBinaryData, m_workerClientWrapper.get(), binaryData)); |
| 371 } | 342 } |
| 372 | 343 |
| 373 static void workerGlobalScopeDidUpdateBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrap
per, unsigned long bufferedAmount) | 344 static void workerGlobalScopeDidConsumeBufferedAmount(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper, unsigned long consumed) |
| 374 { | 345 { |
| 375 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 346 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 376 workerClientWrapper->didUpdateBufferedAmount(bufferedAmount); | 347 workerClientWrapper->didConsumeBufferedAmount(consumed); |
| 377 } | 348 } |
| 378 | 349 |
| 379 void WorkerThreadableWebSocketChannel::Peer::didUpdateBufferedAmount(unsigned lo
ng bufferedAmount) | 350 void WorkerThreadableWebSocketChannel::Peer::didConsumeBufferedAmount(unsigned l
ong consumed) |
| 380 { | 351 { |
| 381 ASSERT(isMainThread()); | 352 ASSERT(isMainThread()); |
| 382 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidUpdateBufferedAmount, m_workerClientWrapper.get(), bufferedAmount)); | 353 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidConsumeBufferedAmount, m_workerClientWrapper.get(), consumed)); |
| 383 } | 354 } |
| 384 | 355 |
| 385 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) | 356 static void workerGlobalScopeDidStartClosingHandshake(ExecutionContext* context,
PassRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWra
pper) |
| 386 { | 357 { |
| 387 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 358 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 388 workerClientWrapper->didStartClosingHandshake(); | 359 workerClientWrapper->didStartClosingHandshake(); |
| 389 } | 360 } |
| 390 | 361 |
| 391 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() | 362 void WorkerThreadableWebSocketChannel::Peer::didStartClosingHandshake() |
| 392 { | 363 { |
| 393 ASSERT(isMainThread()); | 364 ASSERT(isMainThread()); |
| 394 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); | 365 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidStartClosingHandshake, m_workerClientWrapper.get())); |
| 395 } | 366 } |
| 396 | 367 |
| 397 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, unsigned l
ong unhandledBufferedAmount, WebSocketChannelClient::ClosingHandshakeCompletionS
tatus closingHandshakeCompletion, unsigned short code, const String& reason) | 368 static void workerGlobalScopeDidClose(ExecutionContext* context, PassRefPtrWillB
eRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper, WebSocketC
hannelClient::ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsig
ned short code, const String& reason) |
| 398 { | 369 { |
| 399 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 370 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 400 workerClientWrapper->didClose(unhandledBufferedAmount, closingHandshakeCompl
etion, code, reason); | 371 workerClientWrapper->didClose(closingHandshakeCompletion, code, reason); |
| 401 } | 372 } |
| 402 | 373 |
| 403 void WorkerThreadableWebSocketChannel::Peer::didClose(unsigned long unhandledBuf
feredAmount, ClosingHandshakeCompletionStatus closingHandshakeCompletion, unsign
ed short code, const String& reason) | 374 void WorkerThreadableWebSocketChannel::Peer::didClose(ClosingHandshakeCompletion
Status closingHandshakeCompletion, unsigned short code, const String& reason) |
| 404 { | 375 { |
| 405 ASSERT(isMainThread()); | 376 ASSERT(isMainThread()); |
| 406 m_mainWebSocketChannel = nullptr; | 377 m_mainWebSocketChannel = nullptr; |
| 407 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), unhandledBufferedAmount, closingHandsh
akeCompletion, code, reason)); | 378 m_loaderProxy.postTaskToWorkerGlobalScope(createCallbackTask(&workerGlobalSc
opeDidClose, m_workerClientWrapper.get(), closingHandshakeCompletion, code, reas
on)); |
| 408 } | 379 } |
| 409 | 380 |
| 410 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) | 381 static void workerGlobalScopeDidReceiveMessageError(ExecutionContext* context, P
assRefPtrWillBeRawPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapp
er) |
| 411 { | 382 { |
| 412 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); | 383 ASSERT_UNUSED(context, context->isWorkerGlobalScope()); |
| 413 workerClientWrapper->didReceiveMessageError(); | 384 workerClientWrapper->didReceiveMessageError(); |
| 414 } | 385 } |
| 415 | 386 |
| 416 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() | 387 void WorkerThreadableWebSocketChannel::Peer::didReceiveMessageError() |
| 417 { | 388 { |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 if (hasTerminatedPeer()) | 466 if (hasTerminatedPeer()) |
| 496 return WebSocketChannel::SendFail; | 467 return WebSocketChannel::SendFail; |
| 497 | 468 |
| 498 RefPtr<Bridge> protect(this); | 469 RefPtr<Bridge> protect(this); |
| 499 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m
_peer, data)))) | 470 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::sendBlob, m
_peer, data)))) |
| 500 return WebSocketChannel::SendFail; | 471 return WebSocketChannel::SendFail; |
| 501 | 472 |
| 502 return m_syncHelper->sendRequestResult(); | 473 return m_syncHelper->sendRequestResult(); |
| 503 } | 474 } |
| 504 | 475 |
| 505 unsigned long WorkerThreadableWebSocketChannel::Bridge::bufferedAmount() | |
| 506 { | |
| 507 if (hasTerminatedPeer()) | |
| 508 return 0; | |
| 509 | |
| 510 RefPtr<Bridge> protect(this); | |
| 511 if (!waitForMethodCompletion(CallClosureTask::create(bind(&Peer::bufferedAmo
unt, m_peer)))) | |
| 512 return 0; | |
| 513 | |
| 514 return m_syncHelper->bufferedAmount(); | |
| 515 } | |
| 516 | |
| 517 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) | 476 void WorkerThreadableWebSocketChannel::Bridge::close(int code, const String& rea
son) |
| 518 { | 477 { |
| 519 if (hasTerminatedPeer()) | 478 if (hasTerminatedPeer()) |
| 520 return; | 479 return; |
| 521 | 480 |
| 522 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); | 481 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::close, m_
peer, code, reason.isolatedCopy()))); |
| 523 } | 482 } |
| 524 | 483 |
| 525 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) | 484 void WorkerThreadableWebSocketChannel::Bridge::fail(const String& reason, Messag
eLevel level, const String& sourceURL, unsigned lineNumber) |
| 526 { | 485 { |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 565 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); | 524 m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::destroy,
m_peer))); |
| 566 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. | 525 // Peer::destroy() deletes m_peer and then m_syncHelper will be released. |
| 567 // We must not touch m_syncHelper any more. | 526 // We must not touch m_syncHelper any more. |
| 568 m_syncHelper = 0; | 527 m_syncHelper = 0; |
| 569 | 528 |
| 570 // We won't use this any more. | 529 // We won't use this any more. |
| 571 m_workerGlobalScope = nullptr; | 530 m_workerGlobalScope = nullptr; |
| 572 } | 531 } |
| 573 | 532 |
| 574 } // namespace WebCore | 533 } // namespace WebCore |
| OLD | NEW |