1// Copyright 2013 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/renderer/media/chrome_webrtc_log_message_delegate.h" 6 7#include "base/logging.h" 8#include "base/message_loop/message_loop_proxy.h" 9#include "chrome/common/partial_circular_buffer.h" 10#include "chrome/renderer/media/webrtc_logging_message_filter.h" 11 12ChromeWebRtcLogMessageDelegate::ChromeWebRtcLogMessageDelegate( 13 const scoped_refptr<base::MessageLoopProxy>& io_message_loop, 14 WebRtcLoggingMessageFilter* message_filter) 15 : io_message_loop_(io_message_loop), 16 logging_started_(false), 17 message_filter_(message_filter) { 18 content::InitWebRtcLoggingDelegate(this); 19} 20 21ChromeWebRtcLogMessageDelegate::~ChromeWebRtcLogMessageDelegate() { 22 DCHECK(CalledOnValidThread()); 23} 24 25void ChromeWebRtcLogMessageDelegate::LogMessage(const std::string& message) { 26 WebRtcLoggingMessageData data(base::Time::Now(), message); 27 28 io_message_loop_->PostTask( 29 FROM_HERE, base::Bind( 30 &ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread, 31 base::Unretained(this), 32 data)); 33} 34 35void ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread( 36 const WebRtcLoggingMessageData& message) { 37 DCHECK(CalledOnValidThread()); 38 39 if (logging_started_ && message_filter_) { 40 if (!log_buffer_.empty()) { 41 // A delayed task has already been posted for sending the buffer contents. 42 // Just add the message to the buffer. 43 log_buffer_.push_back(message); 44 return; 45 } 46 47 log_buffer_.push_back(message); 48 49 if (base::TimeTicks::Now() - last_log_buffer_send_ > 50 base::TimeDelta::FromMilliseconds(100)) { 51 SendLogBuffer(); 52 } else { 53 io_message_loop_->PostDelayedTask( 54 FROM_HERE, 55 base::Bind(&ChromeWebRtcLogMessageDelegate::SendLogBuffer, 56 base::Unretained(this)), 57 base::TimeDelta::FromMilliseconds(200)); 58 } 59 } 60} 61 62void ChromeWebRtcLogMessageDelegate::OnFilterRemoved() { 63 DCHECK(CalledOnValidThread()); 64 message_filter_ = NULL; 65} 66 67void ChromeWebRtcLogMessageDelegate::OnStartLogging() { 68 DCHECK(CalledOnValidThread()); 69 logging_started_ = true; 70 content::InitWebRtcLogging(); 71} 72 73void ChromeWebRtcLogMessageDelegate::OnStopLogging() { 74 DCHECK(CalledOnValidThread()); 75 if (!log_buffer_.empty()) 76 SendLogBuffer(); 77 if (message_filter_) 78 message_filter_->LoggingStopped(); 79 logging_started_ = false; 80} 81 82void ChromeWebRtcLogMessageDelegate::SendLogBuffer() { 83 DCHECK(CalledOnValidThread()); 84 if (logging_started_ && message_filter_) { 85 message_filter_->AddLogMessages(log_buffer_); 86 last_log_buffer_send_ = base::TimeTicks::Now(); 87 } 88 log_buffer_.clear(); 89} 90