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

Unified Diff: chrome/browser/sync/profile_sync_service.cc

Issue 224563004: sync: Re-implement getAllNodes WebUI function (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Style fixes + comments Created 6 years, 9 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: chrome/browser/sync/profile_sync_service.cc
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc
index 2e704e3c97434d120980d988e8191fabf7c2be27..71fef00d9318e2041826dc1a22a9a76c2e111d74 100644
--- a/chrome/browser/sync/profile_sync_service.cc
+++ b/chrome/browser/sync/profile_sync_service.cc
@@ -82,7 +82,6 @@
#include "sync/internal_api/public/sync_encryption_handler.h"
#include "sync/internal_api/public/util/experiments.h"
#include "sync/internal_api/public/util/sync_string_conversions.h"
-#include "sync/js/js_arg_list.h"
#include "sync/js/js_event_details.h"
#include "sync/util/cryptographer.h"
#include "ui/base/l10n/l10n_util.h"
@@ -2079,6 +2078,99 @@ void ProfileSyncService::RemoveProtocolEventObserver(
}
}
+namespace {
+
+class GetAllNodesRequestHelper
+ : public base::RefCountedThreadSafe<GetAllNodesRequestHelper> {
+ public:
+ GetAllNodesRequestHelper(
+ syncer::ModelTypeSet requested_types,
+ base::Callback<void(scoped_ptr<base::ListValue>)> callback);
Nicolas Zea 2014/04/04 23:01:27 pass callbacks by const ref, here and elsewhere
rlarocque 2014/04/05 00:07:27 Done.
+
+ void OnReceivedNodesForTypes(
Nicolas Zea 2014/04/04 23:01:27 Comment for method. In particular, what is |types|
rlarocque 2014/04/05 00:07:27 Done.
+ std::vector<syncer::ModelType> types,
Nicolas Zea 2014/04/04 23:01:27 pass types by const ref (and maybe scoped_node_lis
rlarocque 2014/04/05 00:07:27 The scoped_node_list is not const for a reason. T
+ ScopedVector<base::ListValue> scoped_node_lists);
+
+ private:
+ friend class base::RefCountedThreadSafe<GetAllNodesRequestHelper>;
+ ~GetAllNodesRequestHelper();
Nicolas Zea 2014/04/04 23:01:27 virtual
rlarocque 2014/04/05 00:07:27 Done.
+
+ scoped_ptr<base::ListValue> result_accumulator_;
+
+ syncer::ModelTypeSet awaiting_types_;
+ base::Callback<void(scoped_ptr<base::ListValue>)> callback_;
+};
+
+GetAllNodesRequestHelper::GetAllNodesRequestHelper(
+ syncer::ModelTypeSet requested_types,
+ base::Callback<void(scoped_ptr<base::ListValue>)> callback)
+ : result_accumulator_(new base::ListValue()),
Nicolas Zea 2014/04/04 23:01:27 indent by two more spaces
rlarocque 2014/04/05 00:07:27 Done.
+ awaiting_types_(requested_types),
+ callback_(callback) {}
+
+GetAllNodesRequestHelper::~GetAllNodesRequestHelper() {
+ if (!awaiting_types_.Empty()) {
+ DLOG(WARNING)
+ << "GetAllNodesRequest deleted before request was fulfilled. "
+ << "Missing types are: " << ModelTypeSetToString(awaiting_types_);
+ }
+}
+
+void GetAllNodesRequestHelper::OnReceivedNodesForTypes(
+ std::vector<syncer::ModelType> types,
+ ScopedVector<base::ListValue> scoped_node_lists) {
+ DCHECK_EQ(types.size(), scoped_node_lists.size());
+
+ // Take unsafe ownership of the node list.
+ std::vector<base::ListValue*> node_lists;
+ scoped_node_lists.release(&node_lists);
+
+ for (size_t i = 0; i < node_lists.size() && i < types.size(); ++i) {
+ const ModelType type = types[i];
+ base::ListValue* node_list = node_lists[i];
+
+ // Add these results to our list.
+ scoped_ptr<base::DictionaryValue> type_dict(new base::DictionaryValue());
+ type_dict->SetString("type", ModelTypeToString(type));
+ type_dict->Set("nodes", node_list);
+ result_accumulator_->Append(type_dict.release());
+
+ // Remember that this part of the request is satisfied.
+ awaiting_types_.Remove(type);
+ }
+
+ if (awaiting_types_.Empty()) {
+ callback_.Run(result_accumulator_.Pass());
+ callback_ = base::Callback<void(scoped_ptr<base::ListValue>)>();
Nicolas Zea 2014/04/04 23:01:27 callback_.Reset()?
rlarocque 2014/04/05 00:07:27 Thanks. I was looking for that method, but I coul
+ }
+}
+
+} // namespace
+
+void ProfileSyncService::GetAllNodes(
+ base::Callback<void(scoped_ptr<base::ListValue>)> callback) {
+ // TODO(rlarocque): Should be GetRegisteredDirectoryTypes.
+ const ModelTypeSet directory_types = GetRegisteredDataTypes();
+ scoped_refptr<GetAllNodesRequestHelper> helper =
Nicolas Zea 2014/04/04 23:01:27 Do we want to support multiple oustanding requests
rlarocque 2014/04/05 00:07:27 It does support multiple outstanding requests. Th
Nicolas Zea 2014/04/05 00:30:29 I realize it wasn't clear, but I was actually argu
rlarocque 2014/04/05 00:42:05 Fortunately, the UI greys out the refresh button w
+ new GetAllNodesRequestHelper(directory_types, callback);
+
+ if (!backend_initialized_) {
+ // If there's no backend available to fulfill the request, handle it here.
+ ScopedVector<base::ListValue> empty_results;
+ std::vector<ModelType> type_vector;
+ for (ModelTypeSet::Iterator it = directory_types.First();
+ it.Good(); it.Inc()) {
+ type_vector.push_back(it.Get());
+ empty_results.push_back(new base::ListValue());
+ }
+ helper->OnReceivedNodesForTypes(type_vector, empty_results.Pass());
+ } else {
+ backend_->GetAllNodesForTypes(
+ directory_types,
+ base::Bind(&GetAllNodesRequestHelper::OnReceivedNodesForTypes, helper));
+ }
+}
+
bool ProfileSyncService::HasObserver(
ProfileSyncServiceBase::Observer* observer) const {
return observers_.HasObserver(observer);

Powered by Google App Engine
This is Rietveld 408576698