Home | History | Annotate | Download | only in media
      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