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 69bc581d9abeccfa8233afa56100ae147dc40ac7..fda9acc450725320e8a45eef47a8fb09cc4b690d 100644 |
--- a/chrome/browser/sync/profile_sync_service.cc |
+++ b/chrome/browser/sync/profile_sync_service.cc |
@@ -51,6 +51,7 @@ |
#include "chrome/browser/sync/glue/synced_device_tracker.h" |
#include "chrome/browser/sync/glue/typed_url_data_type_controller.h" |
#include "chrome/browser/sync/profile_sync_components_factory_impl.h" |
+#include "chrome/browser/sync/profile_sync_service_data_type_provider.h" |
#include "chrome/browser/sync/sessions/notification_service_sessions_router.h" |
#include "chrome/browser/sync/sessions/sessions_sync_manager.h" |
#include "chrome/browser/sync/supervised_user_signin_manager_wrapper.h" |
@@ -1934,7 +1935,7 @@ void ProfileSyncService::ConfigureDataTypeManager() { |
types = syncer::BackupTypes(); |
reason = syncer::CONFIGURE_REASON_BACKUP_ROLLBACK; |
} else { |
- types = GetPreferredDirectoryDataTypes(); |
+ types = Union(GetPreferredDirectoryDataTypes(), GetRequiredDataTypes()); |
if (!HasSyncSetupCompleted()) { |
reason = syncer::CONFIGURE_REASON_NEW_CLIENT; |
} else if (restart) { |
@@ -2293,6 +2294,24 @@ void ProfileSyncService::RemoveTypeDebugInfoObserver( |
} |
} |
+void ProfileSyncService::AddDataTypeProvider( |
+ ProfileSyncServiceDataTypeProvider* provider) { |
+ DCHECK(!HasDataTypeProvider(provider)) << "Providers may only be added once!"; |
+ data_type_providers_.push_back(provider); |
+} |
+ |
+void ProfileSyncService::RemoveDataTypeProvider( |
+ ProfileSyncServiceDataTypeProvider* provider) { |
+ data_type_providers_.remove(provider); |
Bernhard Bauer
2014/07/30 12:38:51
DCHECK the result?
Marc Treib
2014/07/30 13:10:39
There is no result :P
We could DCHECK(HasDataTypeP
Bernhard Bauer
2014/07/30 14:13:20
Yeah, I meant checking whether there is one regist
Marc Treib
2014/08/07 13:05:55
Done.
|
+} |
+ |
+bool ProfileSyncService::HasDataTypeProvider( |
+ ProfileSyncServiceDataTypeProvider* provider) const { |
+ return std::find(data_type_providers_.begin(), |
+ data_type_providers_.end(), |
+ provider) != data_type_providers_.end(); |
+} |
+ |
namespace { |
class GetAllNodesRequestHelper |
@@ -2481,6 +2500,21 @@ void ProfileSyncService::ReconfigureDatatypeManager() { |
} |
} |
+syncer::ModelTypeSet ProfileSyncService::GetRequiredDataTypes() { |
+ syncer::ModelTypeSet types; |
+ std::list<ProfileSyncServiceDataTypeProvider*>::iterator it = |
+ data_type_providers_.begin(); |
+ while (it != data_type_providers_.end()) { |
+ // Dereference and increment the iterator *before* calling the callback, |
+ // because the provider might remove itself from the list in the callback. |
Bernhard Bauer
2014/07/30 12:38:51
I think an easier solution here would be to requir
Marc Treib
2014/07/30 13:10:39
I guess we could. OTOH, this is a fairly common pa
Bernhard Bauer
2014/07/30 14:13:20
Not as common as a standard for loop ;-)
If you k
Marc Treib
2014/08/07 13:05:55
Alright. Bonus side-effect: It doesn't have to be
|
+ ProfileSyncServiceDataTypeProvider* provider = *it; |
+ ++it; |
+ types.PutAll(provider->GetRequiredSyncDataTypes()); |
+ } |
+ // TODO(treib): Resolve pref groups? |
Marc Treib
2014/07/30 11:42:50
It'd be easiest to expose SyncPrefs::ResolvePrefGr
Bernhard Bauer
2014/07/30 12:38:51
Do we actually need that? Required data types coul
Marc Treib
2014/07/30 13:10:39
We could also specify the types explicitly, but I
Bernhard Bauer
2014/07/30 14:13:20
At the very least we would need to change the conc
|
+ return types; |
+} |
+ |
const FailedDataTypesHandler& ProfileSyncService::failed_data_types_handler() |
const { |
return failed_data_types_handler_; |