autofill_entry.cc revision eb525c5499e34cc9c4b825d6d9e75bb07cc06ace
1// Copyright 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "components/autofill/core/browser/webdata/autofill_entry.h" 6 7#include <algorithm> 8#include <set> 9 10#include "base/logging.h" 11#include "base/strings/utf_string_conversions.h" 12 13namespace autofill { 14namespace { 15 16// The period after which Autofill entries should expire in days. 17const int64 kExpirationPeriodInDays = 60; 18 19} // namespace 20 21AutofillKey::AutofillKey() {} 22 23AutofillKey::AutofillKey(const base::string16& name, 24 const base::string16& value) 25 : name_(name), 26 value_(value) { 27} 28 29AutofillKey::AutofillKey(const char* name, const char* value) 30 : name_(UTF8ToUTF16(name)), 31 value_(UTF8ToUTF16(value)) { 32} 33 34AutofillKey::AutofillKey(const AutofillKey& key) 35 : name_(key.name()), 36 value_(key.value()) { 37} 38 39AutofillKey::~AutofillKey() {} 40 41bool AutofillKey::operator==(const AutofillKey& key) const { 42 return name_ == key.name() && value_ == key.value(); 43} 44 45bool AutofillKey::operator<(const AutofillKey& key) const { 46 int diff = name_.compare(key.name()); 47 if (diff < 0) { 48 return true; 49 } else if (diff == 0) { 50 return value_.compare(key.value()) < 0; 51 } else { 52 return false; 53 } 54} 55 56AutofillEntry::AutofillEntry(const AutofillKey& key, 57 const std::vector<base::Time>& timestamps) 58 : key_(key) { 59 timestamps_culled_ = CullTimeStamps(timestamps, ×tamps_); 60} 61 62AutofillEntry::~AutofillEntry() {} 63 64bool AutofillEntry::operator==(const AutofillEntry& entry) const { 65 if (!(key_ == entry.key())) 66 return false; 67 68 if (timestamps_.size() != entry.timestamps().size()) 69 return false; 70 71 std::set<base::Time> other_timestamps(entry.timestamps().begin(), 72 entry.timestamps().end()); 73 for (size_t i = 0; i < timestamps_.size(); i++) { 74 if (other_timestamps.count(timestamps_[i]) == 0) 75 return false; 76 } 77 78 return true; 79} 80 81bool AutofillEntry::operator<(const AutofillEntry& entry) const { 82 return key_ < entry.key(); 83} 84 85bool AutofillEntry::IsExpired() const { 86 base::Time time = ExpirationTime(); 87 // TODO(georgey): add DCHECK(!timestamps_.empty()) after conversion of the db 88 // is complete. 89 return (timestamps_.empty() || timestamps_.back() < time); 90} 91 92// static 93base::Time AutofillEntry::ExpirationTime() { 94 return base::Time::Now() - base::TimeDelta::FromDays(kExpirationPeriodInDays); 95} 96 97// Culls the list of timestamps to the first and last used. 98// If sync is enabled, at every browser restart, sync will do a match up of all 99// autofill items on the server with all items on the web db. When webdb loads 100// all the items in memory(for sync to process. The method is 101// |GetAllAutofillEntries|) they will pass through this method for culling. If 102// sync finds any of these items were culled it will updates the server AND the 103// web db with these new timestamps. However after restart if an autofill item 104// exceeds the |kMaxAutofillTimeStamps| it will NOT be written to web db until 105// restart. But sync when uploading to the server will only upload this culled 106// list. Meaning until restart there will be mis-match in timestamps but 107// it should correct itself at startup. 108bool AutofillEntry::CullTimeStamps(const std::vector<base::Time>& source, 109 std::vector<base::Time>* result) { 110 DCHECK(result); 111 DCHECK(&source != result); 112 113 // First copy the source to result. 114 result->clear(); 115 116 if (source.size() <= 2) { 117 result->insert(result->begin(), source.begin(), source.end()); 118 return false; 119 } 120 121 result->push_back(source.front()); 122 result->push_back(source.back()); 123 124 DVLOG(1) << "Culling timestamps. Current count is : " << source.size(); 125 126 return true; 127} 128 129} // namespace autofill 130