blob: 7caa4ee4c0c6ea3e782fd999be22d73509b732c1 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
#define COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_
#include <vector>
#include "base/compiler_specific.h"
#include "base/gtest_prod_util.h"
#include "base/memory/scoped_vector.h"
#include "base/strings/string16.h"
#include "components/webdata/common/web_database_table.h"
class WebDatabase;
namespace base {
class Time;
}
namespace autofill {
class AutofillChange;
class AutofillEntry;
class AutofillProfile;
class AutofillTableTest;
class CreditCard;
struct FormFieldData;
// This class manages the various Autofill tables within the SQLite database
// passed to the constructor. It expects the following schemas:
//
// Note: The database stores time in seconds, UTC.
//
// autofill
// name The name of the input as specified in the html.
// value The literal contents of the text field.
// value_lower The contents of the text field made lower_case.
// date_created The date on which the user first entered the string
// |value| into a field of name |name|.
// date_last_used The date on which the user last entered the string
// |value| into a field of name |name|.
// count How many times the user has entered the string |value|
// in a field of name |name|.
//
// autofill_profiles This table contains Autofill profile data added by the
// user with the Autofill dialog. Most of the columns are
// standard entries in a contact information form.
//
// guid A guid string to uniquely identify the profile.
// Added in version 31.
// company_name
// street_address The combined lines of the street address.
// Added in version 54.
// dependent_locality
// A sub-classification beneath the city, e.g. an
// inner-city district or suburb. Added in version 54.
// city
// state
// zipcode
// sorting_code Similar to the zipcode column, but used for businesses
// or organizations that might not be geographically
// contiguous. The canonical example is CEDEX in France.
// Added in version 54.
// country_code
// date_modified The date on which this profile was last modified.
// Added in version 30.
// origin The domain of origin for this profile.
// Added in version 50.
// language_code The BCP 47 language code used to format the address for
// display. For example, a JP address with "ja" language
// code starts with the postal code, but a JP address with
// "ja-latn" language code starts with the recipient name.
// Added in version 56.
//
// autofill_profile_names
// This table contains the multi-valued name fields
// associated with a profile.
//
// guid The guid string that identifies the profile to which
// the name belongs.
// first_name
// middle_name
// last_name
// full_name
//
// autofill_profile_emails
// This table contains the multi-valued email fields
// associated with a profile.
//
// guid The guid string that identifies the profile to which
// the email belongs.
// email
//
// autofill_profile_phones
// This table contains the multi-valued phone fields
// associated with a profile.
//
// guid The guid string that identifies the profile to which the
// phone number belongs.
// number
//
// autofill_profiles_trash
// This table contains guids of "trashed" autofill
// profiles. When a profile is removed its guid is added
// to this table so that Sync can perform deferred removal.
//
// guid The guid string that identifies the trashed profile.
//
// credit_cards This table contains credit card data added by the user
// with the Autofill dialog. Most of the columns are
// standard entries in a credit card form.
//
// guid A guid string to uniquely identify the profile.
// Added in version 31.
// name_on_card
// expiration_month
// expiration_year
// card_number_encrypted
// Stores encrypted credit card number.
// date_modified The date on which this entry was last modified.
// Added in version 30.
// origin The domain of origin for this profile.
// Added in version 50.
//
class AutofillTable : public WebDatabaseTable {
public:
explicit AutofillTable(const std::string& app_locale);
~AutofillTable() override;
// Retrieves the AutofillTable* owned by |database|.
static AutofillTable* FromWebDatabase(WebDatabase* db);
WebDatabaseTable::TypeKey GetTypeKey() const override;
bool CreateTablesIfNecessary() override;
bool IsSyncable() override;
bool MigrateToVersion(int version, bool* update_compatible_version) override;
// Records the form elements in |elements| in the database in the
// autofill table. A list of all added and updated autofill entries
// is returned in the changes out parameter.
bool AddFormFieldValues(const std::vector<FormFieldData>& elements,
std::vector<AutofillChange>* changes);
// Records a single form element in the database in the autofill table. A list
// of all added and updated autofill entries is returned in the changes out
// parameter.
bool AddFormFieldValue(const FormFieldData& element,
std::vector<AutofillChange>* changes);
// Retrieves a vector of all values which have been recorded in the autofill
// table as the value in a form element with name |name| and which start with
// |prefix|. The comparison of the prefix is case insensitive.
bool GetFormValuesForElementName(const base::string16& name,
const base::string16& prefix,
std::vector<base::string16>* values,
int limit);
// Returns whether any form elements are stored in the database.
bool HasFormElements();
// Removes rows from the autofill table if they were created on or after
// |delete_begin| and last used strictly before |delete_end|. For rows where
// the time range [date_created, date_last_used] overlaps with [delete_begin,
// delete_end), but is not entirely contained within the latter range, updates
// the rows so that their resulting time range [new_date_created,
// new_date_last_used] lies entirely outside of [delete_begin, delete_end),
// updating the count accordingly. A list of all changed keys and whether
// each was updater or removed is returned in the changes out parameter.
bool RemoveFormElementsAddedBetween(const base::Time& delete_begin,
const base::Time& delete_end,
std::vector<AutofillChange>* changes);
// Removes rows from the autofill table if they were last accessed strictly
// before |AutofillEntry::ExpirationTime()|.
bool RemoveExpiredFormElements(std::vector<AutofillChange>* changes);
// Removes the row from the autofill table for the given |name| |value| pair.
virtual bool RemoveFormElement(const base::string16& name,
const base::string16& value);
// Retrieves all of the entries in the autofill table.
virtual bool GetAllAutofillEntries(std::vector<AutofillEntry>* entries);
// Retrieves a single entry from the autofill table.
virtual bool GetAutofillTimestamps(const base::string16& name,
const base::string16& value,
base::Time* date_created,
base::Time* date_last_used);
// Replaces existing autofill entries with the entries supplied in
// the argument. If the entry does not already exist, it will be
// added.
virtual bool UpdateAutofillEntries(const std::vector<AutofillEntry>& entries);
// Records a single Autofill profile in the autofill_profiles table.
virtual bool AddAutofillProfile(const AutofillProfile& profile);
// Updates the database values for the specified profile. Mulit-value aware.
virtual bool UpdateAutofillProfile(const AutofillProfile& profile);
// Removes a row from the autofill_profiles table. |guid| is the identifier
// of the profile to remove.
virtual bool RemoveAutofillProfile(const std::string& guid);
// Retrieves a profile with guid |guid|. The caller owns |profile|.
bool GetAutofillProfile(const std::string& guid, AutofillProfile** profile);
// Retrieves all profiles in the database. Caller owns the returned profiles.
virtual bool GetAutofillProfiles(std::vector<AutofillProfile*>* profiles);
// Records a single credit card in the credit_cards table.
bool AddCreditCard(const CreditCard& credit_card);
// Updates the database values for the specified credit card.
bool UpdateCreditCard(const CreditCard& credit_card);
// Removes a row from the credit_cards table. |guid| is the identifer of the
// credit card to remove.
bool RemoveCreditCard(const std::string& guid);
// Retrieves a credit card with guid |guid|. The caller owns
// |credit_card_id|.
bool GetCreditCard(const std::string& guid, CreditCard** credit_card);
// Retrieves all credit cards in the database. Caller owns the returned
// credit cards.
virtual bool GetCreditCards(std::vector<CreditCard*>* credit_cards);
// Removes rows from autofill_profiles and credit_cards if they were created
// on or after |delete_begin| and strictly before |delete_end|. Returns the
// list of deleted profile guids in |profile_guids|. Return value is true if
// all rows were successfully removed. Returns false on database error. In
// that case, the output vector state is undefined, and may be partially
// filled.
bool RemoveAutofillDataModifiedBetween(
const base::Time& delete_begin,
const base::Time& delete_end,
std::vector<std::string>* profile_guids,
std::vector<std::string>* credit_card_guids);
// Removes origin URLs from the autofill_profiles and credit_cards tables if
// they were written on or after |delete_begin| and strictly before
// |delete_end|. Returns the list of modified profiles in |profiles|. Return
// value is true if all rows were successfully updated. Returns false on
// database error. In that case, the output vector state is undefined, and
// may be partially filled.
bool RemoveOriginURLsModifiedBetween(
const base::Time& delete_begin,
const base::Time& delete_end,
ScopedVector<AutofillProfile>* profiles);
// Retrieves all profiles in the database that have been deleted since last
// "empty" of the trash.
bool GetAutofillProfilesInTrash(std::vector<std::string>* guids);
// Empties the Autofill profiles "trash can".
bool EmptyAutofillProfilesTrash();
// Retrieves all profiles in the database that have been deleted since last
// "empty" of the trash.
bool AddAutofillGUIDToTrash(const std::string& guid);
// Clear all profiles.
bool ClearAutofillProfiles();
// Table migration functions.
// Removes empty values for autofill that were incorrectly stored in the DB
// See bug http://crbug.com/6111
bool MigrateToVersion22ClearAutofillEmptyValueElements();
bool MigrateToVersion23AddCardNumberEncryptedColumn();
bool MigrateToVersion24CleanupOversizedStringFields();
bool MigrateToVersion27UpdateLegacyCreditCards();
bool MigrateToVersion30AddDateModifed();
bool MigrateToVersion31AddGUIDToCreditCardsAndProfiles();
bool MigrateToVersion32UpdateProfilesAndCreditCards();
bool MigrateToVersion33ProfilesBasedOnFirstName();
bool MigrateToVersion34ProfilesBasedOnCountryCode();
bool MigrateToVersion35GreatBritainCountryCodes();
bool MigrateToVersion37MergeAndCullOlderProfiles();
bool MigrateToVersion51AddOriginColumn();
bool MigrateToVersion54AddI18nFieldsAndRemoveDeprecatedFields();
bool MigrateToVersion55MergeAutofillDatesTable();
bool MigrateToVersion56AddProfileLanguageCodeForFormatting();
bool MigrateToVersion57AddFullNameField();
// Max data length saved in the table;
static const size_t kMaxDataLength;
private:
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddChanges);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_RemoveBetweenChanges);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_UpdateDontReplace);
FRIEND_TEST_ALL_PREFIXES(
AutofillTableTest,
Autofill_RemoveFormElementsAddedBetween_UsedOnlyBefore);
FRIEND_TEST_ALL_PREFIXES(
AutofillTableTest,
Autofill_RemoveFormElementsAddedBetween_UsedOnlyAfter);
FRIEND_TEST_ALL_PREFIXES(
AutofillTableTest,
Autofill_RemoveFormElementsAddedBetween_UsedOnlyDuring);
FRIEND_TEST_ALL_PREFIXES(
AutofillTableTest,
Autofill_RemoveFormElementsAddedBetween_UsedBeforeAndDuring);
FRIEND_TEST_ALL_PREFIXES(
AutofillTableTest,
Autofill_RemoveFormElementsAddedBetween_UsedDuringAndAfter);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, Autofill_AddFormFieldValues);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfile);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateAutofillProfile);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrash);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, AutofillProfileTrashInteraction);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
RemoveAutofillDataModifiedBetween);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, CreditCard);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest, UpdateCreditCard);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
Autofill_GetAllAutofillEntries_OneResult);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
Autofill_GetAllAutofillEntries_TwoDistinct);
FRIEND_TEST_ALL_PREFIXES(AutofillTableTest,
Autofill_GetAllAutofillEntries_TwoSame);
// Methods for adding autofill entries at a specified time. For
// testing only.
bool AddFormFieldValuesTime(
const std::vector<FormFieldData>& elements,
std::vector<AutofillChange>* changes,
base::Time time);
bool AddFormFieldValueTime(const FormFieldData& element,
std::vector<AutofillChange>* changes,
base::Time time);
// Insert a single AutofillEntry into the autofill table.
bool InsertAutofillEntry(const AutofillEntry& entry);
// Checks if the trash is empty.
bool IsAutofillProfilesTrashEmpty();
// Checks if the guid is in the trash.
bool IsAutofillGUIDInTrash(const std::string& guid);
bool InitMainTable();
bool InitCreditCardsTable();
bool InitDatesTable();
bool InitProfilesTable();
bool InitProfileNamesTable();
bool InitProfileEmailsTable();
bool InitProfilePhonesTable();
bool InitProfileTrashTable();
// The application locale. The locale is needed for the migration to version
// 35. Since it must be read on the UI thread, it is set when the table is
// created (on the UI thread), and cached here so that it can be used for
// migrations (on the DB thread).
std::string app_locale_;
DISALLOW_COPY_AND_ASSIGN(AutofillTable);
};
} // namespace autofill
#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_WEBDATA_AUTOFILL_TABLE_H_