summaryrefslogtreecommitdiffstats
path: root/chrome/renderer/media/chrome_webrtc_log_message_delegate.cc
blob: cc09c93321f367e580a935332b31051dc4ea66a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "chrome/renderer/media/chrome_webrtc_log_message_delegate.h"

#include "base/logging.h"
#include "base/message_loop/message_loop_proxy.h"
#include "chrome/common/partial_circular_buffer.h"
#include "chrome/renderer/media/webrtc_logging_message_filter.h"

ChromeWebRtcLogMessageDelegate::ChromeWebRtcLogMessageDelegate(
    const scoped_refptr<base::MessageLoopProxy>& io_message_loop,
    WebRtcLoggingMessageFilter* message_filter)
    : io_message_loop_(io_message_loop),
      logging_started_(false),
      message_filter_(message_filter) {
  content::InitWebRtcLoggingDelegate(this);
}

ChromeWebRtcLogMessageDelegate::~ChromeWebRtcLogMessageDelegate() {
  DCHECK(CalledOnValidThread());
}

void ChromeWebRtcLogMessageDelegate::LogMessage(const std::string& message) {
  io_message_loop_->PostTask(
      FROM_HERE, base::Bind(
          &ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread,
          base::Unretained(this),
          message));
}

void ChromeWebRtcLogMessageDelegate::LogMessageOnIOThread(
    const std::string& message) {
  DCHECK(CalledOnValidThread());
  if (logging_started_ && message_filter_) {
    if (!log_buffer_.empty()) {
      // A delayed task has already been posted for sending the buffer contents.
      // Just add the message to the buffer.
      log_buffer_ += "\n" + message;
    } else {
      if (base::TimeTicks::Now() - last_log_buffer_send_ >
          base::TimeDelta::FromMilliseconds(100)) {
        log_buffer_ = message;
        SendLogBuffer();
      } else {
        log_buffer_ = message;
        io_message_loop_->PostDelayedTask(
            FROM_HERE,
            base::Bind(&ChromeWebRtcLogMessageDelegate::SendLogBuffer,
                       base::Unretained(this)),
            base::TimeDelta::FromMilliseconds(200));
      }
    }
  }
}

void ChromeWebRtcLogMessageDelegate::OnFilterRemoved() {
  DCHECK(CalledOnValidThread());
  message_filter_ = NULL;
}

void ChromeWebRtcLogMessageDelegate::OnStartLogging() {
  DCHECK(CalledOnValidThread());
  logging_started_ = true;
  content::InitWebRtcLogging();
}

void ChromeWebRtcLogMessageDelegate::OnStopLogging() {
  DCHECK(CalledOnValidThread());
  if (!log_buffer_.empty())
    SendLogBuffer();
  if (message_filter_)
    message_filter_->LoggingStopped();
  logging_started_ = false;
}

void ChromeWebRtcLogMessageDelegate::SendLogBuffer() {
  DCHECK(CalledOnValidThread());
  if (logging_started_ && message_filter_) {
    message_filter_->AddLogMessage(log_buffer_);
    last_log_buffer_send_ = base::TimeTicks::Now();
  }
  log_buffer_.clear();
}