OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "services/catalog/reader.h" | 5 #include "services/catalog/reader.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/files/file_enumerator.h" | 8 #include "base/files/file_enumerator.h" |
9 #include "base/files/file_util.h" | 9 #include "base/files/file_util.h" |
10 #include "base/json/json_file_value_serializer.h" | 10 #include "base/json/json_file_value_serializer.h" |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) { | 133 void AddEntryToCache(EntryCache* cache, std::unique_ptr<Entry> entry) { |
134 for (auto child : entry->applications()) | 134 for (auto child : entry->applications()) |
135 AddEntryToCache(cache, base::WrapUnique(child)); | 135 AddEntryToCache(cache, base::WrapUnique(child)); |
136 (*cache)[entry->name()] = std::move(entry); | 136 (*cache)[entry->name()] = std::move(entry); |
137 } | 137 } |
138 | 138 |
139 void DoNothing(shell::mojom::ResolveResultPtr) {} | 139 void DoNothing(shell::mojom::ResolveResultPtr) {} |
140 | 140 |
141 } // namespace | 141 } // namespace |
142 | 142 |
143 Reader::Reader(base::TaskRunner* file_task_runner, | 143 // A sequenced task runner is used to guarantee requests are serviced in the |
| 144 // order requested. To do otherwise means we may run callbacks in an |
| 145 // unpredictable order, leading to flake. |
| 146 Reader::Reader(base::SequencedWorkerPool* worker_pool, |
144 ManifestProvider* manifest_provider) | 147 ManifestProvider* manifest_provider) |
145 : file_task_runner_(file_task_runner), | 148 : Reader(manifest_provider) { |
146 manifest_provider_(manifest_provider), | 149 file_task_runner_ = worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( |
147 weak_factory_(this) { | 150 base::SequencedWorkerPool::GetSequenceToken(), |
148 PathService::Get(base::DIR_MODULE, &system_package_dir_); | 151 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); |
149 } | 152 } |
| 153 |
| 154 Reader::Reader(base::SingleThreadTaskRunner* task_runner, |
| 155 ManifestProvider* manifest_provider) |
| 156 : Reader(manifest_provider) { |
| 157 file_task_runner_ = task_runner; |
| 158 } |
| 159 |
150 Reader::~Reader() {} | 160 Reader::~Reader() {} |
151 | 161 |
152 void Reader::Read(const base::FilePath& package_dir, | 162 void Reader::Read(const base::FilePath& package_dir, |
153 EntryCache* cache, | 163 EntryCache* cache, |
154 const base::Closure& read_complete_closure) { | 164 const base::Closure& read_complete_closure) { |
155 file_task_runner_->PostTask( | 165 file_task_runner_->PostTask( |
156 FROM_HERE, | 166 FROM_HERE, |
157 base::Bind(&ScanDir, package_dir, | 167 base::Bind(&ScanDir, package_dir, |
158 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), | 168 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), |
159 cache, base::Bind(&DoNothing)), | 169 cache, base::Bind(&DoNothing)), |
160 base::ThreadTaskRunnerHandle::Get(), | 170 base::ThreadTaskRunnerHandle::Get(), |
161 read_complete_closure)); | 171 read_complete_closure)); |
162 } | 172 } |
163 | 173 |
164 void Reader::CreateEntryForName( | 174 void Reader::CreateEntryForName( |
165 const std::string& mojo_name, | 175 const std::string& mojo_name, |
166 EntryCache* cache, | 176 EntryCache* cache, |
167 const CreateEntryForNameCallback& entry_created_callback) { | 177 const CreateEntryForNameCallback& entry_created_callback) { |
168 std::string manifest_contents; | 178 std::string manifest_contents; |
169 if (manifest_provider_ && | 179 if (manifest_provider_ && |
170 manifest_provider_->GetApplicationManifest(mojo_name, | 180 manifest_provider_->GetApplicationManifest(mojo_name, |
171 &manifest_contents)) { | 181 &manifest_contents)) { |
172 std::unique_ptr<base::Value> manifest_root = | 182 std::unique_ptr<base::Value> manifest_root = |
173 base::JSONReader::Read(manifest_contents); | 183 base::JSONReader::Read(manifest_contents); |
174 base::PostTaskAndReplyWithResult( | 184 base::PostTaskAndReplyWithResult( |
175 file_task_runner_, FROM_HERE, | 185 file_task_runner_.get(), FROM_HERE, |
176 base::Bind(&ProcessManifest, base::Passed(&manifest_root), | 186 base::Bind(&ProcessManifest, base::Passed(&manifest_root), |
177 system_package_dir_), | 187 system_package_dir_), |
178 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), | 188 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
179 cache, entry_created_callback)); | 189 entry_created_callback)); |
180 } else { | 190 } else { |
181 base::PostTaskAndReplyWithResult( | 191 base::PostTaskAndReplyWithResult( |
182 file_task_runner_, FROM_HERE, | 192 file_task_runner_.get(), FROM_HERE, |
183 base::Bind(&ReadManifest, system_package_dir_, mojo_name), | 193 base::Bind(&ReadManifest, system_package_dir_, mojo_name), |
184 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), | 194 base::Bind(&Reader::OnReadManifest, weak_factory_.GetWeakPtr(), cache, |
185 cache, entry_created_callback)); | 195 entry_created_callback)); |
186 } | 196 } |
187 } | 197 } |
188 | 198 |
| 199 Reader::Reader(ManifestProvider* manifest_provider) |
| 200 : manifest_provider_(manifest_provider), weak_factory_(this) { |
| 201 PathService::Get(base::DIR_MODULE, &system_package_dir_); |
| 202 } |
| 203 |
189 void Reader::OnReadManifest( | 204 void Reader::OnReadManifest( |
190 EntryCache* cache, | 205 EntryCache* cache, |
191 const CreateEntryForNameCallback& entry_created_callback, | 206 const CreateEntryForNameCallback& entry_created_callback, |
192 std::unique_ptr<Entry> entry) { | 207 std::unique_ptr<Entry> entry) { |
193 shell::mojom::ResolveResultPtr result = | 208 shell::mojom::ResolveResultPtr result = |
194 shell::mojom::ResolveResult::From(*entry); | 209 shell::mojom::ResolveResult::From(*entry); |
195 AddEntryToCache(cache, std::move(entry)); | 210 AddEntryToCache(cache, std::move(entry)); |
196 entry_created_callback.Run(std::move(result)); | 211 entry_created_callback.Run(std::move(result)); |
197 } | 212 } |
198 | 213 |
199 } // namespace catalog | 214 } // namespace catalog |
OLD | NEW |