OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/plugins/ppapi/ppb_websocket_impl.h" | 5 #include "webkit/plugins/ppapi/ppb_websocket_impl.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
408 | 408 |
409 PP_Var PPB_WebSocket_Impl::GetURL() { | 409 PP_Var PPB_WebSocket_Impl::GetURL() { |
410 if (!url_) | 410 if (!url_) |
411 return empty_string_->GetPPVar(); | 411 return empty_string_->GetPPVar(); |
412 return url_->GetPPVar(); | 412 return url_->GetPPVar(); |
413 } | 413 } |
414 | 414 |
415 void PPB_WebSocket_Impl::didConnect() { | 415 void PPB_WebSocket_Impl::didConnect() { |
416 DCHECK_EQ(PP_WEBSOCKETREADYSTATE_CONNECTING, state_); | 416 DCHECK_EQ(PP_WEBSOCKETREADYSTATE_CONNECTING, state_); |
417 state_ = PP_WEBSOCKETREADYSTATE_OPEN; | 417 state_ = PP_WEBSOCKETREADYSTATE_OPEN; |
418 TrackedCallback::ClearAndRun(&connect_callback_, PP_OK); | 418 connect_callback_->Run(PP_OK); |
419 } | 419 } |
420 | 420 |
421 void PPB_WebSocket_Impl::didReceiveMessage(const WebString& message) { | 421 void PPB_WebSocket_Impl::didReceiveMessage(const WebString& message) { |
422 // Dispose packets after receiving an error or in invalid state. | 422 // Dispose packets after receiving an error or in invalid state. |
423 if (error_was_received_ || !InValidStateToReceive(state_)) | 423 if (error_was_received_ || !InValidStateToReceive(state_)) |
424 return; | 424 return; |
425 | 425 |
426 // Append received data to queue. | 426 // Append received data to queue. |
427 std::string string = message.utf8(); | 427 std::string string = message.utf8(); |
428 received_messages_.push(scoped_refptr<Var>(new StringVar(string))); | 428 received_messages_.push(scoped_refptr<Var>(new StringVar(string))); |
429 | 429 |
430 if (!wait_for_receive_) | 430 if (!wait_for_receive_) |
431 return; | 431 return; |
432 | 432 |
433 TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); | 433 receive_callback_->Run(DoReceive()); |
434 } | 434 } |
435 | 435 |
436 void PPB_WebSocket_Impl::didReceiveArrayBuffer( | 436 void PPB_WebSocket_Impl::didReceiveArrayBuffer( |
437 const WebArrayBuffer& binaryData) { | 437 const WebArrayBuffer& binaryData) { |
438 // Dispose packets after receiving an error or in invalid state. | 438 // Dispose packets after receiving an error or in invalid state. |
439 if (error_was_received_ || !InValidStateToReceive(state_)) | 439 if (error_was_received_ || !InValidStateToReceive(state_)) |
440 return; | 440 return; |
441 | 441 |
442 // Append received data to queue. | 442 // Append received data to queue. |
443 received_messages_.push( | 443 received_messages_.push( |
444 scoped_refptr<Var>(new HostArrayBufferVar(binaryData))); | 444 scoped_refptr<Var>(new HostArrayBufferVar(binaryData))); |
445 | 445 |
446 if (!wait_for_receive_) | 446 if (!wait_for_receive_) |
447 return; | 447 return; |
448 | 448 |
449 TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); | 449 receive_callback_->Run(DoReceive()); |
450 } | 450 } |
451 | 451 |
452 void PPB_WebSocket_Impl::didReceiveMessageError() { | 452 void PPB_WebSocket_Impl::didReceiveMessageError() { |
453 // Ignore error notification in invalid state. | 453 // Ignore error notification in invalid state. |
454 if (!InValidStateToReceive(state_)) | 454 if (!InValidStateToReceive(state_)) |
455 return; | 455 return; |
456 | 456 |
457 // Records the error, then stops receiving any frames after this error. | 457 // Records the error, then stops receiving any frames after this error. |
458 // The error will be notified after all queued messages are read via | 458 // The error will be notified after all queued messages are read via |
459 // ReceiveMessage(). | 459 // ReceiveMessage(). |
460 error_was_received_ = true; | 460 error_was_received_ = true; |
461 if (!wait_for_receive_) | 461 if (!wait_for_receive_) |
462 return; | 462 return; |
463 | 463 |
464 // But, if no messages are queued and ReceiveMessage() is now on going. | 464 // But, if no messages are queued and ReceiveMessage() is now on going. |
465 // We must invoke the callback with error code here. | 465 // We must invoke the callback with error code here. |
466 wait_for_receive_ = false; | 466 wait_for_receive_ = false; |
467 receive_callback_var_ = NULL; | 467 receive_callback_var_ = NULL; |
468 TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED); | 468 receive_callback_->Run(PP_ERROR_FAILED); |
469 } | 469 } |
470 | 470 |
471 void PPB_WebSocket_Impl::didUpdateBufferedAmount( | 471 void PPB_WebSocket_Impl::didUpdateBufferedAmount( |
472 unsigned long buffered_amount) { | 472 unsigned long buffered_amount) { |
473 if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED) | 473 if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED) |
474 return; | 474 return; |
475 buffered_amount_ = buffered_amount; | 475 buffered_amount_ = buffered_amount; |
476 } | 476 } |
477 | 477 |
478 void PPB_WebSocket_Impl::didStartClosingHandshake() { | 478 void PPB_WebSocket_Impl::didStartClosingHandshake() { |
(...skipping 21 matching lines...) Expand all Loading... |
500 // Handle state transition and invoking callback. | 500 // Handle state transition and invoking callback. |
501 DCHECK_NE(PP_WEBSOCKETREADYSTATE_CLOSED, state_); | 501 DCHECK_NE(PP_WEBSOCKETREADYSTATE_CLOSED, state_); |
502 PP_WebSocketReadyState state = state_; | 502 PP_WebSocketReadyState state = state_; |
503 state_ = PP_WEBSOCKETREADYSTATE_CLOSED; | 503 state_ = PP_WEBSOCKETREADYSTATE_CLOSED; |
504 | 504 |
505 // User handlers may release WebSocket PP_Resource in the following | 505 // User handlers may release WebSocket PP_Resource in the following |
506 // completion callbacks. Retain |this| here to assure that this object | 506 // completion callbacks. Retain |this| here to assure that this object |
507 // keep on being valid in this function. | 507 // keep on being valid in this function. |
508 scoped_refptr<PPB_WebSocket_Impl> retain_this(this); | 508 scoped_refptr<PPB_WebSocket_Impl> retain_this(this); |
509 if (state == PP_WEBSOCKETREADYSTATE_CONNECTING) | 509 if (state == PP_WEBSOCKETREADYSTATE_CONNECTING) |
510 TrackedCallback::ClearAndRun(&connect_callback_, PP_ERROR_FAILED); | 510 connect_callback_->Run(PP_ERROR_FAILED); |
511 | 511 |
512 if (wait_for_receive_) { | 512 if (wait_for_receive_) { |
513 wait_for_receive_ = false; | 513 wait_for_receive_ = false; |
514 receive_callback_var_ = NULL; | 514 receive_callback_var_ = NULL; |
515 TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED); | 515 receive_callback_->Run(PP_ERROR_FAILED); |
516 } | 516 } |
517 | 517 |
518 if ((state == PP_WEBSOCKETREADYSTATE_CLOSING) && close_callback_.get()) | 518 if ((state == PP_WEBSOCKETREADYSTATE_CLOSING) && close_callback_.get()) |
519 TrackedCallback::ClearAndRun(&close_callback_, PP_OK); | 519 close_callback_->Run(PP_OK); |
520 | 520 |
521 // Disconnect. | 521 // Disconnect. |
522 if (websocket_.get()) | 522 if (websocket_.get()) |
523 websocket_->disconnect(); | 523 websocket_->disconnect(); |
524 } | 524 } |
525 | 525 |
526 int32_t PPB_WebSocket_Impl::DoReceive() { | 526 int32_t PPB_WebSocket_Impl::DoReceive() { |
527 if (!receive_callback_var_) | 527 if (!receive_callback_var_) |
528 return PP_OK; | 528 return PP_OK; |
529 | 529 |
530 *receive_callback_var_ = received_messages_.front()->GetPPVar(); | 530 *receive_callback_var_ = received_messages_.front()->GetPPVar(); |
531 received_messages_.pop(); | 531 received_messages_.pop(); |
532 receive_callback_var_ = NULL; | 532 receive_callback_var_ = NULL; |
533 wait_for_receive_ = false; | 533 wait_for_receive_ = false; |
534 return PP_OK; | 534 return PP_OK; |
535 } | 535 } |
536 | 536 |
537 } // namespace ppapi | 537 } // namespace ppapi |
538 } // namespace webkit | 538 } // namespace webkit |
OLD | NEW |