• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 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 "content/browser/tracing/trace_message_filter.h"
6 
7 #include "components/tracing/tracing_messages.h"
8 #include "content/browser/tracing/tracing_controller_impl.h"
9 
10 namespace content {
11 
TraceMessageFilter()12 TraceMessageFilter::TraceMessageFilter() :
13     has_child_(false),
14     is_awaiting_end_ack_(false),
15     is_awaiting_capture_monitoring_snapshot_ack_(false),
16     is_awaiting_buffer_percent_full_ack_(false) {
17 }
18 
~TraceMessageFilter()19 TraceMessageFilter::~TraceMessageFilter() {}
20 
OnChannelClosing()21 void TraceMessageFilter::OnChannelClosing() {
22   if (has_child_) {
23     if (is_awaiting_end_ack_)
24       OnEndTracingAck(std::vector<std::string>());
25 
26     if (is_awaiting_capture_monitoring_snapshot_ack_)
27       OnCaptureMonitoringSnapshotAcked();
28 
29     if (is_awaiting_buffer_percent_full_ack_)
30       OnTraceBufferPercentFullReply(0.0f);
31 
32     TracingControllerImpl::GetInstance()->RemoveTraceMessageFilter(this);
33   }
34 }
35 
OnMessageReceived(const IPC::Message & message,bool * message_was_ok)36 bool TraceMessageFilter::OnMessageReceived(const IPC::Message& message,
37                                            bool* message_was_ok) {
38   // Always on IO thread (BrowserMessageFilter guarantee).
39   bool handled = true;
40   IPC_BEGIN_MESSAGE_MAP_EX(TraceMessageFilter, message, *message_was_ok)
41     IPC_MESSAGE_HANDLER(TracingHostMsg_ChildSupportsTracing,
42                         OnChildSupportsTracing)
43     IPC_MESSAGE_HANDLER(TracingHostMsg_EndTracingAck, OnEndTracingAck)
44     IPC_MESSAGE_HANDLER(TracingHostMsg_CaptureMonitoringSnapshotAck,
45                         OnCaptureMonitoringSnapshotAcked)
46     IPC_MESSAGE_HANDLER(TracingHostMsg_TraceDataCollected,
47                         OnTraceDataCollected)
48     IPC_MESSAGE_HANDLER(TracingHostMsg_MonitoringTraceDataCollected,
49                         OnMonitoringTraceDataCollected)
50     IPC_MESSAGE_HANDLER(TracingHostMsg_WatchEventMatched,
51                         OnWatchEventMatched)
52     IPC_MESSAGE_HANDLER(TracingHostMsg_TraceBufferPercentFullReply,
53                         OnTraceBufferPercentFullReply)
54     IPC_MESSAGE_UNHANDLED(handled = false)
55   IPC_END_MESSAGE_MAP_EX()
56   return handled;
57 }
58 
SendBeginTracing(const std::string & category_filter_str,base::debug::TraceLog::Options options)59 void TraceMessageFilter::SendBeginTracing(
60     const std::string& category_filter_str,
61     base::debug::TraceLog::Options options) {
62   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
63   Send(new TracingMsg_BeginTracing(category_filter_str,
64                                    base::TimeTicks::NowFromSystemTraceTime(),
65                                    options));
66 }
67 
SendEndTracing()68 void TraceMessageFilter::SendEndTracing() {
69   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
70   DCHECK(!is_awaiting_end_ack_);
71   is_awaiting_end_ack_ = true;
72   Send(new TracingMsg_EndTracing);
73 }
74 
SendEnableMonitoring(const std::string & category_filter_str,base::debug::TraceLog::Options options)75 void TraceMessageFilter::SendEnableMonitoring(
76     const std::string& category_filter_str,
77     base::debug::TraceLog::Options options) {
78   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
79   Send(new TracingMsg_EnableMonitoring(category_filter_str,
80       base::TimeTicks::NowFromSystemTraceTime(),
81       options));
82 }
83 
SendDisableMonitoring()84 void TraceMessageFilter::SendDisableMonitoring() {
85   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
86   Send(new TracingMsg_DisableMonitoring);
87 }
88 
SendCaptureMonitoringSnapshot()89 void TraceMessageFilter::SendCaptureMonitoringSnapshot() {
90   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
91   DCHECK(!is_awaiting_capture_monitoring_snapshot_ack_);
92   is_awaiting_capture_monitoring_snapshot_ack_ = true;
93   Send(new TracingMsg_CaptureMonitoringSnapshot);
94 }
95 
SendGetTraceBufferPercentFull()96 void TraceMessageFilter::SendGetTraceBufferPercentFull() {
97   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
98   DCHECK(!is_awaiting_buffer_percent_full_ack_);
99   is_awaiting_buffer_percent_full_ack_ = true;
100   Send(new TracingMsg_GetTraceBufferPercentFull);
101 }
102 
SendSetWatchEvent(const std::string & category_name,const std::string & event_name)103 void TraceMessageFilter::SendSetWatchEvent(const std::string& category_name,
104                                            const std::string& event_name) {
105   Send(new TracingMsg_SetWatchEvent(category_name, event_name));
106 }
107 
SendCancelWatchEvent()108 void TraceMessageFilter::SendCancelWatchEvent() {
109   Send(new TracingMsg_CancelWatchEvent);
110 }
111 
OnChildSupportsTracing()112 void TraceMessageFilter::OnChildSupportsTracing() {
113   has_child_ = true;
114   TracingControllerImpl::GetInstance()->AddTraceMessageFilter(this);
115 }
116 
OnEndTracingAck(const std::vector<std::string> & known_categories)117 void TraceMessageFilter::OnEndTracingAck(
118     const std::vector<std::string>& known_categories) {
119   // is_awaiting_end_ack_ should always be true here, but check in case the
120   // child process is compromised.
121   if (is_awaiting_end_ack_) {
122     is_awaiting_end_ack_ = false;
123     TracingControllerImpl::GetInstance()->OnDisableRecordingAcked(
124         known_categories);
125   } else {
126     NOTREACHED();
127   }
128 }
129 
OnCaptureMonitoringSnapshotAcked()130 void TraceMessageFilter::OnCaptureMonitoringSnapshotAcked() {
131   // is_awaiting_capture_monitoring_snapshot_ack_ should always be true here,
132   // but check in case the child process is compromised.
133   if (is_awaiting_capture_monitoring_snapshot_ack_) {
134     is_awaiting_capture_monitoring_snapshot_ack_ = false;
135     TracingControllerImpl::GetInstance()->OnCaptureMonitoringSnapshotAcked();
136   } else {
137     NOTREACHED();
138   }
139 }
140 
OnTraceDataCollected(const std::string & data)141 void TraceMessageFilter::OnTraceDataCollected(const std::string& data) {
142   scoped_refptr<base::RefCountedString> data_ptr(new base::RefCountedString());
143   data_ptr->data() = data;
144   TracingControllerImpl::GetInstance()->OnTraceDataCollected(data_ptr);
145 }
146 
OnMonitoringTraceDataCollected(const std::string & data)147 void TraceMessageFilter::OnMonitoringTraceDataCollected(
148     const std::string& data) {
149   scoped_refptr<base::RefCountedString> data_ptr(new base::RefCountedString());
150   data_ptr->data() = data;
151   TracingControllerImpl::GetInstance()->OnMonitoringTraceDataCollected(
152       data_ptr);
153 }
154 
OnWatchEventMatched()155 void TraceMessageFilter::OnWatchEventMatched() {
156   TracingControllerImpl::GetInstance()->OnWatchEventMatched();
157 }
158 
OnTraceBufferPercentFullReply(float percent_full)159 void TraceMessageFilter::OnTraceBufferPercentFullReply(float percent_full) {
160   if (is_awaiting_buffer_percent_full_ack_) {
161     is_awaiting_buffer_percent_full_ack_ = false;
162     TracingControllerImpl::GetInstance()->OnTraceBufferPercentFullReply(
163         percent_full);
164   } else {
165     NOTREACHED();
166   }
167 }
168 
169 }  // namespace content
170