1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_ 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_forward.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/gtest_prod_util.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h" 20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autocomplete_history_manager.h" 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_download.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_manager_delegate.h" 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/forms_seen_state.h" 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/web/WebFormElement.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RectF; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs { 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable; 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillDriver; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillDataModel; 51a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class AutofillDownloadManager; 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillExternalDelegate; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillField; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerDelegate; 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegate; 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillMetrics; 573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillProfile; 583240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillType; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CreditCard; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FormStructureBrowserTest; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormData; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormFieldData; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordFormFillData; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages saving and restoring the user's personal information entered into web 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forms. 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillManager : public AutofillDownloadManager::Observer { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) enum AutofillDownloadManagerState { 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ENABLE_AUTOFILL_DOWNLOAD_MANAGER, 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISABLE_AUTOFILL_DOWNLOAD_MANAGER, 73a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) }; 74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers our Enable/Disable Autofill pref. 767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillManager(AutofillDriver* driver, 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) autofill::AutofillManagerDelegate* delegate, 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& app_locale, 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillDownloadManagerState enable_download_manager); 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~AutofillManager(); 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Sets an external delegate. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExternalDelegate(AutofillExternalDelegate* delegate); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called from our external delegate so they cannot be private. 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnFillAutofillFormData(int query_id, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormData& form, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormFieldData& field, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int unique_id); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidShowAutofillSuggestions(bool is_new_popup); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidFillAutofillFormData(const base::TimeTicks& timestamp); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnShowAutofillDialog(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidPreviewAutofillFormData(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the credit card or Autofill profile that matches |unique_id| 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the database. 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveAutofillProfileOrCreditCard(int unique_id); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the specified Autocomplete entry. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveAutocompleteEntry(const base::string16& name, 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& value); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the present form structures seen by Autofill manager. 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FormStructure*>& GetFormStructures(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Happens when the autocomplete dialog runs its callback when being closed. 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RequestAutocompleteDialogClosed(); 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autofill::AutofillManagerDelegate* delegate() const { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return manager_delegate_; 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale() const { return app_locale_; } 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only for testing. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SetTestDelegate(autofill::AutofillManagerTestDelegate* delegate); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnFormsSeen(const std::vector<FormData>& forms, 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeTicks& timestamp, 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch autofill::FormsSeenState state); 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Processes the submitted |form|, saving any new Autofill data and uploading 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the possible field types for the submitted fields to the crowdsourcing 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // server. Returns false if this form is not relevant for Autofill. 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool OnFormSubmitted(const FormData& form, 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeTicks& timestamp); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnTextFieldDidChange(const FormData& form, 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& field, 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeTicks& timestamp); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The |bounding_box| is a window relative value. 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnQueryFormFieldAutofill(int query_id, 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormData& form, 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& field, 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::RectF& bounding_box, 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool display_warning); 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnDidEndTextFieldEditing(); 141ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch void OnHideAutofillUI(); 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnAddPasswordFormMapping( 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& form, 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const PasswordFormFillData& fill_data); 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnShowPasswordSuggestions( 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& field, 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::RectF& bounds, 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<base::string16>& suggestions, 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const std::vector<base::string16>& realms); 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnSetDataList(const std::vector<base::string16>& values, 151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<base::string16>& labels); 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 153d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Try and upload |form|. This differs from OnFormSubmitted() in a few ways. 154d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // - This function will only label the first <input type="password"> field 155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // as ACCOUNT_CREATION_PASSWORD. Other fields will stay unlabeled, as they 156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // should have been labeled during the upload for OnFormSubmitted(). 157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // - This function does not assume that |form| is being uploaded during 158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the same browsing session as it was originally submitted (as we may 159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // not have the necessary information to classify the form at that time) 160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // so it bypasses the cache and doesn't log the same quality UMA metrics. 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool UploadPasswordGenerationForm(const FormData& form); 162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Resets cache. 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void Reset(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 166a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns the value of the AutofillEnabled pref. 167a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool IsAutofillEnabled() const; 168a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected: 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test code should prefer to use this constructor. 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillManager(AutofillDriver* driver, 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::AutofillManagerDelegate* delegate, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersonalDataManager* personal_data); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uploads the form data to the Autofill server. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UploadFormData(const FormStructure& submitted_form); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Logs quality metrics for the |submitted_form| and uploads the form data 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the crowdsourcing server, if appropriate. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UploadFormDataAsyncCallback( 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormStructure* submitted_form, 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& load_time, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& interaction_time, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& submission_time); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps GUIDs to and from IDs that are used to identify profiles and credit 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cards sent to and from the renderer process. 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GUIDToID(const PersonalDataManager::GUIDPair& guid) const; 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for packing and unpacking credit card and profile IDs for sending 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and receiving to and from the renderer process. 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersonalDataManager::GUIDPair& profile_guid) const; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnpackGUIDs(int id, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager::GUIDPair* cc_guid, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager::GUIDPair* profile_guid) const; 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutofillMetrics* metric_logger() const { return metric_logger_.get(); } 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_metric_logger(const AutofillMetrics* metric_logger); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<FormStructure>* form_structures() { return &form_structures_; } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exposed for testing. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillExternalDelegate* external_delegate() { 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return external_delegate_; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AutofillDownloadManager::Observer: 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLoadedServerPredictions( 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response_xml) OVERRIDE; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns false if Autofill is disabled or if no Autofill data is available. 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool RefreshDataModels() const; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unpacks |unique_id| and fills |form_group| and |variant| with the 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // appropriate data source and variant index. Returns false if the unpacked 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // id cannot be found. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetProfileOrCreditCard(int unique_id, 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AutofillDataModel** data_model, 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t* variant) const WARN_UNUSED_RESULT; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills |form_structure| cached element corresponding to |form|. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if the cached element was not found. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool FindCachedForm(const FormData& form, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** form_structure) const WARN_UNUSED_RESULT; 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills |form_structure| and |autofill_field| with the cached elements 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponding to |form| and |field|. This might have the side-effect of 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updating the cache. Returns false if the |form| is not autofillable, or if 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is not already present in the cache and the cache is full. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetCachedFormAndField(const FormData& form, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormFieldData& field, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** form_structure, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillField** autofill_field) WARN_UNUSED_RESULT; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-parses |live_form| and adds the result to |form_structures_|. 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |cached_form| should be a pointer to the existing version of the form, or 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if no cached version exists. The updated form is then written into 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |updated_form|. Returns false if the cache could not be updated. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UpdateCachedForm(const FormData& live_form, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormStructure* cached_form, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** updated_form) WARN_UNUSED_RESULT; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a list of values from the stored profiles that match |type| and the 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value of |field| and returns the labels of the matching profiles. |labels| 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is filled with the Profile label. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProfileSuggestions(FormStructure* form, 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormFieldData& field, 2513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const AutofillType& type, 252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values, 253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* labels, 254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* icons, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int>* unique_ids) const; 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a list of values from the stored credit cards that match |type| and 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the value of |field| and returns the labels of the matching credit cards. 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetCreditCardSuggestions(const FormFieldData& field, 2603240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const AutofillType& type, 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values, 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* labels, 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* icons, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int>* unique_ids) const; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses the forms using heuristic matching and querying the Autofill server. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ParseForms(const std::vector<FormData>& forms); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Imports the form data, submitted by the user, into |personal_data_|. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ImportFormData(const FormStructure& submitted_form); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |initial_interaction_timestamp_| is unset or is set to a later time than 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |interaction_timestamp|, updates the cached timestamp. The latter check is 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needed because IPC messages can arrive out of order. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateInitialInteractionTimestamp( 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& interaction_timestamp); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 278d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Shared code to determine if |form| should be uploaded. 279d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool ShouldUploadForm(const FormStructure& form); 280d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Provides driver-level context to the shared code of the component. Must 2827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // outlive this object. 2837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillDriver* driver_; 2847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) autofill::AutofillManagerDelegate* const manager_delegate_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string app_locale_; 288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The personal data manager, used to save and load personal data to/from the 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // web database. This is overridden by the AutofillManagerTest. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak reference. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // May be NULL. NULL indicates OTR. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersonalDataManager* personal_data_; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> autofilled_form_signatures_; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Handles queries and uploads to Autofill servers. Will be NULL if 298a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // the download manager functionality is disabled. 299a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<AutofillDownloadManager> download_manager_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles single-field autocomplete form data. 302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AutocompleteHistoryManager> autocomplete_history_manager_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For logging UMA metrics. Overridden by metrics tests. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const AutofillMetrics> metric_logger_; 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we logged whether Autofill is enabled for this page load? 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_logged_autofill_enabled_; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we logged an address suggestions count metric for this page? 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_logged_address_suggestions_count_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we shown Autofill suggestions at least once? 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_show_suggestions_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user manually edited at least one form field among the autofillable 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ones? 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_type_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user autofilled a form on this page? 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_autofill_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user edited a field that was previously autofilled? 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_edit_autofilled_field_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the page finished loading. 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks forms_loaded_timestamp_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the user first interacted with a potentially fillable form on this 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks initial_interaction_timestamp_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our copy of the form data. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<FormStructure> form_structures_; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GUID to ID mapping. We keep two maps to convert back and forth. 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_; 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_; 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to perform external processing (display, selection) on 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // our behalf. Weak. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillExternalDelegate* external_delegate_; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delegate used in test to get notifications on certain events. 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autofill::AutofillManagerTestDelegate* test_delegate_; 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<AutofillManager> weak_ptr_factory_; 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class AutofillManagerTest; 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) friend class autofill::FormStructureBrowserTest; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeterminePossibleFieldTypesForUpload); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeterminePossibleFieldTypesForUploadStressTest); 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisabledAutofillDispatchesError); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoQualityMetricsForNonAutofillableForms); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTabContentsWithExternalDelegate); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserHappinessFormLoadAndSubmission); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction); 365eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 366eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FormSubmittedAutocompleteEnabled); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AutofillManager); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 372eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_ 373