| Index: ppapi/proxy/websocket_resource.h | 
| diff --git a/ppapi/proxy/websocket_resource.h b/ppapi/proxy/websocket_resource.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..49353e4b0b557ac500d6a739630355c53480ae28 | 
| --- /dev/null | 
| +++ b/ppapi/proxy/websocket_resource.h | 
| @@ -0,0 +1,157 @@ | 
| +// 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. | 
| + | 
| +#ifndef PPAPI_PROXY_WEBSOCKET_RESOURCE_H_ | 
| +#define PPAPI_PROXY_WEBSOCKET_RESOURCE_H_ | 
| + | 
| +#include <queue> | 
| + | 
| +#include "ppapi/c/ppb_websocket.h" | 
| +#include "ppapi/proxy/plugin_resource.h" | 
| +#include "ppapi/shared_impl/tracked_callback.h" | 
| +#include "ppapi/thunk/ppb_websocket_api.h" | 
| + | 
| +namespace ppapi { | 
| + | 
| +class StringVar; | 
| +class Var; | 
| + | 
| +namespace proxy { | 
| + | 
| +// This class contains protocol checks which doesn't affect security when it | 
| +// run with untrusted code. | 
| +class PPAPI_PROXY_EXPORT WebSocketResource | 
| +    : public PluginResource, | 
| +      public NON_EXPORTED_BASE(thunk::PPB_WebSocket_API) { | 
| + public: | 
| +  WebSocketResource(Connection connection, PP_Instance instance); | 
| +  virtual ~WebSocketResource(); | 
| + | 
| +  // PluginResource implementation. | 
| +  virtual thunk::PPB_WebSocket_API* AsPPB_WebSocket_API() OVERRIDE; | 
| + | 
| +  // PPB_WebSocket_API implementation. | 
| +  virtual int32_t Connect(const PP_Var& url, | 
| +                          const PP_Var protocols[], | 
| +                          uint32_t protocol_count, | 
| +                          scoped_refptr<TrackedCallback> callback) OVERRIDE; | 
| +  virtual int32_t Close(uint16_t code, | 
| +                        const PP_Var& reason, | 
| +                        scoped_refptr<TrackedCallback> callback) OVERRIDE; | 
| +  virtual int32_t ReceiveMessage( | 
| +      PP_Var* message, | 
| +      scoped_refptr<TrackedCallback> callback) OVERRIDE; | 
| +  virtual int32_t SendMessage(const PP_Var& message) OVERRIDE; | 
| +  virtual uint64_t GetBufferedAmount() OVERRIDE; | 
| +  virtual uint16_t GetCloseCode() OVERRIDE; | 
| +  virtual PP_Var GetCloseReason() OVERRIDE; | 
| +  virtual PP_Bool GetCloseWasClean() OVERRIDE; | 
| +  virtual PP_Var GetExtensions() OVERRIDE; | 
| +  virtual PP_Var GetProtocol() OVERRIDE; | 
| +  virtual PP_WebSocketReadyState GetReadyState() OVERRIDE; | 
| +  virtual PP_Var GetURL() OVERRIDE; | 
| + | 
| + private: | 
| +  // PluginResource override. | 
| +  virtual void OnReplyReceived(const ResourceMessageReplyParams& params, | 
| +                               const IPC::Message& msg) OVERRIDE; | 
| + | 
| +  // IPC message handlers. | 
| +  void OnPluginMsgConnectReply(const ResourceMessageReplyParams& params, | 
| +                               const std::string& url, | 
| +                               const std::string& protocol); | 
| +  void OnPluginMsgCloseReply(const ResourceMessageReplyParams& params, | 
| +                             unsigned long buffered_amount, | 
| +                             bool was_clean, | 
| +                             unsigned short code, | 
| +                             const std::string& reason); | 
| +  void OnPluginMsgReceiveTextReply(const ResourceMessageReplyParams& params, | 
| +                                   const std::string& message); | 
| +  void OnPluginMsgReceiveBinaryReply(const ResourceMessageReplyParams& params, | 
| +                                     const std::vector<uint8_t>& message); | 
| +  void OnPluginMsgErrorReply(const ResourceMessageReplyParams& params); | 
| +  void OnPluginMsgBufferedAmountReply(const ResourceMessageReplyParams& params, | 
| +                                      unsigned long buffered_amount); | 
| +  void OnPluginMsgStateReply(const ResourceMessageReplyParams& params, | 
| +                             int32_t state); | 
| +  void OnPluginMsgClosedReply(const ResourceMessageReplyParams& params, | 
| +                              unsigned long buffered_amount, | 
| +                              bool was_clean, | 
| +                              unsigned short code, | 
| +                              const std::string& reason); | 
| + | 
| +  // Picks up a received message and moves it to user receiving buffer. This | 
| +  // function is used in both ReceiveMessage for fast returning path, and | 
| +  // OnPluginMsgReceiveTextReply and OnPluginMsgReceiveBinaryReply for delayed | 
| +  // callback invocations. | 
| +  int32_t DoReceive(); | 
| + | 
| +  // Holds user callbacks to invoke later. | 
| +  scoped_refptr<TrackedCallback> connect_callback_; | 
| +  scoped_refptr<TrackedCallback> close_callback_; | 
| +  scoped_refptr<TrackedCallback> receive_callback_; | 
| + | 
| +  // Represents readyState described in the WebSocket API specification. It can | 
| +  // be read via GetReadyState(). | 
| +  PP_WebSocketReadyState state_; | 
| + | 
| +  // Becomes true if any error is detected. Incoming data will be disposed | 
| +  // if this variable is true, then ReceiveMessage() returns PP_ERROR_FAILED | 
| +  // after returning all received data. | 
| +  bool error_was_received_; | 
| + | 
| +  // Keeps a pointer to PP_Var which is provided via ReceiveMessage(). | 
| +  // Received data will be copied to this PP_Var on ready. | 
| +  PP_Var* receive_callback_var_; | 
| + | 
| +  // Keeps received data until ReceiveMessage() requests. | 
| +  std::queue<scoped_refptr<Var> > received_messages_; | 
| + | 
| +  // Keeps empty string for functions to return empty string. | 
| +  scoped_refptr<StringVar> empty_string_; | 
| + | 
| +  // Keeps the status code field of closing handshake. It can be read via | 
| +  // GetCloseCode(). | 
| +  uint16_t close_code_; | 
| + | 
| +  // Keeps the reason field of closing handshake. It can be read via | 
| +  // GetCloseReason(). | 
| +  scoped_refptr<StringVar> close_reason_; | 
| + | 
| +  // Becomes true when closing handshake is performed successfully. It can be | 
| +  // read via GetCloseWasClean(). | 
| +  PP_Bool close_was_clean_; | 
| + | 
| +  // Represents extensions described in the WebSocket API specification. It can | 
| +  // be read via GetExtensions(). | 
| +  scoped_refptr<StringVar> extensions_; | 
| + | 
| +  // Represents protocol described in the WebSocket API specification. It can be | 
| +  // read via GetProtocol(). | 
| +  scoped_refptr<StringVar> protocol_; | 
| + | 
| +  // Represents url described in the WebSocket API specification. It can be | 
| +  // read via GetURL(). | 
| +  scoped_refptr<StringVar> url_; | 
| + | 
| +  // Keeps the number of bytes of application data that have been queued using | 
| +  // SendMessage(). WebKit side implementation calculates the actual amount. | 
| +  // This is a cached value which is notified through a WebKit callback. | 
| +  // This value is used to calculate bufferedAmount in the WebSocket API | 
| +  // specification. The calculated value can be read via GetBufferedAmount(). | 
| +  uint64_t buffered_amount_; | 
| + | 
| +  // Keeps the number of bytes of application data that have been ignored | 
| +  // because the connection was already closed. | 
| +  // This value is used to calculate bufferedAmount in the WebSocket API | 
| +  // specification. The calculated value can be read via GetBufferedAmount(). | 
| +  uint64_t buffered_amount_after_close_; | 
| + | 
| +  DISALLOW_COPY_AND_ASSIGN(WebSocketResource); | 
| +}; | 
| + | 
| +}  // namespace proxy | 
| +}  // namespace ppapi | 
| + | 
| +#endif  // PPAPI_PROXY_WEBSOCKET_RESOURCE_H_ | 
|  |