OLD | NEW |
| (Empty) |
1 // Copyright 2014 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 #include "net/base/trace_net_log_observer.h" | |
6 | |
7 #include <stdio.h> | |
8 | |
9 #include <string> | |
10 | |
11 #include "base/json/json_writer.h" | |
12 #include "base/logging.h" | |
13 #include "base/memory/scoped_ptr.h" | |
14 #include "base/trace_event/trace_event.h" | |
15 #include "base/values.h" | |
16 #include "net/base/net_log.h" | |
17 | |
18 namespace net { | |
19 | |
20 namespace { | |
21 | |
22 // TraceLog category for NetLog events. | |
23 const char kNetLogTracingCategory[] = TRACE_DISABLED_BY_DEFAULT("netlog"); | |
24 | |
25 class TracedValue : public base::trace_event::ConvertableToTraceFormat { | |
26 public: | |
27 explicit TracedValue(scoped_ptr<base::Value> value) : value_(value.Pass()) {} | |
28 | |
29 private: | |
30 ~TracedValue() override {} | |
31 | |
32 void AppendAsTraceFormat(std::string* out) const override { | |
33 if (value_) { | |
34 std::string tmp; | |
35 base::JSONWriter::Write(value_.get(), &tmp); | |
36 *out += tmp; | |
37 } else { | |
38 *out += "\"\""; | |
39 } | |
40 } | |
41 | |
42 private: | |
43 scoped_ptr<base::Value> value_; | |
44 }; | |
45 | |
46 } // namespace | |
47 | |
48 TraceNetLogObserver::TraceNetLogObserver() : net_log_to_watch_(NULL) { | |
49 } | |
50 | |
51 TraceNetLogObserver::~TraceNetLogObserver() { | |
52 DCHECK(!net_log_to_watch_); | |
53 DCHECK(!net_log()); | |
54 } | |
55 | |
56 void TraceNetLogObserver::OnAddEntry(const NetLog::Entry& entry) { | |
57 scoped_ptr<base::Value> params(entry.ParametersToValue()); | |
58 switch (entry.phase()) { | |
59 case NetLog::PHASE_BEGIN: | |
60 TRACE_EVENT_NESTABLE_ASYNC_BEGIN2( | |
61 kNetLogTracingCategory, NetLog::EventTypeToString(entry.type()), | |
62 entry.source().id, "source_type", | |
63 NetLog::SourceTypeToString(entry.source().type), "params", | |
64 scoped_refptr<base::trace_event::ConvertableToTraceFormat>( | |
65 new TracedValue(params.Pass()))); | |
66 break; | |
67 case NetLog::PHASE_END: | |
68 TRACE_EVENT_NESTABLE_ASYNC_END2( | |
69 kNetLogTracingCategory, NetLog::EventTypeToString(entry.type()), | |
70 entry.source().id, "source_type", | |
71 NetLog::SourceTypeToString(entry.source().type), "params", | |
72 scoped_refptr<base::trace_event::ConvertableToTraceFormat>( | |
73 new TracedValue(params.Pass()))); | |
74 break; | |
75 case NetLog::PHASE_NONE: | |
76 TRACE_EVENT_NESTABLE_ASYNC_INSTANT2( | |
77 kNetLogTracingCategory, NetLog::EventTypeToString(entry.type()), | |
78 entry.source().id, "source_type", | |
79 NetLog::SourceTypeToString(entry.source().type), "params", | |
80 scoped_refptr<base::trace_event::ConvertableToTraceFormat>( | |
81 new TracedValue(params.Pass()))); | |
82 break; | |
83 } | |
84 } | |
85 | |
86 void TraceNetLogObserver::WatchForTraceStart(NetLog* netlog) { | |
87 DCHECK(!net_log_to_watch_); | |
88 DCHECK(!net_log()); | |
89 net_log_to_watch_ = netlog; | |
90 base::trace_event::TraceLog::GetInstance()->AddEnabledStateObserver(this); | |
91 } | |
92 | |
93 void TraceNetLogObserver::StopWatchForTraceStart() { | |
94 // Should only stop if is currently watching. | |
95 DCHECK(net_log_to_watch_); | |
96 base::trace_event::TraceLog::GetInstance()->RemoveEnabledStateObserver(this); | |
97 if (net_log()) | |
98 net_log()->RemoveThreadSafeObserver(this); | |
99 net_log_to_watch_ = NULL; | |
100 } | |
101 | |
102 void TraceNetLogObserver::OnTraceLogEnabled() { | |
103 net_log_to_watch_->AddThreadSafeObserver(this, | |
104 NetLog::LOG_STRIP_PRIVATE_DATA); | |
105 } | |
106 | |
107 void TraceNetLogObserver::OnTraceLogDisabled() { | |
108 if (net_log()) | |
109 net_log()->RemoveThreadSafeObserver(this); | |
110 } | |
111 | |
112 } // namespace net | |
OLD | NEW |