1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_ 6 #define CHROME_BROWSER_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_ 7 #pragma once 8 9 #include "base/hash_tables.h" 10 #include "base/memory/ref_counted.h" 11 #include "chrome/browser/net/chrome_net_log.h" 12 #include "webkit/glue/resource_loader_bridge.h" 13 14 namespace net { 15 class URLRequest; 16 } // namespace net 17 18 class IOThread; 19 struct ResourceResponse; 20 21 // DevToolsNetLogObserver watches the NetLog event stream and collects the 22 // stuff that may be of interest to DevTools. Currently, this only includes 23 // actual HTTP/SPDY headers sent and received over the network. 24 // 25 // As DevToolsNetLogObserver shares live data with objects that live on the 26 // IO Thread, it must also reside on the IO Thread. Only OnAddEntry can be 27 // called from other threads. 28 class DevToolsNetLogObserver: public ChromeNetLog::ThreadSafeObserver { 29 typedef webkit_glue::ResourceDevToolsInfo ResourceInfo; 30 31 public: 32 // ThreadSafeObserver implementation: 33 virtual void OnAddEntry(net::NetLog::EventType type, 34 const base::TimeTicks& time, 35 const net::NetLog::Source& source, 36 net::NetLog::EventPhase phase, 37 net::NetLog::EventParameters* params); 38 39 void OnAddURLRequestEntry(net::NetLog::EventType type, 40 const base::TimeTicks& time, 41 const net::NetLog::Source& source, 42 net::NetLog::EventPhase phase, 43 net::NetLog::EventParameters* params); 44 45 void OnAddHTTPStreamJobEntry(net::NetLog::EventType type, 46 const base::TimeTicks& time, 47 const net::NetLog::Source& source, 48 net::NetLog::EventPhase phase, 49 net::NetLog::EventParameters* params); 50 51 void OnAddSocketEntry(net::NetLog::EventType type, 52 const base::TimeTicks& time, 53 const net::NetLog::Source& source, 54 net::NetLog::EventPhase phase, 55 net::NetLog::EventParameters* params); 56 57 static void Attach(IOThread* thread); 58 static void Detach(); 59 60 // Must be called on the IO thread. May return NULL if no observers 61 // are active. 62 static DevToolsNetLogObserver* GetInstance(); 63 static void PopulateResponseInfo(net::URLRequest*, ResourceResponse*); 64 static int GetAndResetEncodedDataLength(net::URLRequest* request); 65 66 private: 67 static DevToolsNetLogObserver* instance_; 68 69 explicit DevToolsNetLogObserver(ChromeNetLog* chrome_net_log); 70 ~DevToolsNetLogObserver(); 71 72 ResourceInfo* GetResourceInfo(uint32 id); 73 74 ChromeNetLog* chrome_net_log_; 75 typedef base::hash_map<uint32, scoped_refptr<ResourceInfo> > RequestToInfoMap; 76 typedef base::hash_map<uint32, int> RequestToEncodedDataLengthMap; 77 typedef base::hash_map<uint32, uint32> HTTPStreamJobToSocketMap; 78 typedef base::hash_map<uint32, uint32> SocketToRequestMap; 79 RequestToInfoMap request_to_info_; 80 RequestToEncodedDataLengthMap request_to_encoded_data_length_; 81 HTTPStreamJobToSocketMap http_stream_job_to_socket_; 82 SocketToRequestMap socket_to_request_; 83 84 DISALLOW_COPY_AND_ASSIGN(DevToolsNetLogObserver); 85 }; 86 87 #endif // CHROME_BROWSER_DEBUGGER_DEVTOOLS_NETLOG_OBSERVER_H_ 88