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 CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <queue>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/content_export.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/host_message_context.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/host/resource_host.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/proxy/resource_message_params.h"
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSocket.h"
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSocketClient.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ppapi {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StringVar;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Var;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ppapi
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RendererPpapiHost;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CONTENT_EXPORT PepperWebSocketHost
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ppapi::host::ResourceHost,
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      public NON_EXPORTED_BASE(::blink::WebSocketClient) {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PepperWebSocketHost(RendererPpapiHost* host,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               PP_Instance instance,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               PP_Resource resource);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PepperWebSocketHost();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int32_t OnResourceMessageReceived(
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const IPC::Message& msg,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ppapi::host::HostMessageContext* context) OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebSocketClient implementation.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void didConnect();
43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void didReceiveMessage(const blink::WebString& message);
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  virtual void didReceiveArrayBuffer(const blink::WebArrayBuffer& binaryData);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void didReceiveMessageError();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void didUpdateBufferedAmount(unsigned long buffered_amount);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void didStartClosingHandshake();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void didClose(unsigned long unhandled_buffered_amount,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        ClosingHandshakeCompletionStatus status,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        unsigned short code,
51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                        const blink::WebString& reason);
52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC message handlers.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t OnHostMsgConnect(ppapi::host::HostMessageContext* context,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::string& url,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::vector<std::string>& protocols);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t OnHostMsgClose(ppapi::host::HostMessageContext* context,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         int32_t code,
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const std::string& reason);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t OnHostMsgSendText(ppapi::host::HostMessageContext* context,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& message);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t OnHostMsgSendBinary(ppapi::host::HostMessageContext* context,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const std::vector<uint8_t>& message);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32_t OnHostMsgFail(ppapi::host::HostMessageContext* context,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& message);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Non-owning pointer.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RendererPpapiHost* renderer_ppapi_host_;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // IPC reply parameters.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::host::ReplyMessageContext connect_reply_;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ppapi::host::ReplyMessageContext close_reply_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The server URL to which this instance connects.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url_;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A flag to indicate if opening handshake is going on.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool connecting_;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A flag to indicate if client initiated closing handshake is performed.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initiating_close_;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A flag to indicate if server initiated closing handshake is performed.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool accepting_close_;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Becomes true if any error is detected. Incoming data will be disposed
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if this variable is true.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool error_was_received_;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps the WebKit side WebSocket object. This is used for calling WebKit
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // side functions via WebKit API.
93f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<blink::WebSocket> websocket_;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PepperWebSocketHost);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CONTENT_RENDERER_PEPPER_PEPPER_WEBSOCKET_HOST_H_
101