• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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