Index: components/safe_json/safe_json_parser_impl.cc |
diff --git a/components/safe_json/safe_json_parser_impl.cc b/components/safe_json/safe_json_parser_impl.cc |
index 18ae83eb7ecf8fafc03479b5ccd6888f914511df..63cabaf90cecd501c5d934f4e27c552c171cb498 100644 |
--- a/components/safe_json/safe_json_parser_impl.cc |
+++ b/components/safe_json/safe_json_parser_impl.cc |
@@ -12,10 +12,11 @@ |
#include "base/threading/sequenced_task_runner_handle.h" |
#include "base/tuple.h" |
#include "base/values.h" |
+#include "components/safe_json/safe_json_parser_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/utility_process_host.h" |
-#include "content/public/common/service_registry.h" |
#include "grit/components_strings.h" |
+#include "ipc/ipc_message_macros.h" |
#include "ui/base/l10n/l10n_util.h" |
using content::BrowserThread; |
@@ -28,54 +29,37 @@ |
const ErrorCallback& error_callback) |
: unsafe_json_(unsafe_json), |
success_callback_(success_callback), |
- error_callback_(error_callback) { |
- io_thread_checker_.DetachFromThread(); |
-} |
+ error_callback_(error_callback) {} |
SafeJsonParserImpl::~SafeJsonParserImpl() { |
} |
void SafeJsonParserImpl::StartWorkOnIOThread() { |
- DCHECK_CURRENTLY_ON(BrowserThread::IO); |
- DCHECK(io_thread_checker_.CalledOnValidThread()); |
- // TODO(amistry): This UtilityProcessHost dance is likely to be done multiple |
- // times as more tasks are migrated to Mojo. Create some sort of helper class |
- // to eliminate the code duplication. |
- utility_process_host_ = UtilityProcessHost::Create( |
- this, base::ThreadTaskRunnerHandle::Get().get())->AsWeakPtr(); |
- utility_process_host_->SetName( |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ UtilityProcessHost* host = UtilityProcessHost::Create( |
+ this, base::ThreadTaskRunnerHandle::Get().get()); |
+ host->SetName( |
l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_JSON_PARSER_NAME)); |
- if (!utility_process_host_->Start()) { |
- ReportResults(); |
- return; |
- } |
+ host->Send(new SafeJsonParserMsg_ParseJSON(unsafe_json_)); |
+} |
- content::ServiceRegistry* service_registry = |
- utility_process_host_->GetServiceRegistry(); |
- service_registry->ConnectToRemoteService(mojo::GetProxy(&service_)); |
- service_.set_connection_error_handler( |
- base::Bind(&SafeJsonParserImpl::ReportResults, this)); |
+void SafeJsonParserImpl::OnJSONParseSucceeded(const base::ListValue& wrapper) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ const base::Value* value = NULL; |
+ CHECK(wrapper.Get(0, &value)); |
- service_->Parse(unsafe_json_, |
- base::Bind(&SafeJsonParserImpl::OnParseDone, this)); |
+ parsed_json_.reset(value->DeepCopy()); |
+ ReportResults(); |
+} |
+ |
+void SafeJsonParserImpl::OnJSONParseFailed(const std::string& error_message) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ error_ = error_message; |
+ ReportResults(); |
} |
void SafeJsonParserImpl::ReportResults() { |
- // There should be a DCHECK_CURRENTLY_ON(BrowserThread::IO) here. However, if |
- // the parser process is still alive on shutdown, this might run on the IO |
- // thread while the IO thread message loop is shutting down. This happens |
- // after the IO thread has unregistered from the BrowserThread list, causing |
- // the DCHECK to fail. |
- DCHECK(io_thread_checker_.CalledOnValidThread()); |
- io_thread_checker_.DetachFromThread(); |
- |
- // Maintain a reference to |this| since either |utility_process_host_| or |
- // |service_| may have the last reference and destroying those might delete |
- // |this|. |
- scoped_refptr<SafeJsonParserImpl> ref(this); |
- // Shut down the utility process if it's still running. |
- delete utility_process_host_.get(); |
- service_.reset(); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
caller_task_runner_->PostTask( |
FROM_HERE, |
@@ -94,20 +78,15 @@ |
} |
bool SafeJsonParserImpl::OnMessageReceived(const IPC::Message& message) { |
- return false; |
-} |
- |
-void SafeJsonParserImpl::OnParseDone(const base::ListValue& wrapper, |
- mojo::String error) { |
- DCHECK(io_thread_checker_.CalledOnValidThread()); |
- if (!wrapper.empty()) { |
- const base::Value* value = NULL; |
- CHECK(wrapper.Get(0, &value)); |
- parsed_json_.reset(value->DeepCopy()); |
- } else { |
- error_ = error.get(); |
- } |
- ReportResults(); |
+ bool handled = true; |
+ IPC_BEGIN_MESSAGE_MAP(SafeJsonParserImpl, message) |
+ IPC_MESSAGE_HANDLER(SafeJsonParserHostMsg_ParseJSON_Succeeded, |
+ OnJSONParseSucceeded) |
+ IPC_MESSAGE_HANDLER(SafeJsonParserHostMsg_ParseJSON_Failed, |
+ OnJSONParseFailed) |
+ IPC_MESSAGE_UNHANDLED(handled = false) |
+ IPC_END_MESSAGE_MAP() |
+ return handled; |
} |
void SafeJsonParserImpl::Start() { |