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

Side by Side Diff: chrome/browser/webdata/autocomplete_syncable_service.cc

Issue 10662035: [Sync] Put everything in sync/api into csync namespace (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix comments Created 8 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/webdata/autocomplete_syncable_service.h" 5 #include "chrome/browser/webdata/autocomplete_syncable_service.h"
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/rand_util.h" 9 #include "base/rand_util.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 100
101 AutocompleteSyncableService::~AutocompleteSyncableService() { 101 AutocompleteSyncableService::~AutocompleteSyncableService() {
102 DCHECK(CalledOnValidThread()); 102 DCHECK(CalledOnValidThread());
103 } 103 }
104 104
105 AutocompleteSyncableService::AutocompleteSyncableService() 105 AutocompleteSyncableService::AutocompleteSyncableService()
106 : web_data_service_(NULL) { 106 : web_data_service_(NULL) {
107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB)); 107 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::DB));
108 } 108 }
109 109
110 SyncError AutocompleteSyncableService::MergeDataAndStartSyncing( 110 csync::SyncError AutocompleteSyncableService::MergeDataAndStartSyncing(
111 syncable::ModelType type, 111 syncable::ModelType type,
112 const SyncDataList& initial_sync_data, 112 const csync::SyncDataList& initial_sync_data,
113 scoped_ptr<SyncChangeProcessor> sync_processor, 113 scoped_ptr<csync::SyncChangeProcessor> sync_processor,
114 scoped_ptr<SyncErrorFactory> error_handler) { 114 scoped_ptr<csync::SyncErrorFactory> error_handler) {
115 DCHECK(CalledOnValidThread()); 115 DCHECK(CalledOnValidThread());
116 DCHECK(!sync_processor_.get()); 116 DCHECK(!sync_processor_.get());
117 DCHECK(sync_processor.get()); 117 DCHECK(sync_processor.get());
118 DCHECK(error_handler.get()); 118 DCHECK(error_handler.get());
119 VLOG(1) << "Associating Autocomplete: MergeDataAndStartSyncing"; 119 VLOG(1) << "Associating Autocomplete: MergeDataAndStartSyncing";
120 120
121 error_handler_ = error_handler.Pass(); 121 error_handler_ = error_handler.Pass();
122 std::vector<AutofillEntry> entries; 122 std::vector<AutofillEntry> entries;
123 if (!LoadAutofillData(&entries)) { 123 if (!LoadAutofillData(&entries)) {
124 return error_handler_->CreateAndUploadError( 124 return error_handler_->CreateAndUploadError(
125 FROM_HERE, 125 FROM_HERE,
126 "Could not get the autocomplete data from WebDatabase."); 126 "Could not get the autocomplete data from WebDatabase.");
127 } 127 }
128 128
129 AutocompleteEntryMap new_db_entries; 129 AutocompleteEntryMap new_db_entries;
130 for (std::vector<AutofillEntry>::iterator it = entries.begin(); 130 for (std::vector<AutofillEntry>::iterator it = entries.begin();
131 it != entries.end(); ++it) { 131 it != entries.end(); ++it) {
132 new_db_entries[it->key()] = std::make_pair(SyncChange::ACTION_ADD, it); 132 new_db_entries[it->key()] =
133 std::make_pair(csync::SyncChange::ACTION_ADD, it);
133 } 134 }
134 135
135 sync_processor_ = sync_processor.Pass(); 136 sync_processor_ = sync_processor.Pass();
136 137
137 std::vector<AutofillEntry> new_synced_entries; 138 std::vector<AutofillEntry> new_synced_entries;
138 // Go through and check for all the entries that sync already knows about. 139 // Go through and check for all the entries that sync already knows about.
139 // CreateOrUpdateEntry() will remove entries that are same with the synced 140 // CreateOrUpdateEntry() will remove entries that are same with the synced
140 // ones from |new_db_entries|. 141 // ones from |new_db_entries|.
141 for (SyncDataList::const_iterator sync_iter = initial_sync_data.begin(); 142 for (csync::SyncDataList::const_iterator sync_iter =
143 initial_sync_data.begin();
142 sync_iter != initial_sync_data.end(); ++sync_iter) { 144 sync_iter != initial_sync_data.end(); ++sync_iter) {
143 CreateOrUpdateEntry(*sync_iter, &new_db_entries, &new_synced_entries); 145 CreateOrUpdateEntry(*sync_iter, &new_db_entries, &new_synced_entries);
144 } 146 }
145 147
146 if (!SaveChangesToWebData(new_synced_entries)) { 148 if (!SaveChangesToWebData(new_synced_entries)) {
147 return error_handler_->CreateAndUploadError( 149 return error_handler_->CreateAndUploadError(
148 FROM_HERE, 150 FROM_HERE,
149 "Failed to update webdata."); 151 "Failed to update webdata.");
150 } 152 }
151 153
152 WebDataService::NotifyOfMultipleAutofillChanges(web_data_service_); 154 WebDataService::NotifyOfMultipleAutofillChanges(web_data_service_);
153 155
154 SyncChangeList new_changes; 156 csync::SyncChangeList new_changes;
155 for (AutocompleteEntryMap::iterator i = new_db_entries.begin(); 157 for (AutocompleteEntryMap::iterator i = new_db_entries.begin();
156 i != new_db_entries.end(); ++i) { 158 i != new_db_entries.end(); ++i) {
157 new_changes.push_back( 159 new_changes.push_back(
158 SyncChange(i->second.first, CreateSyncData(*(i->second.second)))); 160 csync::SyncChange(
161 i->second.first, CreateSyncData(*(i->second.second))));
159 } 162 }
160 163
161 if (ShouldCullSyncedData()) { 164 if (ShouldCullSyncedData()) {
162 // This will schedule a deletion operation on the DB thread, which will 165 // This will schedule a deletion operation on the DB thread, which will
163 // trigger a notification to propagate the deletion to Sync. 166 // trigger a notification to propagate the deletion to Sync.
164 web_data_service_->RemoveExpiredFormElements(); 167 web_data_service_->RemoveExpiredFormElements();
165 } 168 }
166 169
167 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); 170 csync::SyncError error =
171 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes);
168 172
169 return error; 173 return error;
170 } 174 }
171 175
172 void AutocompleteSyncableService::StopSyncing(syncable::ModelType type) { 176 void AutocompleteSyncableService::StopSyncing(syncable::ModelType type) {
173 DCHECK(CalledOnValidThread()); 177 DCHECK(CalledOnValidThread());
174 DCHECK_EQ(syncable::AUTOFILL, type); 178 DCHECK_EQ(syncable::AUTOFILL, type);
175 179
176 sync_processor_.reset(NULL); 180 sync_processor_.reset(NULL);
177 error_handler_.reset(); 181 error_handler_.reset();
178 } 182 }
179 183
180 SyncDataList AutocompleteSyncableService::GetAllSyncData( 184 csync::SyncDataList AutocompleteSyncableService::GetAllSyncData(
181 syncable::ModelType type) const { 185 syncable::ModelType type) const {
182 DCHECK(CalledOnValidThread()); 186 DCHECK(CalledOnValidThread());
183 DCHECK(sync_processor_.get()); 187 DCHECK(sync_processor_.get());
184 DCHECK_EQ(type, syncable::AUTOFILL); 188 DCHECK_EQ(type, syncable::AUTOFILL);
185 189
186 SyncDataList current_data; 190 csync::SyncDataList current_data;
187 191
188 std::vector<AutofillEntry> entries; 192 std::vector<AutofillEntry> entries;
189 if (!LoadAutofillData(&entries)) 193 if (!LoadAutofillData(&entries))
190 return current_data; 194 return current_data;
191 195
192 for (std::vector<AutofillEntry>::iterator it = entries.begin(); 196 for (std::vector<AutofillEntry>::iterator it = entries.begin();
193 it != entries.end(); ++it) { 197 it != entries.end(); ++it) {
194 current_data.push_back(CreateSyncData(*it)); 198 current_data.push_back(CreateSyncData(*it));
195 } 199 }
196 200
197 return current_data; 201 return current_data;
198 } 202 }
199 203
200 SyncError AutocompleteSyncableService::ProcessSyncChanges( 204 csync::SyncError AutocompleteSyncableService::ProcessSyncChanges(
201 const tracked_objects::Location& from_here, 205 const tracked_objects::Location& from_here,
202 const SyncChangeList& change_list) { 206 const csync::SyncChangeList& change_list) {
203 DCHECK(CalledOnValidThread()); 207 DCHECK(CalledOnValidThread());
204 DCHECK(sync_processor_.get()); 208 DCHECK(sync_processor_.get());
205 209
206 if (!sync_processor_.get()) { 210 if (!sync_processor_.get()) {
207 SyncError error(FROM_HERE, "Models not yet associated.", 211 csync::SyncError error(FROM_HERE, "Models not yet associated.",
208 syncable::AUTOFILL); 212 syncable::AUTOFILL);
209 return error; 213 return error;
210 } 214 }
211 215
212 // Data is loaded only if we get new ADD/UPDATE change. 216 // Data is loaded only if we get new ADD/UPDATE change.
213 std::vector<AutofillEntry> entries; 217 std::vector<AutofillEntry> entries;
214 scoped_ptr<AutocompleteEntryMap> db_entries; 218 scoped_ptr<AutocompleteEntryMap> db_entries;
215 std::vector<AutofillEntry> new_entries; 219 std::vector<AutofillEntry> new_entries;
216 220
217 SyncError list_processing_error; 221 csync::SyncError list_processing_error;
218 222
219 for (SyncChangeList::const_iterator i = change_list.begin(); 223 for (csync::SyncChangeList::const_iterator i = change_list.begin();
220 i != change_list.end() && !list_processing_error.IsSet(); ++i) { 224 i != change_list.end() && !list_processing_error.IsSet(); ++i) {
221 DCHECK(i->IsValid()); 225 DCHECK(i->IsValid());
222 switch (i->change_type()) { 226 switch (i->change_type()) {
223 case SyncChange::ACTION_ADD: 227 case csync::SyncChange::ACTION_ADD:
224 case SyncChange::ACTION_UPDATE: 228 case csync::SyncChange::ACTION_UPDATE:
225 if (!db_entries.get()) { 229 if (!db_entries.get()) {
226 if (!LoadAutofillData(&entries)) { 230 if (!LoadAutofillData(&entries)) {
227 return error_handler_->CreateAndUploadError( 231 return error_handler_->CreateAndUploadError(
228 FROM_HERE, 232 FROM_HERE,
229 "Could not get the autocomplete data from WebDatabase."); 233 "Could not get the autocomplete data from WebDatabase.");
230 } 234 }
231 db_entries.reset(new AutocompleteEntryMap); 235 db_entries.reset(new AutocompleteEntryMap);
232 for (std::vector<AutofillEntry>::iterator it = entries.begin(); 236 for (std::vector<AutofillEntry>::iterator it = entries.begin();
233 it != entries.end(); ++it) { 237 it != entries.end(); ++it) {
234 (*db_entries)[it->key()] = 238 (*db_entries)[it->key()] =
235 std::make_pair(SyncChange::ACTION_ADD, it); 239 std::make_pair(csync::SyncChange::ACTION_ADD, it);
236 } 240 }
237 } 241 }
238 CreateOrUpdateEntry(i->sync_data(), db_entries.get(), &new_entries); 242 CreateOrUpdateEntry(i->sync_data(), db_entries.get(), &new_entries);
239 break; 243 break;
240 case SyncChange::ACTION_DELETE: { 244 case csync::SyncChange::ACTION_DELETE: {
241 DCHECK(i->sync_data().GetSpecifics().has_autofill()) 245 DCHECK(i->sync_data().GetSpecifics().has_autofill())
242 << "Autofill specifics data not present on delete!"; 246 << "Autofill specifics data not present on delete!";
243 const sync_pb::AutofillSpecifics& autofill = 247 const sync_pb::AutofillSpecifics& autofill =
244 i->sync_data().GetSpecifics().autofill(); 248 i->sync_data().GetSpecifics().autofill();
245 if (autofill.has_value()) { 249 if (autofill.has_value()) {
246 list_processing_error = AutofillEntryDelete(autofill); 250 list_processing_error = AutofillEntryDelete(autofill);
247 } else { 251 } else {
248 DLOG(WARNING) 252 DLOG(WARNING)
249 << "Delete for old-style autofill profile being dropped!"; 253 << "Delete for old-style autofill profile being dropped!";
250 } 254 }
251 } break; 255 } break;
252 default: 256 default:
253 NOTREACHED() << "Unexpected sync change state."; 257 NOTREACHED() << "Unexpected sync change state.";
254 return error_handler_->CreateAndUploadError( 258 return error_handler_->CreateAndUploadError(
255 FROM_HERE, 259 FROM_HERE,
256 "ProcessSyncChanges failed on ChangeType " + 260 "ProcessSyncChanges failed on ChangeType " +
257 SyncChange::ChangeTypeToString(i->change_type())); 261 csync::SyncChange::ChangeTypeToString(i->change_type()));
258 } 262 }
259 } 263 }
260 264
261 if (!SaveChangesToWebData(new_entries)) { 265 if (!SaveChangesToWebData(new_entries)) {
262 return error_handler_->CreateAndUploadError( 266 return error_handler_->CreateAndUploadError(
263 FROM_HERE, 267 FROM_HERE,
264 "Failed to update webdata."); 268 "Failed to update webdata.");
265 } 269 }
266 270
267 WebDataService::NotifyOfMultipleAutofillChanges(web_data_service_); 271 WebDataService::NotifyOfMultipleAutofillChanges(web_data_service_);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 if (!new_entries.empty() && 312 if (!new_entries.empty() &&
309 !web_data_service_->GetDatabase()-> 313 !web_data_service_->GetDatabase()->
310 GetAutofillTable()->UpdateAutofillEntries(new_entries)) { 314 GetAutofillTable()->UpdateAutofillEntries(new_entries)) {
311 return false; 315 return false;
312 } 316 }
313 return true; 317 return true;
314 } 318 }
315 319
316 // Creates or updates an autocomplete entry based on |data|. 320 // Creates or updates an autocomplete entry based on |data|.
317 void AutocompleteSyncableService::CreateOrUpdateEntry( 321 void AutocompleteSyncableService::CreateOrUpdateEntry(
318 const SyncData& data, 322 const csync::SyncData& data,
319 AutocompleteEntryMap* loaded_data, 323 AutocompleteEntryMap* loaded_data,
320 std::vector<AutofillEntry>* new_entries) { 324 std::vector<AutofillEntry>* new_entries) {
321 const sync_pb::EntitySpecifics& specifics = data.GetSpecifics(); 325 const sync_pb::EntitySpecifics& specifics = data.GetSpecifics();
322 const sync_pb::AutofillSpecifics& autofill_specifics( 326 const sync_pb::AutofillSpecifics& autofill_specifics(
323 specifics.autofill()); 327 specifics.autofill());
324 328
325 if (!autofill_specifics.has_value()) { 329 if (!autofill_specifics.has_value()) {
326 DLOG(WARNING) 330 DLOG(WARNING)
327 << "Add/Update for old-style autofill profile being dropped!"; 331 << "Add/Update for old-style autofill profile being dropped!";
328 return; 332 return;
(...skipping 20 matching lines...) Expand all
349 } else { 353 } else {
350 // Entry already present - merge if necessary. 354 // Entry already present - merge if necessary.
351 std::vector<base::Time> timestamps; 355 std::vector<base::Time> timestamps;
352 bool different = MergeTimestamps( 356 bool different = MergeTimestamps(
353 autofill_specifics, it->second.second->timestamps(), &timestamps); 357 autofill_specifics, it->second.second->timestamps(), &timestamps);
354 if (different) { 358 if (different) {
355 AutofillEntry new_entry(it->second.second->key(), timestamps); 359 AutofillEntry new_entry(it->second.second->key(), timestamps);
356 new_entries->push_back(new_entry); 360 new_entries->push_back(new_entry);
357 // Update the sync db if the list of timestamps have changed. 361 // Update the sync db if the list of timestamps have changed.
358 *(it->second.second) = new_entry; 362 *(it->second.second) = new_entry;
359 it->second.first = SyncChange::ACTION_UPDATE; 363 it->second.first = csync::SyncChange::ACTION_UPDATE;
360 } else { 364 } else {
361 loaded_data->erase(it); 365 loaded_data->erase(it);
362 } 366 }
363 } 367 }
364 } 368 }
365 369
366 // static 370 // static
367 void AutocompleteSyncableService::WriteAutofillEntry( 371 void AutocompleteSyncableService::WriteAutofillEntry(
368 const AutofillEntry& entry, sync_pb::EntitySpecifics* autofill_specifics) { 372 const AutofillEntry& entry, sync_pb::EntitySpecifics* autofill_specifics) {
369 sync_pb::AutofillSpecifics* autofill = 373 sync_pb::AutofillSpecifics* autofill =
370 autofill_specifics->mutable_autofill(); 374 autofill_specifics->mutable_autofill();
371 autofill->set_name(UTF16ToUTF8(entry.key().name())); 375 autofill->set_name(UTF16ToUTF8(entry.key().name()));
372 autofill->set_value(UTF16ToUTF8(entry.key().value())); 376 autofill->set_value(UTF16ToUTF8(entry.key().value()));
373 const std::vector<base::Time>& ts(entry.timestamps()); 377 const std::vector<base::Time>& ts(entry.timestamps());
374 for (std::vector<base::Time>::const_iterator timestamp = ts.begin(); 378 for (std::vector<base::Time>::const_iterator timestamp = ts.begin();
375 timestamp != ts.end(); ++timestamp) { 379 timestamp != ts.end(); ++timestamp) {
376 autofill->add_usage_timestamp(timestamp->ToInternalValue()); 380 autofill->add_usage_timestamp(timestamp->ToInternalValue());
377 } 381 }
378 } 382 }
379 383
380 SyncError AutocompleteSyncableService::AutofillEntryDelete( 384 csync::SyncError AutocompleteSyncableService::AutofillEntryDelete(
381 const sync_pb::AutofillSpecifics& autofill) { 385 const sync_pb::AutofillSpecifics& autofill) {
382 if (!web_data_service_->GetDatabase()->GetAutofillTable()->RemoveFormElement( 386 if (!web_data_service_->GetDatabase()->GetAutofillTable()->RemoveFormElement(
383 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) { 387 UTF8ToUTF16(autofill.name()), UTF8ToUTF16(autofill.value()))) {
384 return error_handler_->CreateAndUploadError( 388 return error_handler_->CreateAndUploadError(
385 FROM_HERE, 389 FROM_HERE,
386 "Could not remove autocomplete entry from WebDatabase."); 390 "Could not remove autocomplete entry from WebDatabase.");
387 } 391 }
388 return SyncError(); 392 return csync::SyncError();
389 } 393 }
390 394
391 void AutocompleteSyncableService::ActOnChanges( 395 void AutocompleteSyncableService::ActOnChanges(
392 const AutofillChangeList& changes) { 396 const AutofillChangeList& changes) {
393 DCHECK(sync_processor_.get()); 397 DCHECK(sync_processor_.get());
394 SyncChangeList new_changes; 398 csync::SyncChangeList new_changes;
395 for (AutofillChangeList::const_iterator change = changes.begin(); 399 for (AutofillChangeList::const_iterator change = changes.begin();
396 change != changes.end(); ++change) { 400 change != changes.end(); ++change) {
397 switch (change->type()) { 401 switch (change->type()) {
398 case AutofillChange::ADD: 402 case AutofillChange::ADD:
399 case AutofillChange::UPDATE: { 403 case AutofillChange::UPDATE: {
400 std::vector<base::Time> timestamps; 404 std::vector<base::Time> timestamps;
401 if (!web_data_service_->GetDatabase()-> 405 if (!web_data_service_->GetDatabase()->
402 GetAutofillTable()->GetAutofillTimestamps( 406 GetAutofillTable()->GetAutofillTimestamps(
403 change->key().name(), 407 change->key().name(),
404 change->key().value(), 408 change->key().value(),
405 &timestamps)) { 409 &timestamps)) {
406 NOTREACHED(); 410 NOTREACHED();
407 return; 411 return;
408 } 412 }
409 AutofillEntry entry(change->key(), timestamps); 413 AutofillEntry entry(change->key(), timestamps);
410 SyncChange::SyncChangeType change_type = 414 csync::SyncChange::SyncChangeType change_type =
411 (change->type() == AutofillChange::ADD) ? 415 (change->type() == AutofillChange::ADD) ?
412 SyncChange::ACTION_ADD : SyncChange::ACTION_UPDATE; 416 csync::SyncChange::ACTION_ADD : csync::SyncChange::ACTION_UPDATE;
413 new_changes.push_back(SyncChange(change_type, 417 new_changes.push_back(csync::SyncChange(change_type,
414 CreateSyncData(entry))); 418 CreateSyncData(entry)));
415 break; 419 break;
416 } 420 }
417 case AutofillChange::REMOVE: { 421 case AutofillChange::REMOVE: {
418 std::vector<base::Time> timestamps; 422 std::vector<base::Time> timestamps;
419 AutofillEntry entry(change->key(), timestamps); 423 AutofillEntry entry(change->key(), timestamps);
420 new_changes.push_back(SyncChange(SyncChange::ACTION_DELETE, 424 new_changes.push_back(
421 CreateSyncData(entry))); 425 csync::SyncChange(csync::SyncChange::ACTION_DELETE,
426 CreateSyncData(entry)));
422 break; 427 break;
423 } 428 }
424 default: 429 default:
425 NOTREACHED(); 430 NOTREACHED();
426 break; 431 break;
427 } 432 }
428 } 433 }
429 SyncError error = sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes); 434 csync::SyncError error =
435 sync_processor_->ProcessSyncChanges(FROM_HERE, new_changes);
430 if (error.IsSet()) { 436 if (error.IsSet()) {
431 DLOG(WARNING) << "[AUTOCOMPLETE SYNC]" 437 DLOG(WARNING) << "[AUTOCOMPLETE SYNC]"
432 << " Failed processing change:" 438 << " Failed processing change:"
433 << " Error:" << error.message(); 439 << " Error:" << error.message();
434 } 440 }
435 } 441 }
436 442
437 SyncData AutocompleteSyncableService::CreateSyncData( 443 csync::SyncData AutocompleteSyncableService::CreateSyncData(
438 const AutofillEntry& entry) const { 444 const AutofillEntry& entry) const {
439 sync_pb::EntitySpecifics autofill_specifics; 445 sync_pb::EntitySpecifics autofill_specifics;
440 WriteAutofillEntry(entry, &autofill_specifics); 446 WriteAutofillEntry(entry, &autofill_specifics);
441 std::string tag(KeyToTag(UTF16ToUTF8(entry.key().name()), 447 std::string tag(KeyToTag(UTF16ToUTF8(entry.key().name()),
442 UTF16ToUTF8(entry.key().value()))); 448 UTF16ToUTF8(entry.key().value())));
443 return SyncData::CreateLocalData(tag, tag, autofill_specifics); 449 return csync::SyncData::CreateLocalData(tag, tag, autofill_specifics);
444 } 450 }
445 451
446 // static 452 // static
447 std::string AutocompleteSyncableService::KeyToTag(const std::string& name, 453 std::string AutocompleteSyncableService::KeyToTag(const std::string& name,
448 const std::string& value) { 454 const std::string& value) {
449 std::string ns(kAutofillEntryNamespaceTag); 455 std::string ns(kAutofillEntryNamespaceTag);
450 return ns + net::EscapePath(name) + "|" + net::EscapePath(value); 456 return ns + net::EscapePath(name) + "|" + net::EscapePath(value);
451 } 457 }
OLDNEW
« no previous file with comments | « chrome/browser/webdata/autocomplete_syncable_service.h ('k') | chrome/browser/webdata/autofill_profile_syncable_service.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698