• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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