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