1 // Copyright 2012 The Chromium Authors
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/log/test_net_log.h"
6
7 #include "base/synchronization/lock.h"
8 #include "base/values.h"
9 #include "net/log/net_log_capture_mode.h"
10 #include "net/log/net_log_entry.h"
11 #include "net/log/net_log_source.h"
12 #include "net/log/net_log_source_type.h"
13
14 namespace net {
15
RecordingNetLogObserver()16 RecordingNetLogObserver::RecordingNetLogObserver()
17 : RecordingNetLogObserver(NetLogCaptureMode::kIncludeSensitive) {}
18
RecordingNetLogObserver(NetLogCaptureMode capture_mode)19 RecordingNetLogObserver::RecordingNetLogObserver(NetLogCaptureMode capture_mode)
20 : RecordingNetLogObserver(NetLog::Get(), capture_mode) {}
21
RecordingNetLogObserver(NetLog * net_log,NetLogCaptureMode capture_mode)22 RecordingNetLogObserver::RecordingNetLogObserver(NetLog* net_log,
23 NetLogCaptureMode capture_mode)
24 : net_log_(net_log) {
25 net_log_->AddObserver(this, capture_mode);
26 }
27
~RecordingNetLogObserver()28 RecordingNetLogObserver::~RecordingNetLogObserver() {
29 net_log_->RemoveObserver(this);
30 }
31
GetEntries() const32 std::vector<NetLogEntry> RecordingNetLogObserver::GetEntries() const {
33 base::AutoLock lock(lock_);
34 std::vector<NetLogEntry> result;
35 for (const auto& entry : entry_list_)
36 result.push_back(entry.Clone());
37 return result;
38 }
39
GetEntriesForSource(NetLogSource source) const40 std::vector<NetLogEntry> RecordingNetLogObserver::GetEntriesForSource(
41 NetLogSource source) const {
42 base::AutoLock lock(lock_);
43 std::vector<NetLogEntry> result;
44 for (const auto& entry : entry_list_) {
45 if (entry.source.id == source.id)
46 result.push_back(entry.Clone());
47 }
48 return result;
49 }
50
GetEntriesWithType(NetLogEventType type) const51 std::vector<NetLogEntry> RecordingNetLogObserver::GetEntriesWithType(
52 NetLogEventType type) const {
53 base::AutoLock lock(lock_);
54 std::vector<NetLogEntry> result;
55 for (const auto& entry : entry_list_) {
56 if (entry.type == type)
57 result.push_back(entry.Clone());
58 }
59 return result;
60 }
61
GetEntriesForSourceWithType(NetLogSource source,NetLogEventType type,NetLogEventPhase phase) const62 std::vector<NetLogEntry> RecordingNetLogObserver::GetEntriesForSourceWithType(
63 NetLogSource source,
64 NetLogEventType type,
65 NetLogEventPhase phase) const {
66 base::AutoLock lock(lock_);
67 std::vector<NetLogEntry> result;
68 for (const auto& entry : entry_list_) {
69 if (entry.source.id == source.id && entry.type == type &&
70 entry.phase == phase) {
71 result.push_back(entry.Clone());
72 }
73 }
74 return result;
75 }
76
GetSize() const77 size_t RecordingNetLogObserver::GetSize() const {
78 base::AutoLock lock(lock_);
79 return entry_list_.size();
80 }
81
Clear()82 void RecordingNetLogObserver::Clear() {
83 base::AutoLock lock(lock_);
84 entry_list_.clear();
85 }
86
OnAddEntry(const NetLogEntry & entry)87 void RecordingNetLogObserver::OnAddEntry(const NetLogEntry& entry) {
88 base::Value::Dict params = entry.params.Clone();
89 base::RepeatingClosure add_entry_callback;
90 {
91 // Only need to acquire the lock when accessing class variables.
92 base::AutoLock lock(lock_);
93 entry_list_.emplace_back(entry.type, entry.source, entry.phase, entry.time,
94 std::move(params));
95 add_entry_callback = add_entry_callback_;
96 }
97 if (!add_entry_callback.is_null())
98 add_entry_callback.Run();
99 }
100
SetObserverCaptureMode(NetLogCaptureMode capture_mode)101 void RecordingNetLogObserver::SetObserverCaptureMode(
102 NetLogCaptureMode capture_mode) {
103 net_log_->RemoveObserver(this);
104 net_log_->AddObserver(this, capture_mode);
105 }
106
SetThreadsafeAddEntryCallback(base::RepeatingClosure add_entry_callback)107 void RecordingNetLogObserver::SetThreadsafeAddEntryCallback(
108 base::RepeatingClosure add_entry_callback) {
109 base::AutoLock lock(lock_);
110 add_entry_callback_ = add_entry_callback;
111 }
112
113 } // namespace net
114