| 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 <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 public base::SupportsWeakPtr<TracingMessageHandler>, | 58 public base::SupportsWeakPtr<TracingMessageHandler>, |
| 59 public TraceSubscriber { | 59 public TraceSubscriber { |
| 60 public: | 60 public: |
| 61 TracingMessageHandler(); | 61 TracingMessageHandler(); |
| 62 virtual ~TracingMessageHandler(); | 62 virtual ~TracingMessageHandler(); |
| 63 | 63 |
| 64 // WebUIMessageHandler implementation. | 64 // WebUIMessageHandler implementation. |
| 65 virtual void RegisterMessages(); | 65 virtual void RegisterMessages(); |
| 66 | 66 |
| 67 // SelectFileDialog::Listener implementation | 67 // SelectFileDialog::Listener implementation |
| 68 virtual void FileSelected(const FilePath& path, int index, void* params); | 68 virtual void FileSelected(const base::FilePath& path, |
| 69 int index, |
| 70 void* params); |
| 69 virtual void FileSelectionCanceled(void* params); | 71 virtual void FileSelectionCanceled(void* params); |
| 70 | 72 |
| 71 // TraceSubscriber implementation. | 73 // TraceSubscriber implementation. |
| 72 virtual void OnEndTracingComplete(); | 74 virtual void OnEndTracingComplete(); |
| 73 virtual void OnTraceDataCollected( | 75 virtual void OnTraceDataCollected( |
| 74 const scoped_refptr<base::RefCountedString>& trace_fragment); | 76 const scoped_refptr<base::RefCountedString>& trace_fragment); |
| 75 virtual void OnTraceBufferPercentFullReply(float percent_full); | 77 virtual void OnTraceBufferPercentFullReply(float percent_full); |
| 76 | 78 |
| 77 // Messages. | 79 // Messages. |
| 78 void OnTracingControllerInitialized(const ListValue* list); | 80 void OnTracingControllerInitialized(const ListValue* list); |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 } | 207 } |
| 206 } | 208 } |
| 207 | 209 |
| 208 void TracingMessageHandler::OnBeginRequestBufferPercentFull( | 210 void TracingMessageHandler::OnBeginRequestBufferPercentFull( |
| 209 const ListValue* list) { | 211 const ListValue* list) { |
| 210 TraceController::GetInstance()->GetTraceBufferPercentFullAsync(this); | 212 TraceController::GetInstance()->GetTraceBufferPercentFullAsync(this); |
| 211 } | 213 } |
| 212 | 214 |
| 213 // A callback used for asynchronously reading a file to a string. Calls the | 215 // A callback used for asynchronously reading a file to a string. Calls the |
| 214 // TaskProxy callback when reading is complete. | 216 // TaskProxy callback when reading is complete. |
| 215 void ReadTraceFileCallback(TaskProxy* proxy, const FilePath& path) { | 217 void ReadTraceFileCallback(TaskProxy* proxy, const base::FilePath& path) { |
| 216 std::string file_contents; | 218 std::string file_contents; |
| 217 if (!file_util::ReadFileToString(path, &file_contents)) | 219 if (!file_util::ReadFileToString(path, &file_contents)) |
| 218 return; | 220 return; |
| 219 | 221 |
| 220 // We need to escape the file contents, because it will go into a javascript | 222 // We need to escape the file contents, because it will go into a javascript |
| 221 // quoted string in TracingMessageHandler::LoadTraceFileComplete. We need to | 223 // quoted string in TracingMessageHandler::LoadTraceFileComplete. We need to |
| 222 // escape control characters (to have well-formed javascript statements), as | 224 // escape control characters (to have well-formed javascript statements), as |
| 223 // well as \ and ' (the only special characters in a ''-quoted string). | 225 // well as \ and ' (the only special characters in a ''-quoted string). |
| 224 // Do the escaping on this thread, it may take a little while for big files | 226 // Do the escaping on this thread, it may take a little while for big files |
| 225 // and we don't want to block the UI during that time. Also do the UTF-16 | 227 // and we don't want to block the UI during that time. Also do the UTF-16 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 248 | 250 |
| 249 BrowserThread::PostTask( | 251 BrowserThread::PostTask( |
| 250 BrowserThread::UI, FROM_HERE, | 252 BrowserThread::UI, FROM_HERE, |
| 251 base::Bind(&TaskProxy::LoadTraceFileCompleteProxy, proxy, | 253 base::Bind(&TaskProxy::LoadTraceFileCompleteProxy, proxy, |
| 252 contents16.release())); | 254 contents16.release())); |
| 253 } | 255 } |
| 254 | 256 |
| 255 // A callback used for asynchronously writing a file from a string. Calls the | 257 // A callback used for asynchronously writing a file from a string. Calls the |
| 256 // TaskProxy callback when writing is complete. | 258 // TaskProxy callback when writing is complete. |
| 257 void WriteTraceFileCallback(TaskProxy* proxy, | 259 void WriteTraceFileCallback(TaskProxy* proxy, |
| 258 const FilePath& path, | 260 const base::FilePath& path, |
| 259 std::string* contents) { | 261 std::string* contents) { |
| 260 if (!file_util::WriteFile(path, contents->c_str(), contents->size())) | 262 if (!file_util::WriteFile(path, contents->c_str(), contents->size())) |
| 261 return; | 263 return; |
| 262 | 264 |
| 263 BrowserThread::PostTask( | 265 BrowserThread::PostTask( |
| 264 BrowserThread::UI, FROM_HERE, | 266 BrowserThread::UI, FROM_HERE, |
| 265 base::Bind(&TaskProxy::SaveTraceFileCompleteProxy, proxy)); | 267 base::Bind(&TaskProxy::SaveTraceFileCompleteProxy, proxy)); |
| 266 } | 268 } |
| 267 | 269 |
| 268 void TracingMessageHandler::FileSelected( | 270 void TracingMessageHandler::FileSelected( |
| 269 const FilePath& path, int index, void* params) { | 271 const base::FilePath& path, int index, void* params) { |
| 270 if (select_trace_file_dialog_type_ == | 272 if (select_trace_file_dialog_type_ == |
| 271 ui::SelectFileDialog::SELECT_OPEN_FILE) { | 273 ui::SelectFileDialog::SELECT_OPEN_FILE) { |
| 272 BrowserThread::PostTask( | 274 BrowserThread::PostTask( |
| 273 BrowserThread::FILE, FROM_HERE, | 275 BrowserThread::FILE, FROM_HERE, |
| 274 base::Bind(&ReadTraceFileCallback, | 276 base::Bind(&ReadTraceFileCallback, |
| 275 make_scoped_refptr(new TaskProxy(AsWeakPtr())), path)); | 277 make_scoped_refptr(new TaskProxy(AsWeakPtr())), path)); |
| 276 } else { | 278 } else { |
| 277 BrowserThread::PostTask( | 279 BrowserThread::PostTask( |
| 278 BrowserThread::FILE, FROM_HERE, | 280 BrowserThread::FILE, FROM_HERE, |
| 279 base::Bind(&WriteTraceFileCallback, | 281 base::Bind(&WriteTraceFileCallback, |
| (...skipping 21 matching lines...) Expand all Loading... |
| 301 if (select_trace_file_dialog_.get()) | 303 if (select_trace_file_dialog_.get()) |
| 302 return; | 304 return; |
| 303 select_trace_file_dialog_type_ = ui::SelectFileDialog::SELECT_OPEN_FILE; | 305 select_trace_file_dialog_type_ = ui::SelectFileDialog::SELECT_OPEN_FILE; |
| 304 select_trace_file_dialog_ = ui::SelectFileDialog::Create( | 306 select_trace_file_dialog_ = ui::SelectFileDialog::Create( |
| 305 this, | 307 this, |
| 306 GetContentClient()->browser()->CreateSelectFilePolicy( | 308 GetContentClient()->browser()->CreateSelectFilePolicy( |
| 307 web_ui()->GetWebContents())); | 309 web_ui()->GetWebContents())); |
| 308 select_trace_file_dialog_->SelectFile( | 310 select_trace_file_dialog_->SelectFile( |
| 309 ui::SelectFileDialog::SELECT_OPEN_FILE, | 311 ui::SelectFileDialog::SELECT_OPEN_FILE, |
| 310 string16(), | 312 string16(), |
| 311 FilePath(), | 313 base::FilePath(), |
| 312 NULL, 0, FILE_PATH_LITERAL(""), | 314 NULL, 0, FILE_PATH_LITERAL(""), |
| 313 web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow(), NULL); | 315 web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow(), NULL); |
| 314 } | 316 } |
| 315 | 317 |
| 316 void TracingMessageHandler::LoadTraceFileComplete(string16* contents) { | 318 void TracingMessageHandler::LoadTraceFileComplete(string16* contents) { |
| 317 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 319 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 318 | 320 |
| 319 // We need to pass contents to tracingController.onLoadTraceFileComplete, but | 321 // We need to pass contents to tracingController.onLoadTraceFileComplete, but |
| 320 // that may be arbitrarily big, and IPCs messages are limited in size. So we | 322 // that may be arbitrarily big, and IPCs messages are limited in size. So we |
| 321 // need to cut it into pieces and rebuild the string in Javascript. | 323 // need to cut it into pieces and rebuild the string in Javascript. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 351 trace_data_to_save_.reset(trace_data); | 353 trace_data_to_save_.reset(trace_data); |
| 352 | 354 |
| 353 select_trace_file_dialog_type_ = ui::SelectFileDialog::SELECT_SAVEAS_FILE; | 355 select_trace_file_dialog_type_ = ui::SelectFileDialog::SELECT_SAVEAS_FILE; |
| 354 select_trace_file_dialog_ = ui::SelectFileDialog::Create( | 356 select_trace_file_dialog_ = ui::SelectFileDialog::Create( |
| 355 this, | 357 this, |
| 356 GetContentClient()->browser()->CreateSelectFilePolicy( | 358 GetContentClient()->browser()->CreateSelectFilePolicy( |
| 357 web_ui()->GetWebContents())); | 359 web_ui()->GetWebContents())); |
| 358 select_trace_file_dialog_->SelectFile( | 360 select_trace_file_dialog_->SelectFile( |
| 359 ui::SelectFileDialog::SELECT_SAVEAS_FILE, | 361 ui::SelectFileDialog::SELECT_SAVEAS_FILE, |
| 360 string16(), | 362 string16(), |
| 361 FilePath(), | 363 base::FilePath(), |
| 362 NULL, 0, FILE_PATH_LITERAL(""), | 364 NULL, 0, FILE_PATH_LITERAL(""), |
| 363 web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow(), NULL); | 365 web_ui()->GetWebContents()->GetView()->GetTopLevelNativeWindow(), NULL); |
| 364 } | 366 } |
| 365 | 367 |
| 366 void TracingMessageHandler::SaveTraceFileComplete() { | 368 void TracingMessageHandler::SaveTraceFileComplete() { |
| 367 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 369 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| 368 web_ui()->CallJavascriptFunction("tracingController.onSaveTraceFileComplete"); | 370 web_ui()->CallJavascriptFunction("tracingController.onSaveTraceFileComplete"); |
| 369 } | 371 } |
| 370 | 372 |
| 371 void TracingMessageHandler::OnBeginTracing(const ListValue* args) { | 373 void TracingMessageHandler::OnBeginTracing(const ListValue* args) { |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 TracingUI::TracingUI(WebUI* web_ui) : WebUIController(web_ui) { | 484 TracingUI::TracingUI(WebUI* web_ui) : WebUIController(web_ui) { |
| 483 web_ui->AddMessageHandler(new TracingMessageHandler()); | 485 web_ui->AddMessageHandler(new TracingMessageHandler()); |
| 484 | 486 |
| 485 // Set up the chrome://tracing/ source. | 487 // Set up the chrome://tracing/ source. |
| 486 BrowserContext* browser_context = | 488 BrowserContext* browser_context = |
| 487 web_ui->GetWebContents()->GetBrowserContext(); | 489 web_ui->GetWebContents()->GetBrowserContext(); |
| 488 WebUIDataSource::Add(browser_context, CreateTracingHTMLSource()); | 490 WebUIDataSource::Add(browser_context, CreateTracingHTMLSource()); |
| 489 } | 491 } |
| 490 | 492 |
| 491 } // namespace content | 493 } // namespace content |
| OLD | NEW |