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