OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/devtools/protocol/tracing_handler.h" | 5 #include "content/browser/devtools/protocol/tracing_handler.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 | 106 |
107 void TracingHandler::OnTraceDataCollected(const std::string& trace_fragment) { | 107 void TracingHandler::OnTraceDataCollected(const std::string& trace_fragment) { |
108 // Hand-craft protocol notification message so we can substitute JSON | 108 // Hand-craft protocol notification message so we can substitute JSON |
109 // that we already got as string as a bare object, not a quoted string. | 109 // that we already got as string as a bare object, not a quoted string. |
110 std::string message( | 110 std::string message( |
111 "{ \"method\": \"Tracing.dataCollected\", \"params\": { \"value\": ["); | 111 "{ \"method\": \"Tracing.dataCollected\", \"params\": { \"value\": ["); |
112 const size_t messageSuffixSize = 10; | 112 const size_t messageSuffixSize = 10; |
113 message.reserve(message.size() + trace_fragment.size() + messageSuffixSize); | 113 message.reserve(message.size() + trace_fragment.size() + messageSuffixSize); |
114 message += trace_fragment; | 114 message += trace_fragment; |
115 message += "] } }"; | 115 message += "] } }"; |
116 client_->SendRawMessage(message); | 116 client_->SendRawMessage(0, message); |
117 } | 117 } |
118 | 118 |
119 void TracingHandler::OnTraceComplete() { | 119 void TracingHandler::OnTraceComplete() { |
120 client_->TracingComplete(TracingCompleteParams::Create()); | 120 client_->TracingComplete(TracingCompleteParams::Create()); |
121 } | 121 } |
122 | 122 |
123 void TracingHandler::OnTraceToStreamComplete(const std::string& stream_handle) { | 123 void TracingHandler::OnTraceToStreamComplete(const std::string& stream_handle) { |
124 client_->TracingComplete( | 124 client_->TracingComplete( |
125 TracingCompleteParams::Create()->set_stream(stream_handle)); | 125 TracingCompleteParams::Create()->set_stream(stream_handle)); |
126 } | 126 } |
127 | 127 |
128 Response TracingHandler::Start(DevToolsCommandId command_id, | 128 Response TracingHandler::Start(int session_id, |
| 129 DevToolsCommandId command_id, |
129 const std::string* categories, | 130 const std::string* categories, |
130 const std::string* options, | 131 const std::string* options, |
131 const double* buffer_usage_reporting_interval, | 132 const double* buffer_usage_reporting_interval, |
132 const std::string* transfer_mode) { | 133 const std::string* transfer_mode) { |
133 if (IsRecording()) | 134 if (IsRecording()) |
134 return Response::InternalError("Tracing is already started"); | 135 return Response::InternalError("Tracing is already started"); |
135 | 136 |
136 did_initiate_recording_ = true; | 137 did_initiate_recording_ = true; |
137 return_as_stream_ = | 138 return_as_stream_ = |
138 transfer_mode && *transfer_mode == start::kTransferModeReturnAsStream; | 139 transfer_mode && *transfer_mode == start::kTransferModeReturnAsStream; |
139 base::trace_event::TraceConfig trace_config( | 140 base::trace_event::TraceConfig trace_config( |
140 categories ? *categories : std::string(), | 141 categories ? *categories : std::string(), |
141 options ? *options : std::string()); | 142 options ? *options : std::string()); |
142 if (buffer_usage_reporting_interval) | 143 if (buffer_usage_reporting_interval) |
143 SetupTimer(*buffer_usage_reporting_interval); | 144 SetupTimer(*buffer_usage_reporting_interval); |
144 | 145 |
145 // If inspected target is a render process Tracing.start will be handled by | 146 // If inspected target is a render process Tracing.start will be handled by |
146 // tracing agent in the renderer. | 147 // tracing agent in the renderer. |
147 if (target_ == Renderer) { | 148 if (target_ == Renderer) { |
148 TracingController::GetInstance()->EnableRecording( | 149 TracingController::GetInstance()->EnableRecording( |
149 trace_config, | 150 trace_config, |
150 TracingController::EnableRecordingDoneCallback()); | 151 TracingController::EnableRecordingDoneCallback()); |
151 return Response::FallThrough(); | 152 return Response::FallThrough(); |
152 } | 153 } |
153 | 154 |
154 TracingController::GetInstance()->EnableRecording( | 155 TracingController::GetInstance()->EnableRecording( |
155 trace_config, | 156 trace_config, |
156 base::Bind(&TracingHandler::OnRecordingEnabled, | 157 base::Bind(&TracingHandler::OnRecordingEnabled, |
157 weak_factory_.GetWeakPtr(), | 158 weak_factory_.GetWeakPtr(), session_id, command_id)); |
158 command_id)); | |
159 return Response::OK(); | 159 return Response::OK(); |
160 } | 160 } |
161 | 161 |
162 Response TracingHandler::End(DevToolsCommandId command_id) { | 162 Response TracingHandler::End(int session_id, DevToolsCommandId command_id) { |
163 // Startup tracing triggered by --trace-config-file is a special case, where | 163 // Startup tracing triggered by --trace-config-file is a special case, where |
164 // tracing is started automatically upon browser startup and can be stopped | 164 // tracing is started automatically upon browser startup and can be stopped |
165 // via DevTools. | 165 // via DevTools. |
166 if (!did_initiate_recording_ && !IsStartupTracingActive()) | 166 if (!did_initiate_recording_ && !IsStartupTracingActive()) |
167 return Response::InternalError("Tracing is not started"); | 167 return Response::InternalError("Tracing is not started"); |
168 | 168 |
169 scoped_refptr<TracingController::TraceDataSink> proxy; | 169 scoped_refptr<TracingController::TraceDataSink> proxy; |
170 if (return_as_stream_) { | 170 if (return_as_stream_) { |
171 proxy = new DevToolsStreamTraceSink( | 171 proxy = new DevToolsStreamTraceSink( |
172 weak_factory_.GetWeakPtr(), io_context_->CreateTempFileBackedStream()); | 172 weak_factory_.GetWeakPtr(), io_context_->CreateTempFileBackedStream()); |
173 } else { | 173 } else { |
174 proxy = new DevToolsTraceSinkProxy(weak_factory_.GetWeakPtr()); | 174 proxy = new DevToolsTraceSinkProxy(weak_factory_.GetWeakPtr()); |
175 } | 175 } |
176 DisableRecording(proxy); | 176 DisableRecording(proxy); |
177 // If inspected target is a render process Tracing.end will be handled by | 177 // If inspected target is a render process Tracing.end will be handled by |
178 // tracing agent in the renderer. | 178 // tracing agent in the renderer. |
179 return target_ == Renderer ? Response::FallThrough() : Response::OK(); | 179 return target_ == Renderer ? Response::FallThrough() : Response::OK(); |
180 } | 180 } |
181 | 181 |
182 Response TracingHandler::GetCategories(DevToolsCommandId command_id) { | 182 Response TracingHandler::GetCategories(int session_id, |
| 183 DevToolsCommandId command_id) { |
183 TracingController::GetInstance()->GetCategories( | 184 TracingController::GetInstance()->GetCategories( |
184 base::Bind(&TracingHandler::OnCategoriesReceived, | 185 base::Bind(&TracingHandler::OnCategoriesReceived, |
185 weak_factory_.GetWeakPtr(), | 186 weak_factory_.GetWeakPtr(), session_id, command_id)); |
186 command_id)); | |
187 return Response::OK(); | 187 return Response::OK(); |
188 } | 188 } |
189 | 189 |
190 void TracingHandler::OnRecordingEnabled(DevToolsCommandId command_id) { | 190 void TracingHandler::OnRecordingEnabled(int session_id, |
191 client_->SendStartResponse(command_id, StartResponse::Create()); | 191 DevToolsCommandId command_id) { |
| 192 client_->SendStartResponse(session_id, command_id, StartResponse::Create()); |
192 } | 193 } |
193 | 194 |
194 void TracingHandler::OnBufferUsage(float percent_full, | 195 void TracingHandler::OnBufferUsage(float percent_full, |
195 size_t approximate_event_count) { | 196 size_t approximate_event_count) { |
196 // TODO(crbug426117): remove set_value once all clients have switched to | 197 // TODO(crbug426117): remove set_value once all clients have switched to |
197 // the new interface of the event. | 198 // the new interface of the event. |
198 client_->BufferUsage(BufferUsageParams::Create() | 199 client_->BufferUsage(BufferUsageParams::Create() |
199 ->set_value(percent_full) | 200 ->set_value(percent_full) |
200 ->set_percent_full(percent_full) | 201 ->set_percent_full(percent_full) |
201 ->set_event_count(approximate_event_count)); | 202 ->set_event_count(approximate_event_count)); |
202 } | 203 } |
203 | 204 |
204 void TracingHandler::OnCategoriesReceived( | 205 void TracingHandler::OnCategoriesReceived( |
| 206 int session_id, |
205 DevToolsCommandId command_id, | 207 DevToolsCommandId command_id, |
206 const std::set<std::string>& category_set) { | 208 const std::set<std::string>& category_set) { |
207 std::vector<std::string> categories; | 209 std::vector<std::string> categories; |
208 for (const std::string& category : category_set) | 210 for (const std::string& category : category_set) |
209 categories.push_back(category); | 211 categories.push_back(category); |
210 client_->SendGetCategoriesResponse(command_id, | 212 client_->SendGetCategoriesResponse( |
| 213 session_id, command_id, |
211 GetCategoriesResponse::Create()->set_categories(categories)); | 214 GetCategoriesResponse::Create()->set_categories(categories)); |
212 } | 215 } |
213 | 216 |
214 Response TracingHandler::RequestMemoryDump(DevToolsCommandId command_id) { | 217 Response TracingHandler::RequestMemoryDump(int session_id, |
| 218 DevToolsCommandId command_id) { |
215 if (!IsRecording()) | 219 if (!IsRecording()) |
216 return Response::InternalError("Tracing is not started"); | 220 return Response::InternalError("Tracing is not started"); |
217 | 221 |
218 base::trace_event::MemoryDumpManager::GetInstance()->RequestGlobalDump( | 222 base::trace_event::MemoryDumpManager::GetInstance()->RequestGlobalDump( |
219 base::trace_event::MemoryDumpType::EXPLICITLY_TRIGGERED, | 223 base::trace_event::MemoryDumpType::EXPLICITLY_TRIGGERED, |
220 base::trace_event::MemoryDumpLevelOfDetail::DETAILED, | 224 base::trace_event::MemoryDumpLevelOfDetail::DETAILED, |
221 base::Bind(&TracingHandler::OnMemoryDumpFinished, | 225 base::Bind(&TracingHandler::OnMemoryDumpFinished, |
222 weak_factory_.GetWeakPtr(), command_id)); | 226 weak_factory_.GetWeakPtr(), session_id, command_id)); |
223 return Response::OK(); | 227 return Response::OK(); |
224 } | 228 } |
225 | 229 |
226 void TracingHandler::OnMemoryDumpFinished(DevToolsCommandId command_id, | 230 void TracingHandler::OnMemoryDumpFinished(int session_id, |
| 231 DevToolsCommandId command_id, |
227 uint64 dump_guid, | 232 uint64 dump_guid, |
228 bool success) { | 233 bool success) { |
229 client_->SendRequestMemoryDumpResponse( | 234 client_->SendRequestMemoryDumpResponse( |
230 command_id, | 235 session_id, command_id, |
231 RequestMemoryDumpResponse::Create() | 236 RequestMemoryDumpResponse::Create() |
232 ->set_dump_guid(base::StringPrintf("0x%" PRIx64, dump_guid)) | 237 ->set_dump_guid(base::StringPrintf("0x%" PRIx64, dump_guid)) |
233 ->set_success(success)); | 238 ->set_success(success)); |
234 } | 239 } |
235 | 240 |
236 void TracingHandler::SetupTimer(double usage_reporting_interval) { | 241 void TracingHandler::SetupTimer(double usage_reporting_interval) { |
237 if (usage_reporting_interval == 0) return; | 242 if (usage_reporting_interval == 0) return; |
238 | 243 |
239 if (usage_reporting_interval < kMinimumReportingInterval) | 244 if (usage_reporting_interval < kMinimumReportingInterval) |
240 usage_reporting_interval = kMinimumReportingInterval; | 245 usage_reporting_interval = kMinimumReportingInterval; |
(...skipping 22 matching lines...) Expand all Loading... |
263 } | 268 } |
264 | 269 |
265 bool TracingHandler::IsStartupTracingActive() { | 270 bool TracingHandler::IsStartupTracingActive() { |
266 return ::tracing::TraceConfigFile::GetInstance()->IsEnabled() && | 271 return ::tracing::TraceConfigFile::GetInstance()->IsEnabled() && |
267 TracingController::GetInstance()->IsRecording(); | 272 TracingController::GetInstance()->IsRecording(); |
268 } | 273 } |
269 | 274 |
270 } // namespace tracing | 275 } // namespace tracing |
271 } // namespace devtools | 276 } // namespace devtools |
272 } // namespace content | 277 } // namespace content |
OLD | NEW |