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