Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(941)

Unified Diff: components/safe_json/safe_json_parser_impl.cc

Issue 1948303002: Re-land: Convert the utility process JSON parser into a Mojo service. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 63cabaf90cecd501c5d934f4e27c552c171cb498..18ae83eb7ecf8fafc03479b5ccd6888f914511df 100644
--- a/components/safe_json/safe_json_parser_impl.cc
+++ b/components/safe_json/safe_json_parser_impl.cc
@@ -12,11 +12,10 @@
#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;
@@ -29,37 +28,54 @@ SafeJsonParserImpl::SafeJsonParserImpl(const std::string& unsafe_json,
const ErrorCallback& error_callback)
: unsafe_json_(unsafe_json),
success_callback_(success_callback),
- error_callback_(error_callback) {}
+ error_callback_(error_callback) {
+ io_thread_checker_.DetachFromThread();
+}
SafeJsonParserImpl::~SafeJsonParserImpl() {
}
void SafeJsonParserImpl::StartWorkOnIOThread() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- UtilityProcessHost* host = UtilityProcessHost::Create(
- this, base::ThreadTaskRunnerHandle::Get().get());
- host->SetName(
+ 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(
l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_JSON_PARSER_NAME));
- host->Send(new SafeJsonParserMsg_ParseJSON(unsafe_json_));
-}
-
-void SafeJsonParserImpl::OnJSONParseSucceeded(const base::ListValue& wrapper) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- const base::Value* value = NULL;
- CHECK(wrapper.Get(0, &value));
+ if (!utility_process_host_->Start()) {
+ ReportResults();
+ return;
+ }
- parsed_json_.reset(value->DeepCopy());
- ReportResults();
-}
+ 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::OnJSONParseFailed(const std::string& error_message) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
- error_ = error_message;
- ReportResults();
+ service_->Parse(unsafe_json_,
+ base::Bind(&SafeJsonParserImpl::OnParseDone, this));
}
void SafeJsonParserImpl::ReportResults() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
+ // 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();
caller_task_runner_->PostTask(
FROM_HERE,
@@ -78,15 +94,20 @@ void SafeJsonParserImpl::ReportResultsOnOriginThread() {
}
bool SafeJsonParserImpl::OnMessageReceived(const IPC::Message& message) {
- 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;
+ 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();
}
void SafeJsonParserImpl::Start() {
« no previous file with comments | « components/safe_json/safe_json_parser_impl.h ('k') | components/safe_json/safe_json_parser_message_filter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698