Index: mojo/services/catalog/catalog.cc |
diff --git a/mojo/services/catalog/catalog.cc b/mojo/services/catalog/catalog.cc |
index bb7285765e19996cf3ef0f11a0fe6eea9a8f30b5..a772ba61011f90ad953965d6c541b0397bd8efa4 100644 |
--- a/mojo/services/catalog/catalog.cc |
+++ b/mojo/services/catalog/catalog.cc |
@@ -6,8 +6,10 @@ |
#include "base/bind.h" |
#include "base/json/json_file_value_serializer.h" |
+#include "base/json/json_reader.h" |
#include "base/strings/string_split.h" |
#include "base/task_runner_util.h" |
+#include "base/thread_task_runner_handle.h" |
#include "mojo/common/url_type_converters.h" |
#include "mojo/services/catalog/entry.h" |
#include "mojo/services/catalog/store.h" |
@@ -71,8 +73,11 @@ ReadManifestResult::~ReadManifestResult() {} |
//////////////////////////////////////////////////////////////////////////////// |
// Catalog, public: |
-Catalog::Catalog(scoped_ptr<Store> store, base::TaskRunner* file_task_runner) |
- : store_(std::move(store)), |
+Catalog::Catalog(scoped_ptr<Store> store, |
+ base::TaskRunner* file_task_runner, |
+ Delegate* delegate) |
+ : delegate_(delegate), |
+ store_(std::move(store)), |
file_task_runner_(file_task_runner), |
weak_factory_(this) { |
PathService::Get(base::DIR_MODULE, &system_package_dir_); |
@@ -134,11 +139,25 @@ void Catalog::ResolveMojoName(const mojo::String& mojo_name, |
if (entry != catalog_.end()) { |
callback.Run(mojo::shell::mojom::ResolveResult::From(*entry->second)); |
} else { |
- base::PostTaskAndReplyWithResult( |
- file_task_runner_, FROM_HERE, |
- base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
- base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
- mojo_name, callback)); |
+ std::string manifest_contents; |
+ if (delegate_ && |
+ delegate_->GetApplicationManifest(mojo_name.To<std::string>(), |
+ &manifest_contents)) { |
+ // We don't invoke the callback synchronously in this case to avoid |
+ // surprising the caller with possible re-entry. |
+ scoped_ptr<ReadManifestResult> result(new ReadManifestResult); |
+ result->manifest_root = base::JSONReader::Read(manifest_contents); |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
+ mojo_name, callback, base::Passed(&result))); |
+ } else { |
+ base::PostTaskAndReplyWithResult( |
+ file_task_runner_, FROM_HERE, |
+ base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
+ base::Bind(&Catalog::OnReadManifest, weak_factory_.GetWeakPtr(), |
+ mojo_name, callback)); |
+ } |
} |
} |