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