// Copyright (c) 2012 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_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_ #define CONTENT_BROWSER_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_ #include "base/hash_tables.h" #include "base/memory/ref_counted.h" #include "net/base/net_log.h" #include "webkit/glue/resource_loader_bridge.h" namespace net { class URLRequest; } // namespace net namespace content { struct ResourceResponse; // DevToolsNetLogObserver watches the NetLog event stream and collects the // stuff that may be of interest to DevTools. Currently, this only includes // actual HTTP/SPDY headers sent and received over the network. // // As DevToolsNetLogObserver shares live data with objects that live on the // IO Thread, it must also reside on the IO Thread. Only OnAddEntry can be // called from other threads. class DevToolsNetLogObserver : public net::NetLog::ThreadSafeObserver { typedef webkit_glue::ResourceDevToolsInfo ResourceInfo; public: // net::NetLog::ThreadSafeObserver implementation: virtual void OnAddEntry(const net::NetLog::Entry& entry) OVERRIDE; void OnAddURLRequestEntry(const net::NetLog::Entry& entry); void OnAddHTTPStreamJobEntry(const net::NetLog::Entry& entry); void OnAddSocketEntry(const net::NetLog::Entry& entry); static void Attach(); static void Detach(); // Must be called on the IO thread. May return NULL if no observers // are active. static DevToolsNetLogObserver* GetInstance(); static void PopulateResponseInfo(net::URLRequest*, ResourceResponse*); static int GetAndResetEncodedDataLength(net::URLRequest* request); private: static DevToolsNetLogObserver* instance_; DevToolsNetLogObserver(); virtual ~DevToolsNetLogObserver(); ResourceInfo* GetResourceInfo(uint32 id); typedef base::hash_map > RequestToInfoMap; typedef base::hash_map RequestToEncodedDataLengthMap; typedef base::hash_map HTTPStreamJobToSocketMap; typedef base::hash_map SocketToRequestMap; RequestToInfoMap request_to_info_; RequestToEncodedDataLengthMap request_to_encoded_data_length_; HTTPStreamJobToSocketMap http_stream_job_to_socket_; SocketToRequestMap socket_to_request_; DISALLOW_COPY_AND_ASSIGN(DevToolsNetLogObserver); }; } // namespace content #endif // CONTENT_BROWSER_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_