| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "components/browser_sync/browser/profile_sync_service.h" | 5 #include "components/browser_sync/browser/profile_sync_service.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <cstddef> | 9 #include <cstddef> |
| 10 #include <map> | 10 #include <map> |
| 11 #include <utility> | 11 #include <utility> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/bind.h" | 14 #include "base/bind.h" |
| 15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 16 #include "base/callback.h" | 16 #include "base/callback.h" |
| 17 #include "base/command_line.h" | 17 #include "base/command_line.h" |
| 18 #include "base/compiler_specific.h" | 18 #include "base/compiler_specific.h" |
| 19 #include "base/feature_list.h" | 19 #include "base/feature_list.h" |
| 20 #include "base/files/file_util.h" | 20 #include "base/files/file_util.h" |
| 21 #include "base/logging.h" | 21 #include "base/logging.h" |
| 22 #include "base/macros.h" | 22 #include "base/macros.h" |
| 23 #include "base/memory/ptr_util.h" |
| 23 #include "base/memory/ref_counted.h" | 24 #include "base/memory/ref_counted.h" |
| 24 #include "base/metrics/histogram.h" | 25 #include "base/metrics/histogram.h" |
| 25 #include "base/profiler/scoped_tracker.h" | 26 #include "base/profiler/scoped_tracker.h" |
| 26 #include "base/single_thread_task_runner.h" | 27 #include "base/single_thread_task_runner.h" |
| 27 #include "base/strings/string16.h" | 28 #include "base/strings/string16.h" |
| 28 #include "base/strings/stringprintf.h" | 29 #include "base/strings/stringprintf.h" |
| 29 #include "base/threading/thread_restrictions.h" | 30 #include "base/threading/thread_restrictions.h" |
| 30 #include "base/threading/thread_task_runner_handle.h" | 31 #include "base/threading/thread_task_runner_handle.h" |
| 31 #include "base/time/time.h" | 32 #include "base/time/time.h" |
| 32 #include "build/build_config.h" | 33 #include "build/build_config.h" |
| (...skipping 2161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2194 | 2195 |
| 2195 class GetAllNodesRequestHelper | 2196 class GetAllNodesRequestHelper |
| 2196 : public base::RefCountedThreadSafe<GetAllNodesRequestHelper> { | 2197 : public base::RefCountedThreadSafe<GetAllNodesRequestHelper> { |
| 2197 public: | 2198 public: |
| 2198 GetAllNodesRequestHelper( | 2199 GetAllNodesRequestHelper( |
| 2199 syncer::ModelTypeSet requested_types, | 2200 syncer::ModelTypeSet requested_types, |
| 2200 const base::Callback<void(std::unique_ptr<base::ListValue>)>& callback); | 2201 const base::Callback<void(std::unique_ptr<base::ListValue>)>& callback); |
| 2201 | 2202 |
| 2202 void OnReceivedNodesForTypes( | 2203 void OnReceivedNodesForTypes( |
| 2203 const std::vector<syncer::ModelType>& types, | 2204 const std::vector<syncer::ModelType>& types, |
| 2204 ScopedVector<base::ListValue> scoped_node_lists); | 2205 std::vector<std::unique_ptr<base::ListValue>> scoped_node_lists); |
| 2205 | 2206 |
| 2206 private: | 2207 private: |
| 2207 friend class base::RefCountedThreadSafe<GetAllNodesRequestHelper>; | 2208 friend class base::RefCountedThreadSafe<GetAllNodesRequestHelper>; |
| 2208 virtual ~GetAllNodesRequestHelper(); | 2209 virtual ~GetAllNodesRequestHelper(); |
| 2209 | 2210 |
| 2210 std::unique_ptr<base::ListValue> result_accumulator_; | 2211 std::unique_ptr<base::ListValue> result_accumulator_; |
| 2211 | 2212 |
| 2212 syncer::ModelTypeSet awaiting_types_; | 2213 syncer::ModelTypeSet awaiting_types_; |
| 2213 base::Callback<void(std::unique_ptr<base::ListValue>)> callback_; | 2214 base::Callback<void(std::unique_ptr<base::ListValue>)> callback_; |
| 2214 }; | 2215 }; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2225 DLOG(WARNING) | 2226 DLOG(WARNING) |
| 2226 << "GetAllNodesRequest deleted before request was fulfilled. " | 2227 << "GetAllNodesRequest deleted before request was fulfilled. " |
| 2227 << "Missing types are: " << ModelTypeSetToString(awaiting_types_); | 2228 << "Missing types are: " << ModelTypeSetToString(awaiting_types_); |
| 2228 } | 2229 } |
| 2229 } | 2230 } |
| 2230 | 2231 |
| 2231 // Called when the set of nodes for a type or set of types has been returned. | 2232 // Called when the set of nodes for a type or set of types has been returned. |
| 2232 // | 2233 // |
| 2233 // The nodes for several types can be returned at the same time by specifying | 2234 // The nodes for several types can be returned at the same time by specifying |
| 2234 // their types in the |types| array, and putting their results at the | 2235 // their types in the |types| array, and putting their results at the |
| 2235 // correspnding indices in the |scoped_node_lists|. | 2236 // corresponding indices in the |node_lists|. |
| 2236 void GetAllNodesRequestHelper::OnReceivedNodesForTypes( | 2237 void GetAllNodesRequestHelper::OnReceivedNodesForTypes( |
| 2237 const std::vector<syncer::ModelType>& types, | 2238 const std::vector<syncer::ModelType>& types, |
| 2238 ScopedVector<base::ListValue> scoped_node_lists) { | 2239 std::vector<std::unique_ptr<base::ListValue>> node_lists) { |
| 2239 DCHECK_EQ(types.size(), scoped_node_lists.size()); | 2240 DCHECK_EQ(types.size(), node_lists.size()); |
| 2240 | |
| 2241 // Take unsafe ownership of the node list. | |
| 2242 std::vector<base::ListValue*> node_lists; | |
| 2243 scoped_node_lists.release(&node_lists); | |
| 2244 | 2241 |
| 2245 for (size_t i = 0; i < node_lists.size() && i < types.size(); ++i) { | 2242 for (size_t i = 0; i < node_lists.size() && i < types.size(); ++i) { |
| 2246 const ModelType type = types[i]; | 2243 const ModelType type = types[i]; |
| 2247 base::ListValue* node_list = node_lists[i]; | 2244 std::unique_ptr<base::Value> node_list = std::move(node_lists[i]); |
| 2248 | 2245 |
| 2249 // Add these results to our list. | 2246 // Add these results to our list. |
| 2250 std::unique_ptr<base::DictionaryValue> type_dict( | 2247 std::unique_ptr<base::DictionaryValue> type_dict( |
| 2251 new base::DictionaryValue()); | 2248 new base::DictionaryValue()); |
| 2252 type_dict->SetString("type", ModelTypeToString(type)); | 2249 type_dict->SetString("type", ModelTypeToString(type)); |
| 2253 type_dict->Set("nodes", node_list); | 2250 type_dict->Set("nodes", std::move(node_list)); |
| 2254 result_accumulator_->Append(std::move(type_dict)); | 2251 result_accumulator_->Append(std::move(type_dict)); |
| 2255 | 2252 |
| 2256 // Remember that this part of the request is satisfied. | 2253 // Remember that this part of the request is satisfied. |
| 2257 awaiting_types_.Remove(type); | 2254 awaiting_types_.Remove(type); |
| 2258 } | 2255 } |
| 2259 | 2256 |
| 2260 if (awaiting_types_.Empty()) { | 2257 if (awaiting_types_.Empty()) { |
| 2261 callback_.Run(std::move(result_accumulator_)); | 2258 callback_.Run(std::move(result_accumulator_)); |
| 2262 callback_.Reset(); | 2259 callback_.Reset(); |
| 2263 } | 2260 } |
| 2264 } | 2261 } |
| 2265 | 2262 |
| 2266 } // namespace | 2263 } // namespace |
| 2267 | 2264 |
| 2268 void ProfileSyncService::GetAllNodes( | 2265 void ProfileSyncService::GetAllNodes( |
| 2269 const base::Callback<void(std::unique_ptr<base::ListValue>)>& callback) { | 2266 const base::Callback<void(std::unique_ptr<base::ListValue>)>& callback) { |
| 2270 // TODO(stanisc): crbug.com/328606: Make this work for USS datatypes. | 2267 // TODO(stanisc): crbug.com/328606: Make this work for USS datatypes. |
| 2271 ModelTypeSet all_types = GetRegisteredDataTypes(); | 2268 ModelTypeSet all_types = GetRegisteredDataTypes(); |
| 2272 all_types.PutAll(syncer::ControlTypes()); | 2269 all_types.PutAll(syncer::ControlTypes()); |
| 2273 scoped_refptr<GetAllNodesRequestHelper> helper = | 2270 scoped_refptr<GetAllNodesRequestHelper> helper = |
| 2274 new GetAllNodesRequestHelper(all_types, callback); | 2271 new GetAllNodesRequestHelper(all_types, callback); |
| 2275 | 2272 |
| 2276 if (!backend_initialized_) { | 2273 if (!backend_initialized_) { |
| 2277 // If there's no backend available to fulfill the request, handle it here. | 2274 // If there's no backend available to fulfill the request, handle it here. |
| 2278 ScopedVector<base::ListValue> empty_results; | 2275 std::vector<std::unique_ptr<base::ListValue>> empty_results; |
| 2279 std::vector<ModelType> type_vector; | 2276 std::vector<ModelType> type_vector; |
| 2280 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { | 2277 for (ModelTypeSet::Iterator it = all_types.First(); it.Good(); it.Inc()) { |
| 2281 type_vector.push_back(it.Get()); | 2278 type_vector.push_back(it.Get()); |
| 2282 empty_results.push_back(new base::ListValue()); | 2279 empty_results.push_back(base::MakeUnique<base::ListValue>()); |
| 2283 } | 2280 } |
| 2284 helper->OnReceivedNodesForTypes(type_vector, std::move(empty_results)); | 2281 helper->OnReceivedNodesForTypes(type_vector, std::move(empty_results)); |
| 2285 } else { | 2282 } else { |
| 2286 backend_->GetAllNodesForTypes( | 2283 backend_->GetAllNodesForTypes( |
| 2287 all_types, | 2284 all_types, |
| 2288 base::Bind(&GetAllNodesRequestHelper::OnReceivedNodesForTypes, helper)); | 2285 base::Bind(&GetAllNodesRequestHelper::OnReceivedNodesForTypes, helper)); |
| 2289 } | 2286 } |
| 2290 } | 2287 } |
| 2291 | 2288 |
| 2292 bool ProfileSyncService::HasObserver( | 2289 bool ProfileSyncService::HasObserver( |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2533 if (--outstanding_setup_in_progress_handles_ != 0) | 2530 if (--outstanding_setup_in_progress_handles_ != 0) |
| 2534 return; | 2531 return; |
| 2535 | 2532 |
| 2536 DCHECK(startup_controller_->IsSetupInProgress()); | 2533 DCHECK(startup_controller_->IsSetupInProgress()); |
| 2537 startup_controller_->SetSetupInProgress(false); | 2534 startup_controller_->SetSetupInProgress(false); |
| 2538 | 2535 |
| 2539 if (IsBackendInitialized()) | 2536 if (IsBackendInitialized()) |
| 2540 ReconfigureDatatypeManager(); | 2537 ReconfigureDatatypeManager(); |
| 2541 NotifyObservers(); | 2538 NotifyObservers(); |
| 2542 } | 2539 } |
| OLD | NEW |