1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef NET_BASE_CAPTURING_NET_LOG_H_ 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define NET_BASE_CAPTURING_NET_LOG_H_ 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/atomicops.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/basictypes.h" 13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/synchronization/lock.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/base/net_log.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace net { 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingNetLog is an implementation of NetLog that saves messages to a 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bounded buffer. 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CapturingNetLog : public NetLog { 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch struct Entry { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Entry(EventType type, 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const base::TimeTicks& time, 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source source, 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventPhase phase, 30731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick EventParameters* extra_parameters); 31731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~Entry(); 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventType type; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::TimeTicks time; 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Source source; 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventPhase phase; 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<EventParameters> extra_parameters; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Ordered set of entries that were logged. 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch typedef std::vector<Entry> EntryList; 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch enum { kUnbounded = -1 }; 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Creates a CapturingNetLog that logs a maximum of |max_num_entries| 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // messages. 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch explicit CapturingNetLog(size_t max_num_entries); 48731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick virtual ~CapturingNetLog(); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Returns the list of all entries in the log. 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void GetEntries(EntryList* entry_list) const; 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void Clear(); 5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen void SetLogLevel(NetLog::LogLevel log_level); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // NetLog implementation: 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual void AddEntry(EventType type, 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const base::TimeTicks& time, 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const Source& source, 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventPhase phase, 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EventParameters* extra_parameters); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual uint32 NextID(); 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen virtual LogLevel GetLogLevel() const; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Needs to be "mutable" so can use it in GetEntries(). 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen mutable base::Lock lock_; 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Last assigned source ID. Incremented to get the next one. 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen base::subtle::Atomic32 last_id_; 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch size_t max_num_entries_; 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EntryList entries_; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen NetLog::LogLevel log_level_; 773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(CapturingNetLog); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper class that exposes a similar API as BoundNetLog, but uses a 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingNetLog rather than the more generic NetLog. 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CapturingBoundNetLog can easily be converted to a BoundNetLog using the 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// bound() method. 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass CapturingBoundNetLog { 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 88731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CapturingBoundNetLog(const NetLog::Source& source, CapturingNetLog* net_log); 89731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 90731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick explicit CapturingBoundNetLog(size_t max_num_entries); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ~CapturingBoundNetLog(); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The returned BoundNetLog is only valid while |this| is alive. 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BoundNetLog bound() const { 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return BoundNetLog(source_, capturing_net_log_.get()); 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 9921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Fills |entry_list| with all entries in the log. 10021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen void GetEntries(CapturingNetLog::EntryList* entry_list) const; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void Clear(); 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Sets the log level of the underlying CapturingNetLog. 1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen void SetLogLevel(NetLog::LogLevel log_level); 1063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NetLog::Source source_; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_ptr<CapturingNetLog> capturing_net_log_; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DISALLOW_COPY_AND_ASSIGN(CapturingBoundNetLog); 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace net 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif // NET_BASE_CAPTURING_NET_LOG_H_ 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 118