15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_websocket.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/plugin_resource.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/shared_impl/tracked_callback.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/thunk/ppb_websocket_api.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringVar;
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Var;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace proxy {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class contains protocol checks which doesn't affect security when it
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// run with untrusted code.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PPAPI_PROXY_EXPORT WebSocketResource
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public PluginResource,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public NON_EXPORTED_BASE(thunk::PPB_WebSocket_API) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebSocketResource(Connection connection, PP_Instance instance);
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~WebSocketResource();
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PluginResource implementation.
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual thunk::PPB_WebSocket_API* AsPPB_WebSocket_API() OVERRIDE;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PPB_WebSocket_API implementation.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t Connect(const PP_Var& url,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const PP_Var protocols[],
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          uint32_t protocol_count,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          scoped_refptr<TrackedCallback> callback) OVERRIDE;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t Close(uint16_t code,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const PP_Var& reason,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        scoped_refptr<TrackedCallback> callback) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t ReceiveMessage(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PP_Var* message,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scoped_refptr<TrackedCallback> callback) OVERRIDE;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t SendMessage(const PP_Var& message) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual uint64_t GetBufferedAmount() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual uint16_t GetCloseCode() OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Var GetCloseReason() OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Bool GetCloseWasClean() OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Var GetExtensions() OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Var GetProtocol() OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_WebSocketReadyState GetReadyState() OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual PP_Var GetURL() OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PluginResource override.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnReplyReceived(const ResourceMessageReplyParams& params,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const IPC::Message& msg) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC message handlers.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgConnectReply(const ResourceMessageReplyParams& params,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& url,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& protocol);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgCloseReply(const ResourceMessageReplyParams& params,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             unsigned long buffered_amount,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             bool was_clean,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             unsigned short code,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& reason);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgReceiveTextReply(const ResourceMessageReplyParams& params,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& message);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgReceiveBinaryReply(const ResourceMessageReplyParams& params,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::vector<uint8_t>& message);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgErrorReply(const ResourceMessageReplyParams& params);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgBufferedAmountReply(const ResourceMessageReplyParams& params,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      unsigned long buffered_amount);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgStateReply(const ResourceMessageReplyParams& params,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             int32_t state);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPluginMsgClosedReply(const ResourceMessageReplyParams& params,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              unsigned long buffered_amount,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool was_clean,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              unsigned short code,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::string& reason);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Picks up a received message and moves it to user receiving buffer. This
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // function is used in both ReceiveMessage for fast returning path, and
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // OnPluginMsgReceiveTextReply and OnPluginMsgReceiveBinaryReply for delayed
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callback invocations.
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t DoReceive();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Holds user callbacks to invoke later.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TrackedCallback> connect_callback_;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TrackedCallback> close_callback_;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<TrackedCallback> receive_callback_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents readyState described in the WebSocket API specification. It can
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be read via GetReadyState().
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_WebSocketReadyState state_;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Becomes true if any error is detected. Incoming data will be disposed
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if this variable is true, then ReceiveMessage() returns PP_ERROR_FAILED
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // after returning all received data.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool error_was_received_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps a pointer to PP_Var which is provided via ReceiveMessage().
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Received data will be copied to this PP_Var on ready.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Var* receive_callback_var_;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps received data until ReceiveMessage() requests.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::queue<scoped_refptr<Var> > received_messages_;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps empty string for functions to return empty string.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<StringVar> empty_string_;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps the status code field of closing handshake. It can be read via
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetCloseCode().
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16_t close_code_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps the reason field of closing handshake. It can be read via
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GetCloseReason().
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<StringVar> close_reason_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Becomes true when closing handshake is performed successfully. It can be
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read via GetCloseWasClean().
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Bool close_was_clean_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents extensions described in the WebSocket API specification. It can
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be read via GetExtensions().
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<StringVar> extensions_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents protocol described in the WebSocket API specification. It can be
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read via GetProtocol().
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<StringVar> protocol_;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Represents url described in the WebSocket API specification. It can be
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // read via GetURL().
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<StringVar> url_;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps the number of bytes of application data that have been queued using
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SendMessage(). WebKit side implementation calculates the actual amount.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a cached value which is notified through a WebKit callback.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This value is used to calculate bufferedAmount in the WebSocket API
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specification. The calculated value can be read via GetBufferedAmount().
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64_t buffered_amount_;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps the number of bytes of application data that have been ignored
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because the connection was already closed.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This value is used to calculate bufferedAmount in the WebSocket API
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specification. The calculated value can be read via GetBufferedAmount().
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint64_t buffered_amount_after_close_;
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(WebSocketResource);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace proxy
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // PPAPI_PROXY_WEBSOCKET_RESOURCE_H_
158