14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file. 44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#ifndef CONTENT_BROWSER_RENDERER_HOST_WEBSOCKET_HOST_H_ 64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define CONTENT_BROWSER_RENDERER_HOST_WEBSOCKET_HOST_H_ 74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <string> 94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include <vector> 104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "content/common/content_export.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "content/common/websocket.h" 144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class GURL; 164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace url { 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class Origin; 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace url 20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace net { 224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class WebSocketChannel; 234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class URLRequestContext; 244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace net 254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace IPC { 274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class Message; 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace IPC 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace content { 314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class WebSocketDispatcherHost; 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// Host of net::WebSocketChannel. The lifetime of an instance of this class is 351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// completely controlled by the WebSocketDispatcherHost object. 368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class CONTENT_EXPORT WebSocketHost { 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public: 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebSocketHost(int routing_id, 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebSocketDispatcherHost* dispatcher, 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) net::URLRequestContext* url_request_context); 418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual ~WebSocketHost(); 424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The renderer process is going away. 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // This function is virtual for testing. 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void GoAway(); 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // General message dispatch. WebSocketDispatcherHost::OnMessageReceived 484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // delegates to this method after looking up the |routing_id|. 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message); 504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int routing_id() const { return routing_id_; } 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) private: 544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Handlers for each message type, dispatched by OnMessageReceived(), as 554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // defined in content/common/websocket_messages.h 564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnAddChannelRequest(const GURL& socket_url, 584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<std::string>& requested_protocols, 5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const url::Origin& origin, 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) int render_frame_id); 614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnSendFrame(bool fin, 634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) WebSocketMessageType type, 644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const std::vector<char>& data); 654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void OnFlowControl(int64 quota); 674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void OnDropChannel(bool was_clean, uint16 code, const std::string& reason); 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The channel we use to send events to the network. 714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) scoped_ptr<net::WebSocketChannel> channel_; 724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The WebSocketHostDispatcher that created this object. 7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) WebSocketDispatcherHost* const dispatcher_; 7546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // The URL request context for the channel. 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) net::URLRequestContext* const url_request_context_; 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The ID used to route messages. 8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int routing_id_; 814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(WebSocketHost); 834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)} // namespace content 864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif // CONTENT_BROWSER_RENDERER_HOST_WEBSOCKET_HOST_H_ 88