Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 #include "content/browser/tracing/tracing_controller_impl.h" | 4 #include "content/browser/tracing/tracing_controller_impl.h" |
| 5 | 5 |
| 6 #include "base/bind.h" | 6 #include "base/bind.h" |
| 7 #include "base/files/file_util.h" | 7 #include "base/files/file_util.h" |
| 8 #include "base/json/json_writer.h" | 8 #include "base/json/json_writer.h" |
| 9 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
| 10 #include "third_party/zlib/zlib.h" | 10 #include "third_party/zlib/zlib.h" |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 124 | 124 |
| 125 AddTraceChunkAndPassToEndpoint(trace_string); | 125 AddTraceChunkAndPassToEndpoint(trace_string); |
| 126 } | 126 } |
| 127 | 127 |
| 128 void AddTraceChunkAndPassToEndpoint(const std::string& chunk) { | 128 void AddTraceChunkAndPassToEndpoint(const std::string& chunk) { |
| 129 trace_ += chunk; | 129 trace_ += chunk; |
| 130 | 130 |
| 131 endpoint_->ReceiveTraceChunk(chunk); | 131 endpoint_->ReceiveTraceChunk(chunk); |
| 132 } | 132 } |
| 133 | 133 |
| 134 void SetSystemTrace(const std::string& data) override { | |
| 135 system_trace_ = data; | |
| 136 } | |
| 137 | |
| 138 void SetPowerTrace(const std::string& data) override { power_trace_ = data; } | |
| 139 | |
| 140 void Close() override { | 134 void Close() override { |
| 141 AddTraceChunkAndPassToEndpoint("]"); | 135 AddTraceChunkAndPassToEndpoint("]"); |
| 142 if (!system_trace_.empty()) | 136 |
| 143 AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " + | 137 for (base::DictionaryValue::Iterator it(GetAdditionalTracingAgentTrace()); |
| 144 system_trace_); | 138 !it.IsAtEnd(); it.Advance()) { |
| 139 std::string trace; | |
| 140 DCHECK(it.value().GetAsString(&trace)); | |
| 141 if (it.key() == base::trace_event::TracingAgent::kCrOSTracingAgentName || | |
|
shatch
2015/11/27 19:29:18
Don't need to do this now but could probably go fu
Zhen Wang
2015/12/01 00:14:32
Done.
| |
| 142 it.key() == base::trace_event::TracingAgent::kETWTracingAgentName) { | |
| 143 AddTraceChunkAndPassToEndpoint(",\"systemTraceEvents\": " + trace); | |
| 144 } else if (it.key() == | |
| 145 base::trace_event::TracingAgent::kPowerTracingAgentName) { | |
| 146 AddTraceChunkAndPassToEndpoint(",\"powerTraceAsString\": " + trace); | |
| 147 } | |
| 148 } | |
| 149 | |
| 145 std::string metadataJSON; | 150 std::string metadataJSON; |
| 146 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && | 151 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && |
| 147 !metadataJSON.empty()) | 152 !metadataJSON.empty()) |
| 148 AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadataJSON); | 153 AddTraceChunkAndPassToEndpoint(",\"metadata\": " + metadataJSON); |
| 149 if (!power_trace_.empty()) { | |
| 150 AddTraceChunkAndPassToEndpoint(",\"powerTraceAsString\": " + | |
| 151 power_trace_); | |
| 152 } | |
| 153 | 154 |
| 154 AddTraceChunkAndPassToEndpoint("}"); | 155 AddTraceChunkAndPassToEndpoint("}"); |
| 155 | 156 |
| 156 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); | 157 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); |
| 157 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), trace_); | 158 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), trace_); |
| 158 } | 159 } |
| 159 | 160 |
| 160 private: | 161 private: |
| 161 ~StringTraceDataSink() override {} | 162 ~StringTraceDataSink() override {} |
| 162 | 163 |
| 163 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; | 164 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; |
| 164 std::string trace_; | 165 std::string trace_; |
| 165 std::string system_trace_; | |
| 166 std::string power_trace_; | |
| 167 | 166 |
| 168 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); | 167 DISALLOW_COPY_AND_ASSIGN(StringTraceDataSink); |
| 169 }; | 168 }; |
| 170 | 169 |
| 171 class CompressedStringTraceDataSink : public TracingController::TraceDataSink { | 170 class CompressedStringTraceDataSink : public TracingController::TraceDataSink { |
| 172 public: | 171 public: |
| 173 explicit CompressedStringTraceDataSink( | 172 explicit CompressedStringTraceDataSink( |
| 174 scoped_refptr<TracingController::TraceDataEndpoint> endpoint) | 173 scoped_refptr<TracingController::TraceDataEndpoint> endpoint) |
| 175 : endpoint_(endpoint), already_tried_open_(false) {} | 174 : endpoint_(endpoint), already_tried_open_(false) {} |
| 176 | 175 |
| 177 void AddTraceChunk(const std::string& chunk) override { | 176 void AddTraceChunk(const std::string& chunk) override { |
| 178 std::string tmp = chunk; | 177 std::string tmp = chunk; |
| 179 scoped_refptr<base::RefCountedString> chunk_ptr = | 178 scoped_refptr<base::RefCountedString> chunk_ptr = |
| 180 base::RefCountedString::TakeString(&tmp); | 179 base::RefCountedString::TakeString(&tmp); |
| 181 BrowserThread::PostTask( | 180 BrowserThread::PostTask( |
| 182 BrowserThread::FILE, FROM_HERE, | 181 BrowserThread::FILE, FROM_HERE, |
| 183 base::Bind(&CompressedStringTraceDataSink::AddTraceChunkOnFileThread, | 182 base::Bind(&CompressedStringTraceDataSink::AddTraceChunkOnFileThread, |
| 184 this, chunk_ptr)); | 183 this, chunk_ptr)); |
| 185 } | 184 } |
| 186 | 185 |
| 187 void SetSystemTrace(const std::string& data) override { | |
| 188 system_trace_ = data; | |
| 189 } | |
| 190 | |
| 191 void SetPowerTrace(const std::string& data) override { power_trace_ = data; } | |
| 192 | |
| 193 void Close() override { | 186 void Close() override { |
| 194 BrowserThread::PostTask( | 187 BrowserThread::PostTask( |
| 195 BrowserThread::FILE, FROM_HERE, | 188 BrowserThread::FILE, FROM_HERE, |
| 196 base::Bind(&CompressedStringTraceDataSink::CloseOnFileThread, this)); | 189 base::Bind(&CompressedStringTraceDataSink::CloseOnFileThread, this)); |
| 197 } | 190 } |
| 198 | 191 |
| 199 private: | 192 private: |
| 200 ~CompressedStringTraceDataSink() override {} | 193 ~CompressedStringTraceDataSink() override {} |
| 201 | 194 |
| 202 bool OpenZStreamOnFileThread() { | 195 bool OpenZStreamOnFileThread() { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 266 | 259 |
| 267 void CloseOnFileThread() { | 260 void CloseOnFileThread() { |
| 268 DCHECK_CURRENTLY_ON(BrowserThread::FILE); | 261 DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
| 269 if (!OpenZStreamOnFileThread()) | 262 if (!OpenZStreamOnFileThread()) |
| 270 return; | 263 return; |
| 271 | 264 |
| 272 if (compressed_trace_data_.empty()) | 265 if (compressed_trace_data_.empty()) |
| 273 AddTraceChunkAndCompressOnFileThread("{\"traceEvents\":[", false); | 266 AddTraceChunkAndCompressOnFileThread("{\"traceEvents\":[", false); |
| 274 | 267 |
| 275 AddTraceChunkAndCompressOnFileThread("]", false); | 268 AddTraceChunkAndCompressOnFileThread("]", false); |
| 276 if (!system_trace_.empty()) { | 269 |
| 277 AddTraceChunkAndCompressOnFileThread( | 270 for (base::DictionaryValue::Iterator it(GetAdditionalTracingAgentTrace()); |
| 278 ",\"systemTraceEvents\": " + system_trace_, false); | 271 !it.IsAtEnd(); it.Advance()) { |
| 272 std::string trace; | |
| 273 DCHECK(it.value().GetAsString(&trace)); | |
| 274 if (it.key() == base::trace_event::TracingAgent::kCrOSTracingAgentName || | |
| 275 it.key() == base::trace_event::TracingAgent::kETWTracingAgentName) { | |
| 276 AddTraceChunkAndCompressOnFileThread( | |
| 277 ",\"systemTraceEvents\": " + trace, false); | |
| 278 } else if (it.key() == | |
| 279 base::trace_event::TracingAgent::kPowerTracingAgentName) { | |
| 280 AddTraceChunkAndCompressOnFileThread( | |
| 281 ",\"powerTraceAsString\": " + trace, false); | |
| 282 } | |
| 279 } | 283 } |
| 284 | |
| 280 std::string metadataJSON; | 285 std::string metadataJSON; |
| 281 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && | 286 if (base::JSONWriter::Write(GetMetadata(), &metadataJSON) && |
| 282 !metadataJSON.empty()) { | 287 !metadataJSON.empty()) { |
| 283 AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadataJSON, | 288 AddTraceChunkAndCompressOnFileThread(",\"metadata\": " + metadataJSON, |
| 284 false); | 289 false); |
| 285 } | 290 } |
| 286 if (!power_trace_.empty()) { | |
| 287 AddTraceChunkAndCompressOnFileThread( | |
| 288 ",\"powerTraceAsString\": " + power_trace_, false); | |
| 289 } | |
| 290 AddTraceChunkAndCompressOnFileThread("}", true); | 291 AddTraceChunkAndCompressOnFileThread("}", true); |
| 291 | 292 |
| 292 deflateEnd(stream_.get()); | 293 deflateEnd(stream_.get()); |
| 293 stream_.reset(); | 294 stream_.reset(); |
| 294 | 295 |
| 295 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); | 296 scoped_ptr<const base::DictionaryValue> metadata(GetMetadata().DeepCopy()); |
| 296 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), | 297 endpoint_->ReceiveTraceFinalContents(metadata.Pass(), |
| 297 compressed_trace_data_); | 298 compressed_trace_data_); |
| 298 } | 299 } |
| 299 | 300 |
| 300 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; | 301 scoped_refptr<TracingController::TraceDataEndpoint> endpoint_; |
| 301 scoped_ptr<z_stream> stream_; | 302 scoped_ptr<z_stream> stream_; |
| 302 bool already_tried_open_; | 303 bool already_tried_open_; |
| 303 std::string compressed_trace_data_; | 304 std::string compressed_trace_data_; |
| 304 std::string system_trace_; | |
| 305 std::string power_trace_; | |
| 306 | 305 |
| 307 DISALLOW_COPY_AND_ASSIGN(CompressedStringTraceDataSink); | 306 DISALLOW_COPY_AND_ASSIGN(CompressedStringTraceDataSink); |
| 308 }; | 307 }; |
| 309 | 308 |
| 310 } // namespace | 309 } // namespace |
| 311 | 310 |
| 311 void TracingController::TraceDataSink::AddAdditionalTracingAgentTrace( | |
| 312 const std::string& agent_name, | |
| 313 const std::string& trace_data) { | |
| 314 additional_tracing_agent_trace_.SetString(agent_name, trace_data); | |
| 315 } | |
| 316 | |
| 317 const base::DictionaryValue& | |
| 318 TracingController::TraceDataSink::GetAdditionalTracingAgentTrace() const { | |
| 319 return additional_tracing_agent_trace_; | |
| 320 } | |
| 321 | |
| 312 void TracingController::TraceDataSink::AddMetadata( | 322 void TracingController::TraceDataSink::AddMetadata( |
| 313 const base::DictionaryValue& data) { | 323 const base::DictionaryValue& data) { |
| 314 metadata_.MergeDictionary(&data); | 324 metadata_.MergeDictionary(&data); |
| 315 } | 325 } |
| 316 | 326 |
| 317 const base::DictionaryValue& | 327 const base::DictionaryValue& |
| 318 TracingController::TraceDataSink::GetMetadata() const { | 328 TracingController::TraceDataSink::GetMetadata() const { |
| 319 return metadata_; | 329 return metadata_; |
| 320 } | 330 } |
| 321 | 331 |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 346 return new StringTraceDataEndpoint(callback); | 356 return new StringTraceDataEndpoint(callback); |
| 347 } | 357 } |
| 348 | 358 |
| 349 scoped_refptr<TracingController::TraceDataEndpoint> | 359 scoped_refptr<TracingController::TraceDataEndpoint> |
| 350 TracingController::CreateFileEndpoint(const base::FilePath& file_path, | 360 TracingController::CreateFileEndpoint(const base::FilePath& file_path, |
| 351 const base::Closure& callback) { | 361 const base::Closure& callback) { |
| 352 return new FileTraceDataEndpoint(file_path, callback); | 362 return new FileTraceDataEndpoint(file_path, callback); |
| 353 } | 363 } |
| 354 | 364 |
| 355 } // namespace content | 365 } // namespace content |
| OLD | NEW |