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