| Index: webkit/plugins/ppapi/ppb_websocket_impl.cc | 
| diff --git a/webkit/plugins/ppapi/ppb_websocket_impl.cc b/webkit/plugins/ppapi/ppb_websocket_impl.cc | 
| deleted file mode 100644 | 
| index 2893fea23676cb84d77fd357ad72e7b1149419f8..0000000000000000000000000000000000000000 | 
| --- a/webkit/plugins/ppapi/ppb_websocket_impl.cc | 
| +++ /dev/null | 
| @@ -1,538 +0,0 @@ | 
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| -// Use of this source code is governed by a BSD-style license that can be | 
| -// found in the LICENSE file. | 
| - | 
| -#include "webkit/plugins/ppapi/ppb_websocket_impl.h" | 
| - | 
| -#include <set> | 
| -#include <string> | 
| - | 
| -#include "base/basictypes.h" | 
| -#include "googleurl/src/gurl.h" | 
| -#include "net/base/net_util.h" | 
| -#include "ppapi/c/pp_completion_callback.h" | 
| -#include "ppapi/c/pp_errors.h" | 
| -#include "ppapi/c/pp_var.h" | 
| -#include "ppapi/c/ppb_var.h" | 
| -#include "ppapi/c/ppb_var_array_buffer.h" | 
| -#include "ppapi/shared_impl/var.h" | 
| -#include "ppapi/shared_impl/var_tracker.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURL.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebArrayBuffer.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" | 
| -#include "third_party/WebKit/Source/WebKit/chromium/public/WebSocket.h" | 
| -#include "webkit/plugins/ppapi/host_array_buffer_var.h" | 
| -#include "webkit/plugins/ppapi/host_globals.h" | 
| -#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 
| -#include "webkit/plugins/ppapi/resource_helper.h" | 
| - | 
| -using ppapi::ArrayBufferVar; | 
| -using ppapi::PpapiGlobals; | 
| -using ppapi::StringVar; | 
| -using ppapi::thunk::PPB_WebSocket_API; | 
| -using ppapi::TrackedCallback; | 
| -using ppapi::Var; | 
| -using ppapi::VarTracker; | 
| -using WebKit::WebArrayBuffer; | 
| -using WebKit::WebDocument; | 
| -using WebKit::WebString; | 
| -using WebKit::WebSocket; | 
| -using WebKit::WebSocketClient; | 
| -using WebKit::WebURL; | 
| - | 
| -const uint32_t kMaxReasonSizeInBytes = 123; | 
| -const size_t kHybiBaseFramingOverhead = 2; | 
| -const size_t kHybiMaskingKeyLength = 4; | 
| -const size_t kMinimumPayloadSizeWithTwoByteExtendedPayloadLength = 126; | 
| -const size_t kMinimumPayloadSizeWithEightByteExtendedPayloadLength = 0x10000; | 
| - | 
| -namespace { | 
| - | 
| -uint64_t SaturateAdd(uint64_t a, uint64_t b) { | 
| -  if (kuint64max - a < b) | 
| -    return kuint64max; | 
| -  return a + b; | 
| -} | 
| - | 
| -uint64_t GetFrameSize(uint64_t payload_size) { | 
| -  uint64_t overhead = kHybiBaseFramingOverhead + kHybiMaskingKeyLength; | 
| -  if (payload_size > kMinimumPayloadSizeWithEightByteExtendedPayloadLength) | 
| -    overhead += 8; | 
| -  else if (payload_size > kMinimumPayloadSizeWithTwoByteExtendedPayloadLength) | 
| -    overhead += 2; | 
| -  return SaturateAdd(payload_size, overhead); | 
| -} | 
| - | 
| -bool InValidStateToReceive(PP_WebSocketReadyState state) { | 
| -  return state == PP_WEBSOCKETREADYSTATE_OPEN || | 
| -      state == PP_WEBSOCKETREADYSTATE_CLOSING; | 
| -} | 
| - | 
| -}  // namespace | 
| - | 
| -namespace webkit { | 
| -namespace ppapi { | 
| - | 
| -PPB_WebSocket_Impl::PPB_WebSocket_Impl(PP_Instance instance) | 
| -    : Resource(::ppapi::OBJECT_IS_IMPL, instance), | 
| -      state_(PP_WEBSOCKETREADYSTATE_INVALID), | 
| -      error_was_received_(false), | 
| -      receive_callback_var_(NULL), | 
| -      wait_for_receive_(false), | 
| -      close_code_(0), | 
| -      close_was_clean_(PP_FALSE), | 
| -      empty_string_(new StringVar("", 0)), | 
| -      buffered_amount_(0), | 
| -      buffered_amount_after_close_(0) { | 
| -} | 
| - | 
| -PPB_WebSocket_Impl::~PPB_WebSocket_Impl() { | 
| -  if (websocket_.get()) | 
| -    websocket_->disconnect(); | 
| -} | 
| - | 
| -// static | 
| -PP_Resource PPB_WebSocket_Impl::Create(PP_Instance instance) { | 
| -  scoped_refptr<PPB_WebSocket_Impl> ws(new PPB_WebSocket_Impl(instance)); | 
| -  return ws->GetReference(); | 
| -} | 
| - | 
| -PPB_WebSocket_API* PPB_WebSocket_Impl::AsPPB_WebSocket_API() { | 
| -  return this; | 
| -} | 
| - | 
| -int32_t PPB_WebSocket_Impl::Connect(PP_Var url, | 
| -                                    const PP_Var protocols[], | 
| -                                    uint32_t protocol_count, | 
| -                                    scoped_refptr<TrackedCallback> callback) { | 
| -  // Check mandatory interfaces. | 
| -  PluginInstance* plugin_instance = ResourceHelper::GetPluginInstance(this); | 
| -  DCHECK(plugin_instance); | 
| -  if (!plugin_instance) | 
| -    return PP_ERROR_FAILED; | 
| - | 
| -  // Connect() can be called at most once. | 
| -  if (websocket_.get()) | 
| -    return PP_ERROR_INPROGRESS; | 
| -  if (state_ != PP_WEBSOCKETREADYSTATE_INVALID) | 
| -    return PP_ERROR_INPROGRESS; | 
| -  state_ = PP_WEBSOCKETREADYSTATE_CLOSED; | 
| - | 
| -  // Validate url and convert it to WebURL. | 
| -  scoped_refptr<StringVar> url_string = StringVar::FromPPVar(url); | 
| -  if (!url_string) | 
| -    return PP_ERROR_BADARGUMENT; | 
| -  GURL gurl(url_string->value()); | 
| -  url_ = new StringVar(gurl.spec()); | 
| -  if (!gurl.is_valid()) | 
| -    return PP_ERROR_BADARGUMENT; | 
| -  if (!gurl.SchemeIs("ws") && !gurl.SchemeIs("wss")) | 
| -    return PP_ERROR_BADARGUMENT; | 
| -  if (gurl.has_ref()) | 
| -    return PP_ERROR_BADARGUMENT; | 
| -  if (!net::IsPortAllowedByDefault(gurl.IntPort())) | 
| -    return PP_ERROR_BADARGUMENT; | 
| -  WebURL web_url(gurl); | 
| - | 
| -  // Validate protocols and convert it to WebString. | 
| -  std::string protocol_string; | 
| -  std::set<std::string> protocol_set; | 
| -  for (uint32_t i = 0; i < protocol_count; i++) { | 
| -    // TODO(toyoshim): Similar function exist in WebKit::WebSocket. | 
| -    // We must rearrange them into WebKit::WebChannel and share its protocol | 
| -    // related implementation via WebKit API. | 
| -    scoped_refptr<StringVar> protocol(StringVar::FromPPVar(protocols[i])); | 
| - | 
| -    // Check invalid and empty entries. | 
| -    if (!protocol || !protocol->value().length()) | 
| -      return PP_ERROR_BADARGUMENT; | 
| - | 
| -    // Check duplicated protocol entries. | 
| -    if (protocol_set.find(protocol->value()) != protocol_set.end()) | 
| -      return PP_ERROR_BADARGUMENT; | 
| -    protocol_set.insert(protocol->value()); | 
| - | 
| -    // Check containing characters. | 
| -    for (std::string::const_iterator it = protocol->value().begin(); | 
| -        it != protocol->value().end(); | 
| -        ++it) { | 
| -      uint8_t character = *it; | 
| -      // WebSocket specification says "(Subprotocol string must consist of) | 
| -      // characters in the range U+0021 to U+007E not including separator | 
| -      // characters as defined in [RFC2616]." | 
| -      const uint8_t minimumProtocolCharacter = '!';  // U+0021. | 
| -      const uint8_t maximumProtocolCharacter = '~';  // U+007E. | 
| -      if (character < minimumProtocolCharacter || | 
| -          character > maximumProtocolCharacter || | 
| -          character == '"' || character == '(' || character == ')' || | 
| -          character == ',' || character == '/' || | 
| -          (character >= ':' && character <= '@') ||  // U+003A - U+0040 | 
| -          (character >= '[' && character <= ']') ||  // U+005B - u+005D | 
| -          character == '{' || character == '}') | 
| -        return PP_ERROR_BADARGUMENT; | 
| -    } | 
| -    // Join protocols with the comma separator. | 
| -    if (i != 0) | 
| -      protocol_string.append(","); | 
| -    protocol_string.append(protocol->value()); | 
| -  } | 
| -  WebString web_protocols = WebString::fromUTF8(protocol_string); | 
| - | 
| -  // Create WebKit::WebSocket object and connect. | 
| -  WebDocument document = plugin_instance->container()->element().document(); | 
| -  websocket_.reset(WebSocket::create(document, this)); | 
| -  DCHECK(websocket_.get()); | 
| -  if (!websocket_.get()) | 
| -    return PP_ERROR_NOTSUPPORTED; | 
| - | 
| -  // Set receiving binary object type. | 
| -  websocket_->setBinaryType(WebSocket::BinaryTypeArrayBuffer); | 
| - | 
| -  websocket_->connect(web_url, web_protocols); | 
| -  state_ = PP_WEBSOCKETREADYSTATE_CONNECTING; | 
| - | 
| -  // Install callback. | 
| -  connect_callback_ = callback; | 
| - | 
| -  return PP_OK_COMPLETIONPENDING; | 
| -} | 
| - | 
| -int32_t PPB_WebSocket_Impl::Close(uint16_t code, | 
| -                                  PP_Var reason, | 
| -                                  scoped_refptr<TrackedCallback> callback) { | 
| -  // Check mandarory interfaces. | 
| -  if (!websocket_.get()) | 
| -    return PP_ERROR_FAILED; | 
| - | 
| -  // Validate |code| and |reason|. | 
| -  scoped_refptr<StringVar> reason_string; | 
| -  WebString web_reason; | 
| -  WebSocket::CloseEventCode event_code = | 
| -      static_cast<WebSocket::CloseEventCode>(code); | 
| -  if (code == PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED) { | 
| -    // PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED and CloseEventCodeNotSpecified are | 
| -    // assigned to different values. A conversion is needed if | 
| -    // PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED is specified. | 
| -    event_code = WebSocket::CloseEventCodeNotSpecified; | 
| -  } else { | 
| -    if (!(code == PP_WEBSOCKETSTATUSCODE_NORMAL_CLOSURE || | 
| -        (PP_WEBSOCKETSTATUSCODE_USER_REGISTERED_MIN <= code && | 
| -        code <= PP_WEBSOCKETSTATUSCODE_USER_PRIVATE_MAX))) | 
| -      // RFC 6455 limits applications to use reserved connection close code in | 
| -      // section 7.4.2.. The WebSocket API (http://www.w3.org/TR/websockets/) | 
| -      // defines this out of range error as InvalidAccessError in JavaScript. | 
| -      return PP_ERROR_NOACCESS; | 
| - | 
| -    // |reason| must be ignored if it is PP_VARTYPE_UNDEFINED or |code| is | 
| -    // PP_WEBSOCKETSTATUSCODE_NOT_SPECIFIED. | 
| -    if (reason.type != PP_VARTYPE_UNDEFINED) { | 
| -      // Validate |reason|. | 
| -      reason_string = StringVar::FromPPVar(reason); | 
| -      if (!reason_string || | 
| -          reason_string->value().size() > kMaxReasonSizeInBytes) | 
| -        return PP_ERROR_BADARGUMENT; | 
| -      web_reason = WebString::fromUTF8(reason_string->value()); | 
| -    } | 
| -  } | 
| - | 
| -  // Check state. | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CLOSING) | 
| -    return PP_ERROR_INPROGRESS; | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED) | 
| -    return PP_OK; | 
| - | 
| -  // Install |callback|. | 
| -  close_callback_ = callback; | 
| - | 
| -  // Abort ongoing connect. | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CONNECTING) { | 
| -    state_ = PP_WEBSOCKETREADYSTATE_CLOSING; | 
| -    // Need to do a "Post" to avoid reentering the plugin. | 
| -    connect_callback_->PostAbort(); | 
| -    connect_callback_ = NULL; | 
| -    websocket_->fail( | 
| -        "WebSocket was closed before the connection was established."); | 
| -    return PP_OK_COMPLETIONPENDING; | 
| -  } | 
| - | 
| -  // Abort ongoing receive. | 
| -  if (wait_for_receive_) { | 
| -    wait_for_receive_ = false; | 
| -    receive_callback_var_ = NULL; | 
| - | 
| -    // Need to do a "Post" to avoid reentering the plugin. | 
| -    receive_callback_->PostAbort(); | 
| -    receive_callback_ = NULL; | 
| -  } | 
| - | 
| -  // Close connection. | 
| -  state_ = PP_WEBSOCKETREADYSTATE_CLOSING; | 
| -  websocket_->close(event_code, web_reason); | 
| - | 
| -  return PP_OK_COMPLETIONPENDING; | 
| -} | 
| - | 
| -int32_t PPB_WebSocket_Impl::ReceiveMessage( | 
| -    PP_Var* message, | 
| -    scoped_refptr<TrackedCallback> callback) { | 
| -  // Check state. | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_INVALID || | 
| -      state_ == PP_WEBSOCKETREADYSTATE_CONNECTING) | 
| -    return PP_ERROR_BADARGUMENT; | 
| - | 
| -  // Just return received message if any received message is queued. | 
| -  if (!received_messages_.empty()) { | 
| -    receive_callback_var_ = message; | 
| -    return DoReceive(); | 
| -  } | 
| - | 
| -  // Check state again. In CLOSED state, no more messages will be received. | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED) | 
| -    return PP_ERROR_BADARGUMENT; | 
| - | 
| -  // Returns PP_ERROR_FAILED after an error is received and received messages | 
| -  // is exhausted. | 
| -  if (error_was_received_) | 
| -    return PP_ERROR_FAILED; | 
| - | 
| -  // Or retain |message| as buffer to store and install |callback|. | 
| -  wait_for_receive_ = true; | 
| -  receive_callback_var_ = message; | 
| -  receive_callback_ = callback; | 
| - | 
| -  return PP_OK_COMPLETIONPENDING; | 
| -} | 
| - | 
| -int32_t PPB_WebSocket_Impl::SendMessage(PP_Var message) { | 
| -  // Check mandatory interfaces. | 
| -  if (!websocket_.get()) | 
| -    return PP_ERROR_FAILED; | 
| - | 
| -  // Check state. | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_INVALID || | 
| -      state_ == PP_WEBSOCKETREADYSTATE_CONNECTING) | 
| -    return PP_ERROR_BADARGUMENT; | 
| - | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CLOSING || | 
| -      state_ == PP_WEBSOCKETREADYSTATE_CLOSED) { | 
| -    // Handle buffered_amount_after_close_. | 
| -    uint64_t payload_size = 0; | 
| -    if (message.type == PP_VARTYPE_STRING) { | 
| -      scoped_refptr<StringVar> message_string = StringVar::FromPPVar(message); | 
| -      if (message_string) | 
| -        payload_size += message_string->value().length(); | 
| -    } else if (message.type == PP_VARTYPE_ARRAY_BUFFER) { | 
| -      scoped_refptr<ArrayBufferVar> message_array_buffer = | 
| -          ArrayBufferVar::FromPPVar(message); | 
| -      if (message_array_buffer) | 
| -        payload_size += message_array_buffer->ByteLength(); | 
| -    } else { | 
| -      // TODO(toyoshim): Support Blob. | 
| -      return PP_ERROR_NOTSUPPORTED; | 
| -    } | 
| - | 
| -    buffered_amount_after_close_ = | 
| -        SaturateAdd(buffered_amount_after_close_, GetFrameSize(payload_size)); | 
| - | 
| -    return PP_ERROR_FAILED; | 
| -  } | 
| - | 
| -  // Send the message. | 
| -  if (message.type == PP_VARTYPE_STRING) { | 
| -    // Convert message to WebString. | 
| -    scoped_refptr<StringVar> message_string = StringVar::FromPPVar(message); | 
| -    if (!message_string) | 
| -      return PP_ERROR_BADARGUMENT; | 
| -    WebString web_message = WebString::fromUTF8(message_string->value()); | 
| -    if (!websocket_->sendText(web_message)) | 
| -      return PP_ERROR_BADARGUMENT; | 
| -  } else if (message.type == PP_VARTYPE_ARRAY_BUFFER) { | 
| -    // Convert message to WebArrayBuffer. | 
| -    scoped_refptr<HostArrayBufferVar> host_message = | 
| -        static_cast<HostArrayBufferVar*>(ArrayBufferVar::FromPPVar(message)); | 
| -    if (!host_message) | 
| -      return PP_ERROR_BADARGUMENT; | 
| -    WebArrayBuffer& web_message = host_message->webkit_buffer(); | 
| -    if (!websocket_->sendArrayBuffer(web_message)) | 
| -      return PP_ERROR_BADARGUMENT; | 
| -  } else { | 
| -    // TODO(toyoshim): Support Blob. | 
| -    return PP_ERROR_NOTSUPPORTED; | 
| -  } | 
| - | 
| -  return PP_OK; | 
| -} | 
| - | 
| -uint64_t PPB_WebSocket_Impl::GetBufferedAmount() { | 
| -  return SaturateAdd(buffered_amount_, buffered_amount_after_close_); | 
| -} | 
| - | 
| -uint16_t PPB_WebSocket_Impl::GetCloseCode() { | 
| -  return close_code_; | 
| -} | 
| - | 
| -PP_Var PPB_WebSocket_Impl::GetCloseReason() { | 
| -  if (!close_reason_) | 
| -    return empty_string_->GetPPVar(); | 
| -  return close_reason_->GetPPVar(); | 
| -} | 
| - | 
| -PP_Bool PPB_WebSocket_Impl::GetCloseWasClean() { | 
| -  return close_was_clean_; | 
| -} | 
| - | 
| -PP_Var PPB_WebSocket_Impl::GetExtensions() { | 
| -  // Check mandatory interfaces. | 
| -  if (!websocket_.get()) | 
| -    return empty_string_->GetPPVar(); | 
| - | 
| -  std::string extensions = websocket_->extensions().utf8(); | 
| -  return StringVar::StringToPPVar(extensions); | 
| -} | 
| - | 
| -PP_Var PPB_WebSocket_Impl::GetProtocol() { | 
| -  // Check mandatory interfaces. | 
| -  if (!websocket_.get()) | 
| -    return empty_string_->GetPPVar(); | 
| - | 
| -  std::string protocol = websocket_->subprotocol().utf8(); | 
| -  return StringVar::StringToPPVar(protocol); | 
| -} | 
| - | 
| -PP_WebSocketReadyState PPB_WebSocket_Impl::GetReadyState() { | 
| -  return state_; | 
| -} | 
| - | 
| -PP_Var PPB_WebSocket_Impl::GetURL() { | 
| -  if (!url_) | 
| -    return empty_string_->GetPPVar(); | 
| -  return url_->GetPPVar(); | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didConnect() { | 
| -  DCHECK_EQ(PP_WEBSOCKETREADYSTATE_CONNECTING, state_); | 
| -  state_ = PP_WEBSOCKETREADYSTATE_OPEN; | 
| -  TrackedCallback::ClearAndRun(&connect_callback_, PP_OK); | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didReceiveMessage(const WebString& message) { | 
| -  // Dispose packets after receiving an error or in invalid state. | 
| -  if (error_was_received_ || !InValidStateToReceive(state_)) | 
| -    return; | 
| - | 
| -  // Append received data to queue. | 
| -  std::string string = message.utf8(); | 
| -  received_messages_.push(scoped_refptr<Var>(new StringVar(string))); | 
| - | 
| -  if (!wait_for_receive_) | 
| -    return; | 
| - | 
| -  TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didReceiveArrayBuffer( | 
| -    const WebArrayBuffer& binaryData) { | 
| -  // Dispose packets after receiving an error or in invalid state. | 
| -  if (error_was_received_ || !InValidStateToReceive(state_)) | 
| -    return; | 
| - | 
| -  // Append received data to queue. | 
| -  received_messages_.push( | 
| -      scoped_refptr<Var>(new HostArrayBufferVar(binaryData))); | 
| - | 
| -  if (!wait_for_receive_) | 
| -    return; | 
| - | 
| -  TrackedCallback::ClearAndRun(&receive_callback_, DoReceive()); | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didReceiveMessageError() { | 
| -  // Ignore error notification in invalid state. | 
| -  if (!InValidStateToReceive(state_)) | 
| -    return; | 
| - | 
| -  // Records the error, then stops receiving any frames after this error. | 
| -  // The error will be notified after all queued messages are read via | 
| -  // ReceiveMessage(). | 
| -  error_was_received_ = true; | 
| -  if (!wait_for_receive_) | 
| -    return; | 
| - | 
| -  // But, if no messages are queued and ReceiveMessage() is now on going. | 
| -  // We must invoke the callback with error code here. | 
| -  wait_for_receive_ = false; | 
| -  receive_callback_var_ = NULL; | 
| -  TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED); | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didUpdateBufferedAmount( | 
| -    unsigned long buffered_amount) { | 
| -  if (state_ == PP_WEBSOCKETREADYSTATE_CLOSED) | 
| -    return; | 
| -  buffered_amount_ = buffered_amount; | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didStartClosingHandshake() { | 
| -  state_ = PP_WEBSOCKETREADYSTATE_CLOSING; | 
| -} | 
| - | 
| -void PPB_WebSocket_Impl::didClose(unsigned long unhandled_buffered_amount, | 
| -                                  ClosingHandshakeCompletionStatus status, | 
| -                                  unsigned short code, | 
| -                                  const WebString& reason) { | 
| -  // Store code and reason. | 
| -  close_code_ = code; | 
| -  close_reason_ = new StringVar(reason.utf8()); | 
| - | 
| -  // Set close_was_clean_. | 
| -  bool was_clean = | 
| -      state_ == PP_WEBSOCKETREADYSTATE_CLOSING && | 
| -      !unhandled_buffered_amount && | 
| -      status == WebSocketClient::ClosingHandshakeComplete; | 
| -  close_was_clean_ = was_clean ? PP_TRUE : PP_FALSE; | 
| - | 
| -  // Update buffered_amount_. | 
| -  buffered_amount_ = unhandled_buffered_amount; | 
| - | 
| -  // Handle state transition and invoking callback. | 
| -  DCHECK_NE(PP_WEBSOCKETREADYSTATE_CLOSED, state_); | 
| -  PP_WebSocketReadyState state = state_; | 
| -  state_ = PP_WEBSOCKETREADYSTATE_CLOSED; | 
| - | 
| -  // User handlers may release WebSocket PP_Resource in the following | 
| -  // completion callbacks. Retain |this| here to assure that this object | 
| -  // keep on being valid in this function. | 
| -  scoped_refptr<PPB_WebSocket_Impl> retain_this(this); | 
| -  if (state == PP_WEBSOCKETREADYSTATE_CONNECTING) | 
| -    TrackedCallback::ClearAndRun(&connect_callback_, PP_ERROR_FAILED); | 
| - | 
| -  if (wait_for_receive_) { | 
| -    wait_for_receive_ = false; | 
| -    receive_callback_var_ = NULL; | 
| -    TrackedCallback::ClearAndRun(&receive_callback_, PP_ERROR_FAILED); | 
| -  } | 
| - | 
| -  if ((state == PP_WEBSOCKETREADYSTATE_CLOSING) && close_callback_.get()) | 
| -    TrackedCallback::ClearAndRun(&close_callback_, PP_OK); | 
| - | 
| -  // Disconnect. | 
| -  if (websocket_.get()) | 
| -    websocket_->disconnect(); | 
| -} | 
| - | 
| -int32_t PPB_WebSocket_Impl::DoReceive() { | 
| -  if (!receive_callback_var_) | 
| -    return PP_OK; | 
| - | 
| -  *receive_callback_var_ = received_messages_.front()->GetPPVar(); | 
| -  received_messages_.pop(); | 
| -  receive_callback_var_ = NULL; | 
| -  wait_for_receive_ = false; | 
| -  return PP_OK; | 
| -} | 
| - | 
| -}  // namespace ppapi | 
| -}  // namespace webkit | 
|  |