#include "components/saved_tab_groups/saved_tab_group_sync_bridge.h"
#include <algorithm>
#include <memory>
#include <string>
#include <unordered_map>
#include <utility>
#include "base/check.h"
#include "base/functional/bind.h"
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/ranges/algorithm.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/trace_event/trace_event.h"
#include "base/uuid.h"
#include "build/build_config.h"
#include "components/prefs/pref_service.h"
#include "components/saved_tab_groups/features.h"
#include "components/saved_tab_groups/pref_names.h"
#include "components/saved_tab_groups/proto/saved_tab_group_data.pb.h"
#include "components/saved_tab_groups/saved_tab_group.h"
#include "components/saved_tab_groups/saved_tab_group_model.h"
#include "components/saved_tab_groups/saved_tab_group_proto_conversions.h"
#include "components/saved_tab_groups/saved_tab_group_tab.h"
#include "components/saved_tab_groups/stats.h"
#include "components/saved_tab_groups/types.h"
#include "components/saved_tab_groups/utils.h"
#include "components/sync/base/data_type.h"
#include "components/sync/base/deletion_origin.h"
#include "components/sync/model/conflict_resolution.h"
#include "components/sync/model/data_type_activation_request.h"
#include "components/sync/model/data_type_local_change_processor.h"
#include "components/sync/model/data_type_store.h"
#include "components/sync/model/entity_change.h"
#include "components/sync/model/metadata_batch.h"
#include "components/sync/model/metadata_change_list.h"
#include "components/sync/model/model_error.h"
#include "components/sync/model/mutable_data_batch.h"
#include "components/sync/protocol/entity_data.h"
#include "components/sync/protocol/saved_tab_group_specifics.pb.h"
namespace tab_groups {
namespace {
constexpr base::TimeDelta kDiscardOrphanedTabsThreshold = …;
bool IsValidSpecifics(const sync_pb::SavedTabGroupSpecifics& specifics) { … }
std::unique_ptr<syncer::EntityData> CreateEntityData(
sync_pb::SavedTabGroupSpecifics specific) { … }
base::Time TimeFromWindowsEpochMicros(int64_t time_windows_epoch_micros) { … }
std::vector<proto::SavedTabGroupData> LoadStoredEntries(
std::vector<proto::SavedTabGroupData> stored_entries,
SavedTabGroupModel* model,
SavedTabGroupSyncBridge::SavedTabGroupLoadCallback on_load_callback) { … }
}
SavedTabGroupSyncBridge::SavedTabGroupSyncBridge(
SavedTabGroupModel* model,
syncer::OnceDataTypeStoreFactory create_store_callback,
std::unique_ptr<syncer::DataTypeLocalChangeProcessor> change_processor,
PrefService* pref_service,
base::OnceCallback<void(std::vector<SavedTabGroup>,
std::vector<SavedTabGroupTab>)> on_load_callback)
: … { … }
SavedTabGroupSyncBridge::~SavedTabGroupSyncBridge() = default;
void SavedTabGroupSyncBridge::OnSyncStarting(
const syncer::DataTypeActivationRequest& request) { … }
std::unique_ptr<syncer::MetadataChangeList>
SavedTabGroupSyncBridge::CreateMetadataChangeList() { … }
std::optional<syncer::ModelError> SavedTabGroupSyncBridge::MergeFullSyncData(
std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
syncer::EntityChangeList entity_changes) { … }
std::optional<syncer::ModelError>
SavedTabGroupSyncBridge::ApplyIncrementalSyncChanges(
std::unique_ptr<syncer::MetadataChangeList> metadata_change_list,
syncer::EntityChangeList entity_changes) { … }
syncer::ConflictResolution SavedTabGroupSyncBridge::ResolveConflict(
const std::string& storage_key,
const syncer::EntityData& remote_data) const { … }
void SavedTabGroupSyncBridge::ApplyDisableSyncChanges(
std::unique_ptr<syncer::MetadataChangeList> delete_metadata_change_list) { … }
std::string SavedTabGroupSyncBridge::GetStorageKey(
const syncer::EntityData& entity_data) { … }
std::string SavedTabGroupSyncBridge::GetClientTag(
const syncer::EntityData& entity_data) { … }
std::unique_ptr<syncer::DataBatch> SavedTabGroupSyncBridge::GetDataForCommit(
StorageKeyList storage_keys) { … }
std::unique_ptr<syncer::DataBatch>
SavedTabGroupSyncBridge::GetAllDataForDebugging() { … }
bool SavedTabGroupSyncBridge::IsEntityDataValid(
const syncer::EntityData& entity_data) const { … }
void SavedTabGroupSyncBridge::SavedTabGroupAddedLocally(
const base::Uuid& guid) { … }
void SavedTabGroupSyncBridge::SavedTabGroupRemovedLocally(
const SavedTabGroup& removed_group) { … }
void SavedTabGroupSyncBridge::SavedTabGroupUpdatedLocally(
const base::Uuid& group_guid,
const std::optional<base::Uuid>& tab_guid) { … }
void SavedTabGroupSyncBridge::SavedTabGroupTabsReorderedLocally(
const base::Uuid& group_guid) { … }
void SavedTabGroupSyncBridge::SavedTabGroupLocalIdChanged(
const base::Uuid& group_guid) { … }
void SavedTabGroupSyncBridge::SavedTabGroupLastUserInteractionTimeUpdated(
const base::Uuid& group_guid) { … }
void SavedTabGroupSyncBridge::SavedTabGroupReorderedLocally() { … }
std::optional<std::string> SavedTabGroupSyncBridge::GetLocalCacheGuid() const { … }
bool SavedTabGroupSyncBridge::IsSyncing() const { … }
SavedTabGroup SavedTabGroupSyncBridge::SpecificsToSavedTabGroupForTest(
const sync_pb::SavedTabGroupSpecifics& specifics) { … }
sync_pb::SavedTabGroupSpecifics
SavedTabGroupSyncBridge::SavedTabGroupToSpecificsForTest(
const SavedTabGroup& group) { … }
SavedTabGroupTab SavedTabGroupSyncBridge::SpecificsToSavedTabGroupTabForTest(
const sync_pb::SavedTabGroupSpecifics& specifics) { … }
sync_pb::SavedTabGroupSpecifics
SavedTabGroupSyncBridge::SavedTabGroupTabToSpecificsForTest(
const SavedTabGroupTab& tab) { … }
SavedTabGroup SavedTabGroupSyncBridge::DataToSavedTabGroupForTest(
const proto::SavedTabGroupData& data) { … }
proto::SavedTabGroupData SavedTabGroupSyncBridge::SavedTabGroupToDataForTest(
const SavedTabGroup& group) { … }
SavedTabGroupTab SavedTabGroupSyncBridge::DataToSavedTabGroupTabForTest(
const proto::SavedTabGroupData& data) { … }
proto::SavedTabGroupData SavedTabGroupSyncBridge::SavedTabGroupTabToDataForTest(
const SavedTabGroupTab& tab) { … }
void SavedTabGroupSyncBridge::UpsertEntitySpecific(
const proto::SavedTabGroupData& data,
syncer::DataTypeStore::WriteBatch* write_batch) { … }
void SavedTabGroupSyncBridge::RemoveEntitySpecific(
const base::Uuid& guid,
syncer::DataTypeStore::WriteBatch* write_batch) { … }
void SavedTabGroupSyncBridge::AddDataToLocalStorage(
const sync_pb::SavedTabGroupSpecifics& specifics,
syncer::MetadataChangeList* metadata_change_list,
syncer::DataTypeStore::WriteBatch* write_batch,
bool notify_sync) { … }
void SavedTabGroupSyncBridge::DeleteDataFromLocalStorage(
const base::Uuid& guid,
syncer::DataTypeStore::WriteBatch* write_batch) { … }
void SavedTabGroupSyncBridge::ResolveTabsMissingGroups(
syncer::DataTypeStore::WriteBatch* write_batch) { … }
void SavedTabGroupSyncBridge::AddEntryToBatch(syncer::MutableDataBatch* batch,
proto::SavedTabGroupData data) { … }
void SavedTabGroupSyncBridge::SendToSync(
sync_pb::SavedTabGroupSpecifics specific,
syncer::MetadataChangeList* metadata_change_list) { … }
void SavedTabGroupSyncBridge::OnStoreCreated(
SavedTabGroupLoadCallback on_load_callback,
const std::optional<syncer::ModelError>& error,
std::unique_ptr<syncer::DataTypeStore> store) { … }
void SavedTabGroupSyncBridge::OnDatabaseLoad(
SavedTabGroupLoadCallback on_load_callback,
const std::optional<syncer::ModelError>& error,
std::unique_ptr<syncer::DataTypeStore::RecordList> entries) { … }
void SavedTabGroupSyncBridge::MigrateSpecificsToSavedTabGroupData(
SavedTabGroupLoadCallback on_load_callback,
std::unique_ptr<syncer::DataTypeStore::RecordList> entries) { … }
void SavedTabGroupSyncBridge::OnSpecificsToDataMigrationComplete(
SavedTabGroupLoadCallback on_load_callback,
const std::optional<syncer::ModelError>& error) { … }
void SavedTabGroupSyncBridge::OnReadAllMetadata(
SavedTabGroupLoadCallback on_load_callback,
std::unique_ptr<syncer::DataTypeStore::RecordList> entries,
const std::optional<syncer::ModelError>& error,
std::unique_ptr<syncer::MetadataBatch> metadata_batch) { … }
void SavedTabGroupSyncBridge::OnDatabaseSave(
const std::optional<syncer::ModelError>& error) { … }
void SavedTabGroupSyncBridge::UpdateLocalCacheGuidForGroups(
syncer::DataTypeStore::WriteBatch* write_batch) { … }
bool SavedTabGroupSyncBridge::IsRemoteGroup(const SavedTabGroup& group) { … }
}