Home | History | Annotate | Download | only in proxy
      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
      3 // found in the LICENSE file.
      4 
      5 #ifndef PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
      6 #define PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
      7 
      8 #include <queue>
      9 
     10 #include "ppapi/c/ppb_websocket.h"
     11 #include "ppapi/proxy/plugin_resource.h"
     12 #include "ppapi/shared_impl/tracked_callback.h"
     13 #include "ppapi/thunk/ppb_websocket_api.h"
     14 
     15 namespace ppapi {
     16 
     17 class StringVar;
     18 class Var;
     19 
     20 namespace proxy {
     21 
     22 // This class contains protocol checks which doesn't affect security when it
     23 // run with untrusted code.
     24 class PPAPI_PROXY_EXPORT WebSocketResource
     25     : public PluginResource,
     26       public NON_EXPORTED_BASE(thunk::PPB_WebSocket_API) {
     27  public:
     28   WebSocketResource(Connection connection, PP_Instance instance);
     29   virtual ~WebSocketResource();
     30 
     31   // PluginResource implementation.
     32   virtual thunk::PPB_WebSocket_API* AsPPB_WebSocket_API() OVERRIDE;
     33 
     34   // PPB_WebSocket_API implementation.
     35   virtual int32_t Connect(const PP_Var& url,
     36                           const PP_Var protocols[],
     37                           uint32_t protocol_count,
     38                           scoped_refptr<TrackedCallback> callback) OVERRIDE;
     39   virtual int32_t Close(uint16_t code,
     40                         const PP_Var& reason,
     41                         scoped_refptr<TrackedCallback> callback) OVERRIDE;
     42   virtual int32_t ReceiveMessage(
     43       PP_Var* message,
     44       scoped_refptr<TrackedCallback> callback) OVERRIDE;
     45   virtual int32_t SendMessage(const PP_Var& message) OVERRIDE;
     46   virtual uint64_t GetBufferedAmount() OVERRIDE;
     47   virtual uint16_t GetCloseCode() OVERRIDE;
     48   virtual PP_Var GetCloseReason() OVERRIDE;
     49   virtual PP_Bool GetCloseWasClean() OVERRIDE;
     50   virtual PP_Var GetExtensions() OVERRIDE;
     51   virtual PP_Var GetProtocol() OVERRIDE;
     52   virtual PP_WebSocketReadyState GetReadyState() OVERRIDE;
     53   virtual PP_Var GetURL() OVERRIDE;
     54 
     55  private:
     56   // PluginResource override.
     57   virtual void OnReplyReceived(const ResourceMessageReplyParams& params,
     58                                const IPC::Message& msg) OVERRIDE;
     59 
     60   // IPC message handlers.
     61   void OnPluginMsgConnectReply(const ResourceMessageReplyParams& params,
     62                                const std::string& url,
     63                                const std::string& protocol);
     64   void OnPluginMsgCloseReply(const ResourceMessageReplyParams& params,
     65                              unsigned long buffered_amount,
     66                              bool was_clean,
     67                              unsigned short code,
     68                              const std::string& reason);
     69   void OnPluginMsgReceiveTextReply(const ResourceMessageReplyParams& params,
     70                                    const std::string& message);
     71   void OnPluginMsgReceiveBinaryReply(const ResourceMessageReplyParams& params,
     72                                      const std::vector<uint8_t>& message);
     73   void OnPluginMsgErrorReply(const ResourceMessageReplyParams& params);
     74   void OnPluginMsgBufferedAmountReply(const ResourceMessageReplyParams& params,
     75                                       unsigned long buffered_amount);
     76   void OnPluginMsgStateReply(const ResourceMessageReplyParams& params,
     77                              int32_t state);
     78   void OnPluginMsgClosedReply(const ResourceMessageReplyParams& params,
     79                               unsigned long buffered_amount,
     80                               bool was_clean,
     81                               unsigned short code,
     82                               const std::string& reason);
     83 
     84   // Picks up a received message and moves it to user receiving buffer. This
     85   // function is used in both ReceiveMessage for fast returning path, and
     86   // OnPluginMsgReceiveTextReply and OnPluginMsgReceiveBinaryReply for delayed
     87   // callback invocations.
     88   int32_t DoReceive();
     89 
     90   // Holds user callbacks to invoke later.
     91   scoped_refptr<TrackedCallback> connect_callback_;
     92   scoped_refptr<TrackedCallback> close_callback_;
     93   scoped_refptr<TrackedCallback> receive_callback_;
     94 
     95   // Represents readyState described in the WebSocket API specification. It can
     96   // be read via GetReadyState().
     97   PP_WebSocketReadyState state_;
     98 
     99   // Becomes true if any error is detected. Incoming data will be disposed
    100   // if this variable is true, then ReceiveMessage() returns PP_ERROR_FAILED
    101   // after returning all received data.
    102   bool error_was_received_;
    103 
    104   // Keeps a pointer to PP_Var which is provided via ReceiveMessage().
    105   // Received data will be copied to this PP_Var on ready.
    106   PP_Var* receive_callback_var_;
    107 
    108   // Keeps received data until ReceiveMessage() requests.
    109   std::queue<scoped_refptr<Var> > received_messages_;
    110 
    111   // Keeps empty string for functions to return empty string.
    112   scoped_refptr<StringVar> empty_string_;
    113 
    114   // Keeps the status code field of closing handshake. It can be read via
    115   // GetCloseCode().
    116   uint16_t close_code_;
    117 
    118   // Keeps the reason field of closing handshake. It can be read via
    119   // GetCloseReason().
    120   scoped_refptr<StringVar> close_reason_;
    121 
    122   // Becomes true when closing handshake is performed successfully. It can be
    123   // read via GetCloseWasClean().
    124   PP_Bool close_was_clean_;
    125 
    126   // Represents extensions described in the WebSocket API specification. It can
    127   // be read via GetExtensions().
    128   scoped_refptr<StringVar> extensions_;
    129 
    130   // Represents protocol described in the WebSocket API specification. It can be
    131   // read via GetProtocol().
    132   scoped_refptr<StringVar> protocol_;
    133 
    134   // Represents url described in the WebSocket API specification. It can be
    135   // read via GetURL().
    136   scoped_refptr<StringVar> url_;
    137 
    138   // Keeps the number of bytes of application data that have been queued using
    139   // SendMessage(). WebKit side implementation calculates the actual amount.
    140   // This is a cached value which is notified through a WebKit callback.
    141   // This value is used to calculate bufferedAmount in the WebSocket API
    142   // specification. The calculated value can be read via GetBufferedAmount().
    143   uint64_t buffered_amount_;
    144 
    145   // Keeps the number of bytes of application data that have been ignored
    146   // because the connection was already closed.
    147   // This value is used to calculate bufferedAmount in the WebSocket API
    148   // specification. The calculated value can be read via GetBufferedAmount().
    149   uint64_t buffered_amount_after_close_;
    150 
    151   DISALLOW_COPY_AND_ASSIGN(WebSocketResource);
    152 };
    153 
    154 }  // namespace proxy
    155 }  // namespace ppapi
    156 
    157 #endif  // PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
    158