Index: chrome/browser/safe_json_parser.cc |
diff --git a/chrome/browser/safe_json_parser.cc b/chrome/browser/safe_json_parser.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..df0ce00e795825ed203c4571f9c97a40270e3b6f |
--- /dev/null |
+++ b/chrome/browser/safe_json_parser.cc |
@@ -0,0 +1,85 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/safe_json_parser.h" |
+ |
+#include "chrome/common/chrome_utility_messages.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/utility_process_host.h" |
+ |
+using content::BrowserThread; |
+using content::UtilityProcessHost; |
+ |
+SafeJsonParser::SafeJsonParser(const std::string& unsafe_json, |
+ const SuccessCallback& success_callback, |
+ const ErrorCallback& error_callback) |
+ : unsafe_json_(unsafe_json), |
+ success_callback_(success_callback), |
+ error_callback_(error_callback) {} |
+ |
+void SafeJsonParser::Start() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ BrowserThread::PostTask( |
+ BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&SafeJsonParser::StartWorkOnIOThread, this)); |
+} |
+ |
+SafeJsonParser::~SafeJsonParser() {} |
+ |
+void SafeJsonParser::StartWorkOnIOThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ UtilityProcessHost* host = |
+ UtilityProcessHost::Create( |
+ this, base::MessageLoopProxy::current()); |
+ host->EnableZygote(); |
+ host->Send(new ChromeUtilityMsg_ParseJSON(unsafe_json_)); |
+} |
+ |
+void SafeJsonParser::OnJSONParseSucceeded(const base::ListValue& wrapper) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ const Value* value = NULL; |
+ CHECK(wrapper.Get(0, &value)); |
+ |
+ parsed_json_.reset(value->DeepCopy()); |
+ ReportResults(); |
+} |
+ |
+void SafeJsonParser::OnJSONParseFailed(const std::string& error_message) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ error_ = error_message; |
+ ReportResults(); |
+} |
+ |
+void SafeJsonParser::ReportResults() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&SafeJsonParser::ReportResultOnUIThread, this)); |
+} |
+ |
+void SafeJsonParser::ReportResultOnUIThread() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ if (error_.empty() && parsed_json_) { |
+ if (!success_callback_.is_null()) |
+ success_callback_.Run(parsed_json_.Pass()); |
+ } else { |
+ if (!error_callback_.is_null()) |
+ error_callback_.Run(error_); |
+ } |
+} |
+ |
+bool SafeJsonParser::OnMessageReceived(const IPC::Message& message) { |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(SafeJsonParser, message) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Succeeded, |
+ OnJSONParseSucceeded) |
+ IPC_MESSAGE_HANDLER(ChromeUtilityHostMsg_ParseJSON_Failed, |
+ OnJSONParseFailed) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
+} |