| Index: content/browser/tracing/tracing_ui.cc
|
| diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc
|
| index aab652d5bf1f2dc3ae2886460b84a159fde202b0..9b49e70a30167c0ef2ebe5714548091e76679990 100644
|
| --- a/content/browser/tracing/tracing_ui.cc
|
| +++ b/content/browser/tracing/tracing_ui.cc
|
| @@ -73,8 +73,11 @@ class TracingMessageHandler
|
|
|
| // TraceSubscriber implementation.
|
| virtual void OnEndTracingComplete() OVERRIDE;
|
| + virtual void OnShowContinuousSamplingTracingComplete() OVERRIDE;
|
| virtual void OnTraceDataCollected(
|
| const scoped_refptr<base::RefCountedString>& trace_fragment) OVERRIDE;
|
| + virtual void OnContinuousSamplingTraceDataCollected(
|
| + const scoped_refptr<base::RefCountedString>& trace_fragment) OVERRIDE;
|
| virtual void OnTraceBufferPercentFullReply(float percent_full) OVERRIDE;
|
| virtual void OnKnownCategoriesCollected(
|
| const std::set<std::string>& known_categories) OVERRIDE;
|
| @@ -83,6 +86,9 @@ class TracingMessageHandler
|
| void OnTracingControllerInitialized(const base::ListValue* list);
|
| void OnBeginTracing(const base::ListValue* list);
|
| void OnEndTracingAsync(const base::ListValue* list);
|
| + void OnBeginContinuousSamplingTracing(const base::ListValue* list);
|
| + void OnEndContinuousSamplingTracing(const base::ListValue* list);
|
| + void OnShowContinuousSamplingTracingAsync(const base::ListValue* list);
|
| void OnBeginRequestBufferPercentFull(const base::ListValue* list);
|
| void OnLoadTraceFile(const base::ListValue* list);
|
| void OnSaveTraceFile(const base::ListValue* list);
|
| @@ -107,6 +113,9 @@ class TracingMessageHandler
|
| // True while tracing is active.
|
| bool trace_enabled_;
|
|
|
| + // True while continuous sampling is active.
|
| + bool continuous_sampling_trace_enabled_;
|
| +
|
| // True while system tracing is active.
|
| bool system_trace_in_progress_;
|
|
|
| @@ -153,6 +162,7 @@ class TaskProxy : public base::RefCountedThreadSafe<TaskProxy> {
|
| TracingMessageHandler::TracingMessageHandler()
|
| : select_trace_file_dialog_type_(ui::SelectFileDialog::SELECT_NONE),
|
| trace_enabled_(false),
|
| + continuous_sampling_trace_enabled_(false),
|
| system_trace_in_progress_(false) {
|
| }
|
|
|
| @@ -185,6 +195,15 @@ void TracingMessageHandler::RegisterMessages() {
|
| web_ui()->RegisterMessageCallback("endTracingAsync",
|
| base::Bind(&TracingMessageHandler::OnEndTracingAsync,
|
| base::Unretained(this)));
|
| + web_ui()->RegisterMessageCallback("beginContinuousSamplingTracing",
|
| + base::Bind(&TracingMessageHandler::OnBeginContinuousSamplingTracing,
|
| + base::Unretained(this)));
|
| + web_ui()->RegisterMessageCallback("endContinuousSamplingTracing",
|
| + base::Bind(&TracingMessageHandler::OnEndContinuousSamplingTracing,
|
| + base::Unretained(this)));
|
| + web_ui()->RegisterMessageCallback("showContinuousSamplingTracingAsync",
|
| + base::Bind(&TracingMessageHandler::OnShowContinuousSamplingTracingAsync,
|
| + base::Unretained(this)));
|
| web_ui()->RegisterMessageCallback("beginRequestBufferPercentFull",
|
| base::Bind(&TracingMessageHandler::OnBeginRequestBufferPercentFull,
|
| base::Unretained(this)));
|
| @@ -480,6 +499,52 @@ void TracingMessageHandler::OnEndTracingComplete() {
|
| "delete window.traceData;"));
|
| }
|
|
|
| +void TracingMessageHandler::OnBeginContinuousSamplingTracing(
|
| + const base::ListValue* args) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK_EQ(args->GetSize(), (size_t) 0);
|
| +
|
| + continuous_sampling_trace_enabled_ = true;
|
| + TraceController::GetInstance()->BeginContinuousSamplingTracing(this);
|
| +}
|
| +
|
| +void TracingMessageHandler::OnEndContinuousSamplingTracing(
|
| + const base::ListValue* args) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK_EQ(args->GetSize(), (size_t) 0);
|
| +
|
| + continuous_sampling_trace_enabled_ = false;
|
| + TraceController::GetInstance()->EndContinuousSamplingTracing(this);
|
| +}
|
| +
|
| +void TracingMessageHandler::OnShowContinuousSamplingTracingAsync(
|
| + const base::ListValue* list) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + // When this function yields, we expect to get some number of
|
| + // OnContinuousSamplingTraceDataCollected callbacks, which will append data
|
| + // to window.continuousSamplingTraceData. To set up for this, set
|
| + // window.continuousSamplingTraceData to the empty string.
|
| + web_ui()->GetWebContents()->GetRenderViewHost()->
|
| + ExecuteJavascriptInWebFrame(string16(),
|
| + UTF8ToUTF16("window.continuousSamplingTraceData = '';"));
|
| +
|
| + if (!TraceController::GetInstance()->ShowContinuousSamplingTracingAsync(
|
| + this)) {
|
| + OnShowContinuousSamplingTracingComplete();
|
| + }
|
| +}
|
| +
|
| +void TracingMessageHandler::OnShowContinuousSamplingTracingComplete() {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + RenderViewHost* rvh = web_ui()->GetWebContents()->GetRenderViewHost();
|
| + rvh->ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(
|
| + "tracingController.onShowContinuousSamplingTracingComplete"
|
| + "(window.continuousSamplingTraceData);"
|
| + "delete window.continuousSamplingTraceData;"));
|
| +}
|
| +
|
| void TracingMessageHandler::OnEndSystemTracingAck(
|
| const scoped_refptr<base::RefCountedString>& events_str_ptr) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| @@ -510,6 +575,24 @@ void TracingMessageHandler::OnTraceDataCollected(
|
| ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(javascript));
|
| }
|
|
|
| +void TracingMessageHandler::OnContinuousSamplingTraceDataCollected(
|
| + const scoped_refptr<base::RefCountedString>& trace_fragment) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + std::string javascript;
|
| + javascript.reserve(trace_fragment->size() * 2);
|
| + javascript.append("window.continuousSamplingTraceData += \"");
|
| + base::JsonDoubleQuote(trace_fragment->data(), false, &javascript);
|
| +
|
| + // Intentionally append a , to the traceData. This technically causes all
|
| + // traceData that we pass back to JS to end with a comma, but that is actually
|
| + // something the JS side strips away anyway
|
| + javascript.append(",\";");
|
| +
|
| + web_ui()->GetWebContents()->GetRenderViewHost()->
|
| + ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(javascript));
|
| +}
|
| +
|
| void TracingMessageHandler::OnTraceBufferPercentFullReply(float percent_full) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| web_ui()->CallJavascriptFunction(
|
|
|