| 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 <utility> | 4 #include <utility> |
| 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 "base/macros.h" | 9 #include "base/macros.h" |
| 10 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/strings/pattern.h" | 11 #include "base/strings/pattern.h" |
| 12 #include "content/browser/tracing/tracing_controller_impl.h" | 12 #include "content/browser/tracing/tracing_controller_impl.h" |
| 13 #include "content/public/browser/browser_thread.h" | 13 #include "content/public/browser/browser_thread.h" |
| 14 #include "third_party/zlib/zlib.h" | 14 #include "third_party/zlib/zlib.h" |
| 15 | 15 |
| 16 namespace content { | 16 namespace content { |
| 17 | 17 |
| 18 namespace { | 18 namespace { |
| 19 | 19 |
| 20 const char kChromeTraceLabel[] = "traceEvents"; | |
| 21 const char kMetadataTraceLabel[] = "metadata"; | |
| 22 | |
| 23 class StringTraceDataEndpoint : public TraceDataEndpoint { | 20 class StringTraceDataEndpoint : public TraceDataEndpoint { |
| 24 public: | 21 public: |
| 25 typedef base::Callback<void(std::unique_ptr<const base::DictionaryValue>, | 22 typedef base::Callback<void(std::unique_ptr<const base::DictionaryValue>, |
| 26 base::RefCountedString*)> | 23 base::RefCountedString*)> |
| 27 CompletionCallback; | 24 CompletionCallback; |
| 28 | 25 |
| 29 explicit StringTraceDataEndpoint(CompletionCallback callback) | 26 explicit StringTraceDataEndpoint(CompletionCallback callback) |
| 30 : completion_callback_(callback) {} | 27 : completion_callback_(callback) {} |
| 31 | 28 |
| 32 void ReceiveTraceFinalContents( | 29 void ReceiveTraceFinalContents( |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 136 private: | 133 private: |
| 137 std::map<std::string, std::string> additional_tracing_agent_trace_; | 134 std::map<std::string, std::string> additional_tracing_agent_trace_; |
| 138 std::unique_ptr<base::DictionaryValue> metadata_; | 135 std::unique_ptr<base::DictionaryValue> metadata_; |
| 139 | 136 |
| 140 DISALLOW_COPY_AND_ASSIGN(TraceDataSinkImplBase); | 137 DISALLOW_COPY_AND_ASSIGN(TraceDataSinkImplBase); |
| 141 }; | 138 }; |
| 142 | 139 |
| 143 class JSONTraceDataSink : public TraceDataSinkImplBase { | 140 class JSONTraceDataSink : public TraceDataSinkImplBase { |
| 144 public: | 141 public: |
| 145 explicit JSONTraceDataSink(scoped_refptr<TraceDataEndpoint> endpoint) | 142 explicit JSONTraceDataSink(scoped_refptr<TraceDataEndpoint> endpoint) |
| 146 : endpoint_(endpoint), had_received_first_chunk_(false) {} | 143 : endpoint_(endpoint) {} |
| 147 | 144 |
| 148 void AddTraceChunk(const std::string& chunk) override { | 145 void AddTraceChunk(const std::string& chunk) override { |
| 149 std::string trace_string; | 146 endpoint_->ReceiveTraceChunk(base::MakeUnique<std::string>(chunk)); |
| 150 if (had_received_first_chunk_) | |
| 151 trace_string = ","; | |
| 152 else | |
| 153 trace_string = "{\"" + std::string(kChromeTraceLabel) + "\":["; | |
| 154 trace_string += chunk; | |
| 155 had_received_first_chunk_ = true; | |
| 156 | |
| 157 endpoint_->ReceiveTraceChunk(base::MakeUnique<std::string>(trace_string)); | |
| 158 } | 147 } |
| 159 | 148 |
| 160 void Close() override { | 149 void Close() override { |
| 161 endpoint_->ReceiveTraceChunk(base::MakeUnique<std::string>("]")); | |
| 162 | |
| 163 for (auto const &it : GetAgentTrace()) | |
| 164 endpoint_->ReceiveTraceChunk( | |
| 165 base::MakeUnique<std::string>(",\"" + it.first + "\": " + it.second)); | |
| 166 | |
| 167 std::unique_ptr<base::DictionaryValue> metadata(TakeMetadata()); | 150 std::unique_ptr<base::DictionaryValue> metadata(TakeMetadata()); |
| 168 std::string metadataJSON; | |
| 169 | |
| 170 if (base::JSONWriter::Write(*metadata, &metadataJSON) && | |
| 171 !metadataJSON.empty()) { | |
| 172 endpoint_->ReceiveTraceChunk(base::MakeUnique<std::string>( | |
| 173 ",\"" + std::string(kMetadataTraceLabel) + "\": " + metadataJSON)); | |
| 174 } | |
| 175 | |
| 176 endpoint_->ReceiveTraceChunk(base::MakeUnique<std::string>("}")); | |
| 177 endpoint_->ReceiveTraceFinalContents(std::move(metadata)); | 151 endpoint_->ReceiveTraceFinalContents(std::move(metadata)); |
| 178 } | 152 } |
| 179 | 153 |
| 180 private: | 154 private: |
| 181 ~JSONTraceDataSink() override {} | 155 ~JSONTraceDataSink() override {} |
| 182 | 156 |
| 183 scoped_refptr<TraceDataEndpoint> endpoint_; | 157 scoped_refptr<TraceDataEndpoint> endpoint_; |
| 184 bool had_received_first_chunk_; | |
| 185 DISALLOW_COPY_AND_ASSIGN(JSONTraceDataSink); | 158 DISALLOW_COPY_AND_ASSIGN(JSONTraceDataSink); |
| 186 }; | 159 }; |
| 187 | 160 |
| 188 class CompressedTraceDataEndpoint : public TraceDataEndpoint { | 161 class CompressedTraceDataEndpoint : public TraceDataEndpoint { |
| 189 public: | 162 public: |
| 190 explicit CompressedTraceDataEndpoint( | 163 explicit CompressedTraceDataEndpoint( |
| 191 scoped_refptr<TraceDataEndpoint> endpoint) | 164 scoped_refptr<TraceDataEndpoint> endpoint) |
| 192 : endpoint_(endpoint), already_tried_open_(false) {} | 165 : endpoint_(endpoint), already_tried_open_(false) {} |
| 193 | 166 |
| 194 void ReceiveTraceChunk(std::unique_ptr<std::string> chunk) override { | 167 void ReceiveTraceChunk(std::unique_ptr<std::string> chunk) override { |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 return new StringTraceDataEndpoint(callback); | 310 return new StringTraceDataEndpoint(callback); |
| 338 } | 311 } |
| 339 | 312 |
| 340 scoped_refptr<TracingController::TraceDataSink> | 313 scoped_refptr<TracingController::TraceDataSink> |
| 341 TracingControllerImpl::CreateJSONSink( | 314 TracingControllerImpl::CreateJSONSink( |
| 342 scoped_refptr<TraceDataEndpoint> endpoint) { | 315 scoped_refptr<TraceDataEndpoint> endpoint) { |
| 343 return new JSONTraceDataSink(endpoint); | 316 return new JSONTraceDataSink(endpoint); |
| 344 } | 317 } |
| 345 | 318 |
| 346 } // namespace content | 319 } // namespace content |
| OLD | NEW |