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 12 ChromeWebRtcLogMessageDelegate::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 21 ChromeWebRtcLogMessageDelegate::~ChromeWebRtcLogMessageDelegate() { 22 DCHECK(CalledOnValidThread()); 23 } 24 25 void 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 35 void 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 62 void ChromeWebRtcLogMessageDelegate::OnFilterRemoved() { 63 DCHECK(CalledOnValidThread()); 64 message_filter_ = NULL; 65 } 66 67 void ChromeWebRtcLogMessageDelegate::OnStartLogging() { 68 DCHECK(CalledOnValidThread()); 69 logging_started_ = true; 70 content::InitWebRtcLogging(); 71 } 72 73 void 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 82 void 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