diff options
Diffstat (limited to 'components/autofill/browser/webdata/autofill_table.h')
-rw-r--r-- | components/autofill/browser/webdata/autofill_table.h | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/components/autofill/browser/webdata/autofill_table.h b/components/autofill/browser/webdata/autofill_table.h new file mode 100644 index 0000000..24afba8 --- /dev/null +++ b/components/autofill/browser/webdata/autofill_table.h @@ -0,0 +1,366 @@ +// Copyright (c) 2012 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_BROWSER_WEBDATA_AUTOFILL_TABLE_H_ +#define COMPONENTS_AUTOFILL_BROWSER_WEBDATA_AUTOFILL_TABLE_H_ + +#include <vector> + +#include "base/compiler_specific.h" +#include "base/gtest_prod_util.h" +#include "base/string16.h" +#include "components/webdata/common/web_database_table.h" + +class AutofillChange; +class AutofillEntry; +class AutofillProfile; +class AutofillTableTest; +class CreditCard; +class WebDatabase; + +struct FormFieldData; + +namespace base { +class Time; +} + +// 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. +// pair_id An ID number unique to the row in the table. +// count How many times the user has entered the string |value| +// in a field of name |name|. +// +// autofill_dates This table associates a row to each separate time the +// user submits a form containing a certain name/value +// pair. The |pair_id| should match the |pair_id| field +// in the appropriate row of the autofill table. +// pair_id +// date_created +// +// 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 +// address_line_1 +// address_line_2 +// city +// state +// zipcode +// country The country name. Deprecated, should be removed once +// the stable channel reaches version 11. +// country_code +// date_modified The date on which this profile was last modified. +// Added in version 30. +// +// 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 +// +// 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. +// type An integer constant designating either phone type of the +// number. +// TODO(jhawkins): Remove the type column and migrate the +// database. +// 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. +// +class AutofillTable : public WebDatabaseTable { + public: + explicit AutofillTable(const std::string& app_locale); + virtual ~AutofillTable(); + + // Retrieves the AutofillTable* owned by |database|. + static AutofillTable* FromWebDatabase(WebDatabase* db); + + virtual WebDatabaseTable::TypeKey GetTypeKey() const OVERRIDE; + virtual bool Init(sql::Connection* db, sql::MetaTable* meta_table) OVERRIDE; + virtual bool IsSyncable() OVERRIDE; + virtual 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 string16& name, + const string16& prefix, + std::vector<string16>* values, + int limit); + + // Removes rows from autofill_dates if they were created on or after + // |delete_begin| and strictly before |delete_end|. Decrements the + // count of the corresponding rows in the autofill table, and + // removes those rows if the count goes to 0. 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 autofill_dates if they were accessed strictly before + // |AutofillEntry::ExpirationTime()|. Removes the corresponding row from the + // autofill table. Also culls timestamps to only two. TODO(georgey): remove + // culling in future versions. + bool RemoveExpiredFormElements(std::vector<AutofillChange>* changes); + + // Removes from autofill_dates rows with given pair_id where date_created lies + // between |delete_begin| and |delete_end|. + bool RemoveFormElementForTimeRange(int64 pair_id, + const base::Time& delete_begin, + const base::Time& delete_end, + int* how_many); + + // Increments the count in the row corresponding to |pair_id| by |delta|. + bool AddToCountOfFormElement(int64 pair_id, int delta); + + // Counts how many timestamp data rows are in the |autofill_dates| table for + // a given |pair_id|. GetCountOfFormElement() on the other hand gives the + // |count| property for a given id. + int CountTimestampsData(int64 pair_id); + + // Gets the pair_id and count entries from name and value specified in + // |element|. Sets *pair_id and *count to 0 if there is no such row in + // the table. + bool GetIDAndCountOfFormElement(const FormFieldData& element, + int64* pair_id, + int* count); + + // Gets the count only given the pair_id. + bool GetCountOfFormElement(int64 pair_id, int* count); + + // Updates the count entry in the row corresponding to |pair_id| to |count|. + bool SetCountOfFormElement(int64 pair_id, int count); + + // Adds a new row to the autofill table with name and value given in + // |element|. Sets *pair_id to the pair_id of the new row. + bool InsertFormElement(const FormFieldData& element, + int64* pair_id); + + // Adds a new row to the autofill_dates table. + bool InsertPairIDAndDate(int64 pair_id, const base::Time& date_created); + + // Deletes last access to the Autofill data from the autofill_dates table. + bool DeleteLastAccess(int64 pair_id); + + // Removes row from the autofill tables given |pair_id|. + bool RemoveFormElementForID(int64 pair_id); + + // Removes row from the autofill tables for the given |name| |value| pair. + virtual bool RemoveFormElement(const string16& name, const 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 string16& name, + const string16& value, + std::vector<base::Time>* timestamps); + + // 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. + // DEPRECATED: Use |UpdateAutofillProfileMulti| instead. + virtual bool UpdateAutofillProfile(const AutofillProfile& profile); + + // Updates the database values for the specified profile. Mulit-value aware. + virtual bool UpdateAutofillProfileMulti(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 lists + // of deleted guids in |profile_guids| and |credit_card_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); + + // 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(); + + // Removes empty values for autofill that were incorrectly stored in the DB + // See bug http://crbug.com/6111 + bool ClearAutofillEmptyValueElements(); + + // 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. + bool MigrateToVersion23AddCardNumberEncryptedColumn(); + bool MigrateToVersion24CleanupOversizedStringFields(); + bool MigrateToVersion27UpdateLegacyCreditCards(); + bool MigrateToVersion30AddDateModifed(); + bool MigrateToVersion31AddGUIDToCreditCardsAndProfiles(); + bool MigrateToVersion32UpdateProfilesAndCreditCards(); + bool MigrateToVersion33ProfilesBasedOnFirstName(); + bool MigrateToVersion34ProfilesBasedOnCountryCode(); + bool MigrateToVersion35GreatBritainCountryCodes(); + bool MigrateToVersion37MergeAndCullOlderProfiles(); + + // 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_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/autofill_dates tables. + 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); +}; + +#endif // COMPONENTS_AUTOFILL_BROWSER_WEBDATA_AUTOFILL_TABLE_H_ |