summaryrefslogtreecommitdiffstats
path: root/content/browser/tracing
diff options
context:
space:
mode:
authornduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-02 00:40:23 +0000
committernduca@chromium.org <nduca@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-02 00:40:23 +0000
commit73fbaacc3f807064f911843b943054386e7eacfa (patch)
treeebb5a46a7be72724ab3c854294b0ac59fcd68786 /content/browser/tracing
parent8328f0121a8a3c0d59fc7e2306803f8c6495e079 (diff)
downloadchromium_src-73fbaacc3f807064f911843b943054386e7eacfa.zip
chromium_src-73fbaacc3f807064f911843b943054386e7eacfa.tar.gz
chromium_src-73fbaacc3f807064f911843b943054386e7eacfa.tar.bz2
Harden about:tracing JS<->WebUI protocol for better handling of JSON errors
Moves all handling of JSON parsing into JS, whereas before it was handled before in JS, but under control of WebUI. This lets JS do much better error handling. Pairs with https://codereview.appspot.com/9025044, so DEP roll to past that. [CQ failures are flake] R=dsinclair,piman NOTRY=True Review URL: https://chromiumcodereview.appspot.com/14644002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@197754 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/tracing')
-rw-r--r--content/browser/tracing/tracing_ui.cc32
1 files changed, 21 insertions, 11 deletions
diff --git a/content/browser/tracing/tracing_ui.cc b/content/browser/tracing/tracing_ui.cc
index 1d9574e..8ef5751 100644
--- a/content/browser/tracing/tracing_ui.cc
+++ b/content/browser/tracing/tracing_ui.cc
@@ -344,7 +344,7 @@ void TracingMessageHandler::LoadTraceFileComplete(string16* contents) {
rvh->ExecuteJavascriptInWebFrame(string16(), javascript);
}
rvh->ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(
- "tracingController.onLoadTraceFileComplete(JSON.parse(window.traceData));"
+ "tracingController.onLoadTraceFileComplete(window.traceData);"
"delete window.traceData;"));
}
@@ -425,6 +425,14 @@ void TracingMessageHandler::OnBeginTracing(const base::ListValue* args) {
void TracingMessageHandler::OnEndTracingAsync(const base::ListValue* list) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ // This is really us beginning to end tracing, rather than tracing being truly
+ // over. When this function yields, we expect to get some number of
+ // OnTraceDataCollected callbacks, which will append data to window.traceData.
+ // To set up for this, set window.traceData to the empty string.
+ web_ui()->GetWebContents()->GetRenderViewHost()->
+ ExecuteJavascriptInWebFrame(string16(),
+ UTF8ToUTF16("window.traceData = '';"));
+
// TODO(nduca): fix javascript code to make sure trace_enabled_ is always true
// here. triggered a false condition by just clicking stop
// trace a few times when it was going slow, and maybe switching
@@ -455,7 +463,11 @@ void TracingMessageHandler::OnEndTracingComplete() {
return;
#endif
}
- web_ui()->CallJavascriptFunction("tracingController.onEndTracingComplete");
+
+ RenderViewHost* rvh = web_ui()->GetWebContents()->GetRenderViewHost();
+ rvh->ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(
+ "tracingController.onEndTracingComplete(window.traceData);"
+ "delete window.traceData;"));
}
void TracingMessageHandler::OnEndSystemTracingAck(
@@ -474,17 +486,15 @@ void TracingMessageHandler::OnTraceDataCollected(
const scoped_refptr<base::RefCountedString>& trace_fragment) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- base::debug::TraceResultBuffer::SimpleOutput output;
- base::debug::TraceResultBuffer trace_buffer;
- trace_buffer.SetOutputCallback(output.GetCallback());
- output.Append("tracingController.onTraceDataCollected(");
- trace_buffer.Start();
- trace_buffer.AddFragment(trace_fragment->data());
- trace_buffer.Finish();
- output.Append(");");
+ std::string javascript("window.traceData += '");
+ javascript += trace_fragment->data();
+ // 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 += ",';";
web_ui()->GetWebContents()->GetRenderViewHost()->
- ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(output.json_output));
+ ExecuteJavascriptInWebFrame(string16(), UTF8ToUTF16(javascript));
}
void TracingMessageHandler::OnTraceBufferPercentFullReply(float percent_full) {