Index: components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc |
diff --git a/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc b/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc |
index 3a76db0b5d0a5be7b9ded4b4062b4ee87db1befb..1767500648951982b01e09dee9beb0976ae13fab 100644 |
--- a/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc |
+++ b/components/autofill/core/browser/webdata/autocomplete_sync_bridge.cc |
@@ -4,14 +4,18 @@ |
#include "components/autofill/core/browser/webdata/autocomplete_sync_bridge.h" |
+#include <unordered_set> |
+ |
#include "base/bind.h" |
#include "base/memory/ptr_util.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "components/autofill/core/browser/webdata/autofill_metadata_change_list.h" |
#include "components/autofill/core/browser/webdata/autofill_table.h" |
#include "components/autofill/core/browser/webdata/autofill_webdata_backend.h" |
#include "components/autofill/core/browser/webdata/autofill_webdata_service.h" |
#include "components/sync/model/entity_data.h" |
#include "components/sync/model/model_type_change_processor.h" |
+#include "components/sync/model/mutable_data_batch.h" |
#include "components/sync/model/sync_error.h" |
#include "net/base/escape.h" |
@@ -26,11 +30,6 @@ void* UserDataKey() { |
return reinterpret_cast<void*>(&user_data_key); |
} |
-const std::string FormatStorageKey(const std::string name, |
- const std::string value) { |
- return net::EscapePath(name) + "|" + net::EscapePath(value); |
-} |
- |
} // namespace |
namespace autofill { |
@@ -95,12 +94,32 @@ void AutocompleteSyncBridge::AutocompleteSyncBridge::GetData( |
StorageKeyList storage_keys, |
DataCallback callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
+ std::unordered_set<std::string> keys_set; |
+ for (const auto& key : storage_keys) { |
+ keys_set.insert(key); |
+ } |
+ |
+ auto batch = base::MakeUnique<syncer::MutableDataBatch>(); |
+ std::vector<AutofillEntry> entries; |
+ GetAutofillTable()->GetAllAutofillEntries(&entries); |
+ for (const AutofillEntry& it : entries) { |
+ std::string key = GetStorageKeyFromAutofillEntry(it); |
+ if (keys_set.find(key) != keys_set.end()) { |
+ batch->Put(key, CreateEntityData(it)); |
+ } |
+ } |
+ callback.Run(syncer::SyncError(), std::move(batch)); |
} |
void AutocompleteSyncBridge::GetAllData(DataCallback callback) { |
DCHECK(thread_checker_.CalledOnValidThread()); |
- NOTIMPLEMENTED(); |
+ auto batch = base::MakeUnique<syncer::MutableDataBatch>(); |
+ std::vector<AutofillEntry> entries; |
+ GetAutofillTable()->GetAllAutofillEntries(&entries); |
+ for (const AutofillEntry& it : entries) { |
+ batch->Put(GetStorageKeyFromAutofillEntry(it), CreateEntityData(it)); |
+ } |
+ callback.Run(syncer::SyncError(), std::move(batch)); |
} |
std::string AutocompleteSyncBridge::GetClientTag( |
@@ -130,4 +149,47 @@ AutofillTable* AutocompleteSyncBridge::GetAutofillTable() const { |
return AutofillTable::FromWebDatabase(web_data_backend_->GetDatabase()); |
} |
+const std::string AutocompleteSyncBridge::GetStorageKeyFromAutofillEntry( |
+ const autofill::AutofillEntry& entry) { |
+ return FormatStorageKey(base::UTF16ToUTF8(entry.key().name()), |
+ base::UTF16ToUTF8(entry.key().value())); |
+} |
+ |
+// static |
+const std::string AutocompleteSyncBridge::FormatStorageKey( |
+ const std::string& name, |
+ const std::string& value) { |
+ return net::EscapePath(name) + "|" + net::EscapePath(value); |
+} |
+ |
+// static |
+std::unique_ptr<syncer::EntityData> AutocompleteSyncBridge::CreateEntityData( |
skym
2016/12/19 17:40:08
Looks like you could get away with this being an a
Gang Wu
2016/12/19 23:28:09
Done.
|
+ const AutofillEntry& entry) { |
+ auto entity_data = base::MakeUnique<syncer::EntityData>(); |
+ entity_data->non_unique_name = base::UTF16ToUTF8(entry.key().name()); |
+ sync_pb::AutofillSpecifics* autofill = |
+ entity_data->specifics.mutable_autofill(); |
+ autofill->set_name(base::UTF16ToUTF8(entry.key().name())); |
+ autofill->set_value(base::UTF16ToUTF8(entry.key().value())); |
+ autofill->add_usage_timestamp(entry.date_created().ToInternalValue()); |
+ if (entry.date_created() != entry.date_last_used()) |
+ autofill->add_usage_timestamp(entry.date_last_used().ToInternalValue()); |
+ return entity_data; |
+} |
+ |
+// static |
+AutofillEntry AutocompleteSyncBridge::CreateAutofillEntry( |
+ const sync_pb::AutofillSpecifics* autofill_specifics) { |
+ AutofillKey key(autofill_specifics->name().c_str(), |
+ autofill_specifics->value().c_str()); |
+ base::Time date_created, date_last_used; |
+ const google::protobuf::RepeatedField<int64_t>& timestamps = |
+ autofill_specifics->usage_timestamp(); |
+ if (timestamps.size() > 0) { |
+ date_created = base::Time::FromInternalValue(*timestamps.begin()); |
+ date_last_used = base::Time::FromInternalValue(*timestamps.rbegin()); |
+ } |
+ return AutofillEntry(key, date_created, date_last_used); |
+} |
+ |
} // namespace autofill |