// Copyright (c) 2010 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 CHROME_BROWSER_WEBDATA_WEB_DATABASE_H_ #define CHROME_BROWSER_WEBDATA_WEB_DATABASE_H_ #pragma once #include #include "app/sql/connection.h" #include "app/sql/init_status.h" #include "app/sql/meta_table.h" #include "base/gtest_prod_util.h" #include "base/scoped_ptr.h" #include "base/string16.h" #include "chrome/browser/search_engines/template_url_id.h" class AutofillChange; class AutofillEntry; class AutoFillProfile; class CreditCard; class FilePath; class GURL; class NotificationService; class SkBitmap; class TemplateURL; class WebDatabaseTest; namespace base { class Time; } namespace webkit_glue { class FormField; struct PasswordForm; } #if defined(OS_WIN) struct IE7PasswordInfo; #endif //////////////////////////////////////////////////////////////////////////////// // // A Sqlite database instance to store all the meta data we have about web pages // //////////////////////////////////////////////////////////////////////////////// class WebDatabase { public: WebDatabase(); virtual ~WebDatabase(); // Initialize the database given a name. The name defines where the sqlite // file is. If this returns an error code, no other method should be called. sql::InitStatus Init(const FilePath& db_name); // Transactions management void BeginTransaction(); void CommitTransaction(); ////////////////////////////////////////////////////////////////////////////// // // Keywords // ////////////////////////////////////////////////////////////////////////////// // Adds a new keyword, updating the id field on success. // Returns true if successful. bool AddKeyword(const TemplateURL& url); // Removes the specified keyword. // Returns true if successful. bool RemoveKeyword(TemplateURLID id); // Loads the keywords into the specified vector. It's up to the caller to // delete the returned objects. // Returns true on success. bool GetKeywords(std::vector* urls); // Updates the database values for the specified url. // Returns true on success. bool UpdateKeyword(const TemplateURL& url); // ID (TemplateURL->id) of the default search provider. bool SetDefaultSearchProviderID(int64 id); int64 GetDefaulSearchProviderID(); // Version of the builtin keywords. bool SetBuitinKeywordVersion(int version); int GetBuitinKeywordVersion(); ////////////////////////////////////////////////////////////////////////////// // // Password manager support // ////////////////////////////////////////////////////////////////////////////// // Adds |form| to the list of remembered password forms. bool AddLogin(const webkit_glue::PasswordForm& form); #if defined(OS_WIN) // Adds |info| to the list of imported passwords from ie7/ie8. bool AddIE7Login(const IE7PasswordInfo& info); // Removes |info| from the list of imported passwords from ie7/ie8. bool RemoveIE7Login(const IE7PasswordInfo& info); // Return the ie7/ie8 login matching |info|. bool GetIE7Login(const IE7PasswordInfo& info, IE7PasswordInfo* result); #endif // Updates remembered password form. bool UpdateLogin(const webkit_glue::PasswordForm& form); // Removes |form| from the list of remembered password forms. bool RemoveLogin(const webkit_glue::PasswordForm& form); // Removes all logins created from |delete_begin| onwards (inclusive) and // before |delete_end|. You may use a null Time value to do an unbounded // delete in either direction. bool RemoveLoginsCreatedBetween(base::Time delete_begin, base::Time delete_end); // Loads a list of matching password forms into the specified vector |forms|. // The list will contain all possibly relevant entries to the observed |form|, // including blacklisted matches. bool GetLogins(const webkit_glue::PasswordForm& form, std::vector* forms); // Loads the complete list of password forms into the specified vector |forms| // if include_blacklisted is true, otherwise only loads those which are // actually autofill-able; i.e haven't been blacklisted by the user selecting // the 'Never for this site' button. bool GetAllLogins(std::vector* forms, bool include_blacklisted); ////////////////////////////////////////////////////////////////////////////// // // AutoFill // ////////////////////////////////////////////////////////////////////////////// // 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& elements, std::vector* 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 webkit_glue::FormField& element, std::vector* 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* 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(base::Time delete_begin, base::Time delete_end, std::vector* changes); // Removes from autofill_dates rows with given pair_id where date_created lies // between delte_begin and delte_end. bool RemoveFormElementForTimeRange(int64 pair_id, base::Time delete_begin, base::Time delete_end, int* how_many); // Increments the count in the row corresponding to |pair_id| by // |delta|. Removes the row from the table and sets the // |was_removed| out parameter to true if the count becomes 0. bool AddToCountOfFormElement(int64 pair_id, int delta, bool* was_removed); // Gets the pair_id and count entries from name and value specified in // |element|. Sets *count to 0 if there is no such row in the table. bool GetIDAndCountOfFormElement(const webkit_glue::FormField& 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 webkit_glue::FormField& element, int64* pair_id); // Adds a new row to the autofill_dates table. bool InsertPairIDAndDate(int64 pair_id, base::Time date_created); // 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* entries); // Retrieves a single entry from the autofill table. virtual bool GetAutofillTimestamps(const string16& name, const string16& value, std::vector* 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& 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. 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 label |label|. The caller owns |profile|. // DEPRECATED: In favor of |GetAutoFillProfileForGUID(...)|. // TODO(dhollowa): Remove labels. http://crbug.com/58813 bool GetAutoFillProfileForLabel(const string16& label, AutoFillProfile** profile); // Retrieves a profile with guid |guid|. The caller owns |profile|. bool GetAutoFillProfileForGUID(const std::string& guid, AutoFillProfile** profile); // Retrieves all profiles in the database. Caller owns the returned profiles. virtual bool GetAutoFillProfiles(std::vector* 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 label |label|. The caller owns // |credit_card_id|. // DEPRECATED: In favor of |GetCreditCardForGUID()|. // TODO(dhollowa): Remove labels. http://crbug.com/58813 bool GetCreditCardForLabel(const string16& label, CreditCard** credit_card); // Retrieves a credit card with guid |guid|. The caller owns // |credit_card_id|. bool GetCreditCardForGUID(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* credit_cards); // Removes rows from autofill_profiles and credit_cards if they were created // on or after |delete_begin| and strictly before |delete_end|. bool RemoveAutoFillProfilesAndCreditCardsModifiedBetween( base::Time delete_begin, base::Time delete_end); ////////////////////////////////////////////////////////////////////////////// // // Web Apps // ////////////////////////////////////////////////////////////////////////////// bool SetWebAppImage(const GURL& url, const SkBitmap& image); bool GetWebAppImages(const GURL& url, std::vector* images); bool SetWebAppHasAllImages(const GURL& url, bool has_all_images); bool GetWebAppHasAllImages(const GURL& url); bool RemoveWebApp(const GURL& url); ////////////////////////////////////////////////////////////////////////////// // // Token Service // ////////////////////////////////////////////////////////////////////////////// // Remove all tokens previously set with SetTokenForService. bool RemoveAllTokens(); // Retrieves all tokens previously set with SetTokenForService. // Returns true if there were tokens and we decrypted them, // false if there was a failure somehow bool GetAllTokens(std::map* tokens); // Store a token in the token_service table. Stored encrypted. May cause // a mac keychain popup. // True if we encrypted a token and stored it, false otherwise. bool SetTokenForService(const std::string& service, const std::string& token); private: FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_AddChanges); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_RemoveBetweenChanges); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_GetAllAutofillEntries_OneResult); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoDistinct); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_GetAllAutofillEntries_TwoSame); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_UpdateDontReplace); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, Autofill_AddFormFieldValues); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, AutoFillProfile); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, CreditCard); FRIEND_TEST_ALL_PREFIXES(WebDatabaseTest, RemoveAutoFillProfilesAndCreditCardsModifiedBetween); // Methods for adding autofill entries at a specified time. For // testing only. bool AddFormFieldValuesTime( const std::vector& elements, std::vector* changes, base::Time time); bool AddFormFieldValueTime(const webkit_glue::FormField& element, std::vector* changes, base::Time time); // Removes empty values for autofill that were incorrectly stored in the DB // (see bug http://crbug.com/6111). // TODO(jcampan): http://crbug.com/7564 remove when we think all users have // run this code. bool ClearAutofillEmptyValueElements(); // Insert a single AutofillEntry into the autofill/autofill_dates tables. bool InsertAutofillEntry(const AutofillEntry& entry); bool InitKeywordsTable(); bool InitLoginsTable(); bool InitAutofillTable(); bool InitAutofillDatesTable(); bool InitAutoFillProfilesTable(); bool InitCreditCardsTable(); bool InitTokenServiceTable(); bool InitWebAppIconsTable(); bool InitWebAppsTable(); // Used by |Init()| to migration database schema from older versions to // current version. sql::InitStatus MigrateOldVersionsAsNeeded(); sql::Connection db_; sql::MetaTable meta_table_; scoped_ptr notification_service_; DISALLOW_COPY_AND_ASSIGN(WebDatabase); }; #endif // CHROME_BROWSER_WEBDATA_WEB_DATABASE_H_