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