OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/tracing/tracing_ui.h" | 5 #include "content/browser/tracing/tracing_ui.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <memory> | 9 #include <memory> |
10 #include <set> | 10 #include <set> |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
48 for (std::set<std::string>::const_iterator it = categorySet.begin(); | 48 for (std::set<std::string>::const_iterator it = categorySet.begin(); |
49 it != categorySet.end(); it++) { | 49 it != categorySet.end(); it++) { |
50 category_list.AppendString(*it); | 50 category_list.AppendString(*it); |
51 } | 51 } |
52 | 52 |
53 scoped_refptr<base::RefCountedString> res(new base::RefCountedString()); | 53 scoped_refptr<base::RefCountedString> res(new base::RefCountedString()); |
54 base::JSONWriter::Write(category_list, &res->data()); | 54 base::JSONWriter::Write(category_list, &res->data()); |
55 callback.Run(res); | 55 callback.Run(res); |
56 } | 56 } |
57 | 57 |
58 bool GetTracingOptions(const std::string& data64, | |
59 base::trace_event::TraceConfig* trace_config) { | |
60 std::string data; | |
61 if (!base::Base64Decode(data64, &data)) { | |
62 LOG(ERROR) << "Options were not base64 encoded."; | |
63 return false; | |
64 } | |
65 | |
66 std::unique_ptr<base::Value> optionsRaw = base::JSONReader::Read(data); | |
67 if (!optionsRaw) { | |
68 LOG(ERROR) << "Options were not valid JSON"; | |
69 return false; | |
70 } | |
71 base::DictionaryValue* options; | |
72 if (!optionsRaw->GetAsDictionary(&options)) { | |
73 LOG(ERROR) << "Options must be dict"; | |
74 return false; | |
75 } | |
76 | |
77 if (!trace_config) { | |
78 LOG(ERROR) << "trace_config can't be passed as NULL"; | |
79 return false; | |
80 } | |
81 | |
82 bool options_ok = true; | |
83 std::string category_filter_string; | |
84 options_ok &= options->GetString("categoryFilter", &category_filter_string); | |
85 | |
86 std::string record_mode; | |
87 options_ok &= options->GetString("tracingRecordMode", &record_mode); | |
88 | |
89 *trace_config = base::trace_event::TraceConfig(category_filter_string, | |
90 record_mode); | |
91 | |
92 bool enable_systrace; | |
93 options_ok &= options->GetBoolean("useSystemTracing", &enable_systrace); | |
94 if (enable_systrace) | |
95 trace_config->EnableSystrace(); | |
96 | |
97 if (!options_ok) { | |
98 LOG(ERROR) << "Malformed options"; | |
99 return false; | |
100 } | |
101 return true; | |
102 } | |
103 | |
104 void OnRecordingEnabledAck(const WebUIDataSource::GotDataCallback& callback); | 58 void OnRecordingEnabledAck(const WebUIDataSource::GotDataCallback& callback); |
105 | 59 |
106 bool BeginRecording(const std::string& data64, | 60 bool BeginRecording(const std::string& data64, |
107 const WebUIDataSource::GotDataCallback& callback) { | 61 const WebUIDataSource::GotDataCallback& callback) { |
108 base::trace_event::TraceConfig trace_config("", ""); | 62 base::trace_event::TraceConfig trace_config("", ""); |
109 if (!GetTracingOptions(data64, &trace_config)) | 63 if (!TracingUI::GetTracingOptions(data64, &trace_config)) |
110 return false; | 64 return false; |
111 | 65 |
112 return TracingController::GetInstance()->StartTracing( | 66 return TracingController::GetInstance()->StartTracing( |
113 trace_config, | 67 trace_config, |
114 base::Bind(&OnRecordingEnabledAck, callback)); | 68 base::Bind(&OnRecordingEnabledAck, callback)); |
115 } | 69 } |
116 | 70 |
117 void OnRecordingEnabledAck(const WebUIDataSource::GotDataCallback& callback) { | 71 void OnRecordingEnabledAck(const WebUIDataSource::GotDataCallback& callback) { |
118 callback.Run( | 72 callback.Run( |
119 scoped_refptr<base::RefCountedMemory>(new base::RefCountedString())); | 73 scoped_refptr<base::RefCountedMemory>(new base::RefCountedString())); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 trace_uploader_ = delegate_->GetTraceUploader( | 246 trace_uploader_ = delegate_->GetTraceUploader( |
293 BrowserContext::GetDefaultStoragePartition( | 247 BrowserContext::GetDefaultStoragePartition( |
294 web_ui()->GetWebContents()->GetBrowserContext())-> | 248 web_ui()->GetWebContents()->GetBrowserContext())-> |
295 GetURLRequestContext()); | 249 GetURLRequestContext()); |
296 DCHECK(trace_uploader_); | 250 DCHECK(trace_uploader_); |
297 trace_uploader_->DoUpload(file_contents, upload_mode, nullptr, | 251 trace_uploader_->DoUpload(file_contents, upload_mode, nullptr, |
298 progress_callback, done_callback); | 252 progress_callback, done_callback); |
299 // TODO(mmandlis): Add support for stopping the upload in progress. | 253 // TODO(mmandlis): Add support for stopping the upload in progress. |
300 } | 254 } |
301 | 255 |
| 256 // static |
| 257 bool TracingUI::GetTracingOptions( |
| 258 const std::string& data64, |
| 259 base::trace_event::TraceConfig* trace_config) { |
| 260 std::string data; |
| 261 if (!base::Base64Decode(data64, &data)) { |
| 262 LOG(ERROR) << "Options were not base64 encoded."; |
| 263 return false; |
| 264 } |
| 265 |
| 266 std::unique_ptr<base::Value> optionsRaw = base::JSONReader::Read(data); |
| 267 if (!optionsRaw) { |
| 268 LOG(ERROR) << "Options were not valid JSON"; |
| 269 return false; |
| 270 } |
| 271 base::DictionaryValue* options; |
| 272 if (!optionsRaw->GetAsDictionary(&options)) { |
| 273 LOG(ERROR) << "Options must be dict"; |
| 274 return false; |
| 275 } |
| 276 |
| 277 if (!trace_config) { |
| 278 LOG(ERROR) << "trace_config can't be passed as NULL"; |
| 279 return false; |
| 280 } |
| 281 |
| 282 // New style options dictionary. |
| 283 if (options->HasKey("included_categories")) { |
| 284 *trace_config = base::trace_event::TraceConfig(*options); |
| 285 return true; |
| 286 } |
| 287 |
| 288 bool options_ok = true; |
| 289 std::string category_filter_string; |
| 290 options_ok &= options->GetString("categoryFilter", &category_filter_string); |
| 291 |
| 292 std::string record_mode; |
| 293 options_ok &= options->GetString("tracingRecordMode", &record_mode); |
| 294 |
| 295 *trace_config = |
| 296 base::trace_event::TraceConfig(category_filter_string, record_mode); |
| 297 |
| 298 bool enable_systrace; |
| 299 options_ok &= options->GetBoolean("useSystemTracing", &enable_systrace); |
| 300 if (enable_systrace) |
| 301 trace_config->EnableSystrace(); |
| 302 |
| 303 if (!options_ok) { |
| 304 LOG(ERROR) << "Malformed options"; |
| 305 return false; |
| 306 } |
| 307 return true; |
| 308 } |
| 309 |
302 void TracingUI::OnTraceUploadProgress(int64_t current, int64_t total) { | 310 void TracingUI::OnTraceUploadProgress(int64_t current, int64_t total) { |
303 DCHECK(current <= total); | 311 DCHECK(current <= total); |
304 int percent = (current / total) * 100; | 312 int percent = (current / total) * 100; |
305 web_ui()->CallJavascriptFunctionUnsafe( | 313 web_ui()->CallJavascriptFunctionUnsafe( |
306 "onUploadProgress", base::Value(percent), | 314 "onUploadProgress", base::Value(percent), |
307 base::Value(base::StringPrintf("%" PRId64, current)), | 315 base::Value(base::StringPrintf("%" PRId64, current)), |
308 base::Value(base::StringPrintf("%" PRId64, total))); | 316 base::Value(base::StringPrintf("%" PRId64, total))); |
309 } | 317 } |
310 | 318 |
311 void TracingUI::OnTraceUploadComplete(bool success, | 319 void TracingUI::OnTraceUploadComplete(bool success, |
312 const std::string& feedback) { | 320 const std::string& feedback) { |
313 if (success) { | 321 if (success) { |
314 web_ui()->CallJavascriptFunctionUnsafe("onUploadComplete", | 322 web_ui()->CallJavascriptFunctionUnsafe("onUploadComplete", |
315 base::Value(feedback)); | 323 base::Value(feedback)); |
316 } else { | 324 } else { |
317 web_ui()->CallJavascriptFunctionUnsafe("onUploadError", | 325 web_ui()->CallJavascriptFunctionUnsafe("onUploadError", |
318 base::Value(feedback)); | 326 base::Value(feedback)); |
319 } | 327 } |
320 trace_uploader_.reset(); | 328 trace_uploader_.reset(); |
321 } | 329 } |
322 | 330 |
323 } // namespace content | 331 } // namespace content |
OLD | NEW |