chrome_net_log.cc revision 731df977c0511bca2206b5f333555b1205ff1f43
1// Copyright (c) 2010 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 "chrome/browser/net/chrome_net_log.h"
6
7#include <algorithm>
8
9#include "base/command_line.h"
10#include "base/logging.h"
11#include "base/string_util.h"
12#include "chrome/browser/browser_thread.h"
13#include "chrome/browser/net/load_timing_observer.h"
14#include "chrome/browser/net/net_log_logger.h"
15#include "chrome/browser/net/passive_log_collector.h"
16#include "chrome/common/chrome_switches.h"
17
18ChromeNetLog::Observer::Observer(LogLevel log_level) : log_level_(log_level) {}
19
20net::NetLog::LogLevel ChromeNetLog::Observer::log_level() const {
21  return log_level_;
22}
23
24void ChromeNetLog::Observer::set_log_level(net::NetLog::LogLevel log_level) {
25  log_level_ = log_level;
26}
27
28ChromeNetLog::ChromeNetLog()
29    : next_id_(1),
30      passive_collector_(new PassiveLogCollector),
31      load_timing_observer_(new LoadTimingObserver) {
32  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
33  AddObserver(passive_collector_.get());
34  AddObserver(load_timing_observer_.get());
35
36  const CommandLine& command_line = *CommandLine::ForCurrentProcess();
37  if (command_line.HasSwitch(switches::kLogNetLog)) {
38    net_log_logger_.reset(new NetLogLogger());
39    AddObserver(net_log_logger_.get());
40  }
41}
42
43ChromeNetLog::~ChromeNetLog() {
44  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
45  RemoveObserver(passive_collector_.get());
46  RemoveObserver(load_timing_observer_.get());
47  if (net_log_logger_.get()) {
48    RemoveObserver(net_log_logger_.get());
49  }
50}
51
52void ChromeNetLog::AddEntry(EventType type,
53                            const base::TimeTicks& time,
54                            const Source& source,
55                            EventPhase phase,
56                            EventParameters* params) {
57  // This must be invoked when we're on the IO thread, or if the IO thread's
58  // message loop isn't valid. The later can happen if this is invoked when the
59  // IOThread is shuting down the MessageLoop.
60  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO) ||
61         !BrowserThread::IsMessageLoopValid(BrowserThread::IO));
62
63  // Notify all of the log observers.
64  FOR_EACH_OBSERVER(Observer, observers_,
65                    OnAddEntry(type, time, source, phase, params));
66}
67
68uint32 ChromeNetLog::NextID() {
69  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
70  return next_id_++;
71}
72
73net::NetLog::LogLevel ChromeNetLog::GetLogLevel() const {
74  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
75
76  // Look through all the observers and find the finest granularity
77  // log level (higher values of the enum imply *lower* log levels).
78  LogLevel log_level = LOG_BASIC;
79  ObserverListBase<Observer>::Iterator it(observers_);
80  Observer* observer;
81  while ((observer = it.GetNext()) != NULL) {
82    log_level = std::min(log_level, observer->log_level());
83  }
84  return log_level;
85}
86
87void ChromeNetLog::AddObserver(Observer* observer) {
88  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
89  observers_.AddObserver(observer);
90}
91
92void ChromeNetLog::RemoveObserver(Observer* observer) {
93  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
94  observers_.RemoveObserver(observer);
95}
96