// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CONTENT_BROWSER_WEBSOCKETS_WEBSOCKET_MANAGER_H_ #define CONTENT_BROWSER_WEBSOCKETS_WEBSOCKET_MANAGER_H_ #include #include "base/compiler_specific.h" #include "base/macros.h" #include "base/memory/ref_counted.h" #include "base/timer/timer.h" #include "content/browser/websockets/websocket_impl.h" #include "content/common/content_export.h" #include "net/url_request/url_request_context_getter.h" #include "net/url_request/url_request_context_getter_observer.h" namespace service_manager { struct BindSourceInfo; } namespace content { class StoragePartition; // The WebSocketManager is a per child process instance that manages the // lifecycle of WebSocketImpl objects. It is responsible for creating // WebSocketImpl objects for each WebSocketRequest and throttling the number of // WebSocketImpl objects in use. class CONTENT_EXPORT WebSocketManager : NON_EXPORTED_BASE(public WebSocketImpl::Delegate), NON_EXPORTED_BASE(public net::URLRequestContextGetterObserver) { public: // Called on the UI thread: static void CreateWebSocket( int process_id, int frame_id, const service_manager::BindSourceInfo& source_info, blink::mojom::WebSocketRequest request); // net::URLRequestContextGetterObserver implementation. void OnContextShuttingDown() override; protected: class Handle; friend class base::DeleteHelper; // Called on the UI thread: WebSocketManager(int process_id, StoragePartition* storage_partition); // All other methods must run on the IO thread. ~WebSocketManager() override; void DoCreateWebSocket(int frame_id, blink::mojom::WebSocketRequest request); base::TimeDelta CalculateDelay() const; void ThrottlingPeriodTimerCallback(); // This is virtual to support testing. virtual WebSocketImpl* CreateWebSocketImpl( WebSocketImpl::Delegate* delegate, blink::mojom::WebSocketRequest request, int child_id, int frame_id, base::TimeDelta delay); // WebSocketImpl::Delegate methods: int GetClientProcessId() override; StoragePartition* GetStoragePartition() override; void OnReceivedResponseFromServer(WebSocketImpl* impl) override; void OnLostConnectionToClient(WebSocketImpl* impl) override; void ObserveURLRequestContextGetter(); int process_id_; StoragePartition* storage_partition_; scoped_refptr url_request_context_getter_; std::set impls_; // Timer and counters for per-renderer WebSocket throttling. base::RepeatingTimer throttling_period_timer_; // The current number of pending connections. int num_pending_connections_; // The number of handshakes that failed in the current and previous time // period. int64_t num_current_succeeded_connections_; int64_t num_previous_succeeded_connections_; // The number of handshakes that succeeded in the current and previous time // period. int64_t num_current_failed_connections_; int64_t num_previous_failed_connections_; bool context_destroyed_; DISALLOW_COPY_AND_ASSIGN(WebSocketManager); }; } // namespace content #endif // CONTENT_BROWSER_WEBSOCKETS_WEBSOCKET_MANAGER_H_