autofill_manager.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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" 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "components/autofill/core/browser/autofill_client.h" 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/autofill_download.h" 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "components/autofill/core/browser/autofill_driver.h" 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/form_structure.h" 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/browser/personal_data_manager.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GURL; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class RectF; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs { 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable; 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace autofill { 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillDataModel; 49a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)class AutofillDownloadManager; 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillExternalDelegate; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillField; 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class AutofillClient; 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillManagerTestDelegate; 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AutofillMetrics; 553240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillProfile; 563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochclass AutofillType; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CreditCard; 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FormStructureBrowserTest; 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormData; 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct FormFieldData; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)struct PasswordFormFillData; 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Manages saving and restoring the user's personal information entered into web 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// forms. 667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class AutofillManager : public AutofillDownloadManager::Observer { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) enum AutofillDownloadManagerState { 69a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) ENABLE_AUTOFILL_DOWNLOAD_MANAGER, 70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) DISABLE_AUTOFILL_DOWNLOAD_MANAGER, 71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) }; 72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Registers our Enable/Disable Autofill pref. 747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) static void MigrateUserPrefs(PrefService* prefs); 7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // defined(OS_MACOSX) && !defined(OS_IOS) 7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillManager(AutofillDriver* driver, 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient* client, 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& app_locale, 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillDownloadManagerState enable_download_manager); 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~AutofillManager(); 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Sets an external delegate. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SetExternalDelegate(AutofillExternalDelegate* delegate); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ShowAutofillSettings(); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#if defined(OS_MACOSX) && !defined(OS_IOS) 9246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Whether the field represented by |fieldData| should show an entry to prompt 9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // the user to give Chrome access to the user's address book. 9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool ShouldShowAccessAddressBookSuggestion(const FormData& data, 9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const FormFieldData& field_data); 9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If Chrome has not prompted for access to the user's address book, the 9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // method prompts the user for permission and blocks the process. Otherwise, 9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // this method has no effect. The return value reflects whether the user was 10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // prompted with a modal dialog. 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) bool AccessAddressBook(); 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#endif // defined(OS_MACOSX) && !defined(OS_IOS) 10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called from our external delegate so they cannot be private. 105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void FillOrPreviewForm(AutofillDriver::RendererFormDataAction action, 106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int query_id, 107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FormData& form, 108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const FormFieldData& field, 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int unique_id); 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void DidShowSuggestions(bool is_new_popup); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidFillAutofillFormData(const base::TimeTicks& timestamp); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDidPreviewAutofillFormData(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the credit card or Autofill profile that matches |unique_id| 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // from the database. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RemoveAutofillProfileOrCreditCard(int unique_id); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the specified Autocomplete entry. 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void RemoveAutocompleteEntry(const base::string16& name, 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16& value); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the present form structures seen by Autofill manager. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector<FormStructure*>& GetFormStructures(); 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Happens when the autocomplete dialog runs its callback when being closed. 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RequestAutocompleteDialogClosed(); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient* client() const { return client_; } 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& app_locale() const { return app_locale_; } 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Only for testing. 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) void SetTestDelegate(AutofillManagerTestDelegate* delegate); 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnFormsSeen(const std::vector<FormData>& forms, 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::TimeTicks& timestamp); 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Processes the submitted |form|, saving any new Autofill data and uploading 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the possible field types for the submitted fields to the crowdsourcing 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // server. Returns false if this form is not relevant for Autofill. 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool OnFormSubmitted(const FormData& form, 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeTicks& timestamp); 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnTextFieldDidChange(const FormData& form, 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& field, 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::TimeTicks& timestamp); 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The |bounding_box| is a window relative value. 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnQueryFormFieldAutofill(int query_id, 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormData& form, 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const FormFieldData& field, 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::RectF& bounding_box, 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool display_warning); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnDidEndTextFieldEditing(); 155a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnHidePopup(); 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void OnSetDataList(const std::vector<base::string16>& values, 157ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch const std::vector<base::string16>& labels); 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Try and upload |form|. This differs from OnFormSubmitted() in a few ways. 160d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // - This function will only label the first <input type="password"> field 161d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // as ACCOUNT_CREATION_PASSWORD. Other fields will stay unlabeled, as they 162d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // should have been labeled during the upload for OnFormSubmitted(). 163d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // - This function does not assume that |form| is being uploaded during 164d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // the same browsing session as it was originally submitted (as we may 165d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // not have the necessary information to classify the form at that time) 166d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // so it bypasses the cache and doesn't log the same quality UMA metrics. 167d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool UploadPasswordGenerationForm(const FormData& form); 168d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Resets cache. 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void Reset(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns the value of the AutofillEnabled pref. 173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool IsAutofillEnabled() const; 174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) protected: 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test code should prefer to use this constructor. 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillManager(AutofillDriver* driver, 178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient* client, 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersonalDataManager* personal_data); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Uploads the form data to the Autofill server. 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UploadFormData(const FormStructure& submitted_form); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Logs quality metrics for the |submitted_form| and uploads the form data 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the crowdsourcing server, if appropriate. 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UploadFormDataAsyncCallback( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormStructure* submitted_form, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& load_time, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& interaction_time, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& submission_time); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Maps GUIDs to and from IDs that are used to identify profiles and credit 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // cards sent to and from the renderer process. 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual int GUIDToID(const PersonalDataManager::GUIDPair& guid) const; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const PersonalDataManager::GUIDPair IDToGUID(int id) const; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Methods for packing and unpacking credit card and profile IDs for sending 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and receiving to and from the renderer process. 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int PackGUIDs(const PersonalDataManager::GUIDPair& cc_guid, 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const PersonalDataManager::GUIDPair& profile_guid) const; 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnpackGUIDs(int id, 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager::GUIDPair* cc_guid, 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PersonalDataManager::GUIDPair* profile_guid) const; 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const AutofillMetrics* metric_logger() const { return metric_logger_.get(); } 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void set_metric_logger(const AutofillMetrics* metric_logger); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<FormStructure>* form_structures() { return &form_structures_; } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Exposed for testing. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillExternalDelegate* external_delegate() { 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return external_delegate_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // AutofillDownloadManager::Observer: 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnLoadedServerPredictions( 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& response_xml) OVERRIDE; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Returns false if Autofill is disabled or if no Autofill data is available. 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool RefreshDataModels() const; 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Unpacks |unique_id| and fills |form_group| and |variant| with the 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // appropriate data source and variant index. Sets |is_credit_card| to true 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // if |data_model| points to a CreditCard data model, false if it's a 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // profile data model. 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns false if the unpacked id cannot be found. 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetProfileOrCreditCard(int unique_id, 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const AutofillDataModel** data_model, 230a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) size_t* variant, 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool* is_credit_card) const WARN_UNUSED_RESULT; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills |form_structure| cached element corresponding to |form|. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns false if the cached element was not found. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool FindCachedForm(const FormData& form, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** form_structure) const WARN_UNUSED_RESULT; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fills |form_structure| and |autofill_field| with the cached elements 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // corresponding to |form| and |field|. This might have the side-effect of 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // updating the cache. Returns false if the |form| is not autofillable, or if 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it is not already present in the cache and the cache is full. 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool GetCachedFormAndField(const FormData& form, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormFieldData& field, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** form_structure, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillField** autofill_field) WARN_UNUSED_RESULT; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Re-parses |live_form| and adds the result to |form_structures_|. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |cached_form| should be a pointer to the existing version of the form, or 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL if no cached version exists. The updated form is then written into 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |updated_form|. Returns false if the cache could not be updated. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool UpdateCachedForm(const FormData& live_form, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const FormStructure* cached_form, 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FormStructure** updated_form) WARN_UNUSED_RESULT; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a list of values from the stored profiles that match |type| and the 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // value of |field| and returns the labels of the matching profiles. |labels| 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is filled with the Profile label. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void GetProfileSuggestions(FormStructure* form, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 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) // Returns a list of values from the stored credit cards that match |type| and 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the value of |field| and returns the labels of the matching credit cards. 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void GetCreditCardSuggestions(const FormFieldData& field, 2693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch const AutofillType& type, 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* values, 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* labels, 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<base::string16>* icons, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int>* unique_ids) const; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Parses the forms using heuristic matching and querying the Autofill server. 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ParseForms(const std::vector<FormData>& forms); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Imports the form data, submitted by the user, into |personal_data_|. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ImportFormData(const FormStructure& submitted_form); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If |initial_interaction_timestamp_| is unset or is set to a later time than 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |interaction_timestamp|, updates the cached timestamp. The latter check is 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // needed because IPC messages can arrive out of order. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateInitialInteractionTimestamp( 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeTicks& interaction_timestamp); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Shared code to determine if |form| should be uploaded. 288d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) bool ShouldUploadForm(const FormStructure& form); 289d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 2907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Provides driver-level context to the shared code of the component. Must 2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // outlive this object. 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AutofillDriver* driver_; 2937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillClient* const client_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string app_locale_; 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The personal data manager, used to save and load personal data to/from the 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // web database. This is overridden by the AutofillManagerTest. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak reference. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // May be NULL. NULL indicates OTR. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PersonalDataManager* personal_data_; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::list<std::string> autofilled_form_signatures_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Handles queries and uploads to Autofill servers. Will be NULL if 307a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // the download manager functionality is disabled. 308a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) scoped_ptr<AutofillDownloadManager> download_manager_; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handles single-field autocomplete form data. 311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch scoped_ptr<AutocompleteHistoryManager> autocomplete_history_manager_; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For logging UMA metrics. Overridden by metrics tests. 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<const AutofillMetrics> metric_logger_; 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we logged whether Autofill is enabled for this page load? 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_logged_autofill_enabled_; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we logged an address suggestions count metric for this page? 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_logged_address_suggestions_count_; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Have we shown Autofill suggestions at least once? 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_show_suggestions_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user manually edited at least one form field among the autofillable 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ones? 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_type_; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user autofilled a form on this page? 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_autofill_; 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Has the user edited a field that was previously autofilled? 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_did_edit_autofilled_field_; 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // When the form finished loading. 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::map<FormData, base::TimeTicks> forms_loaded_timestamps_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When the user first interacted with a potentially fillable form on this 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeTicks initial_interaction_timestamp_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Our copy of the form data. 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ScopedVector<FormStructure> form_structures_; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // GUID to ID mapping. We keep two maps to convert back and forth. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable std::map<PersonalDataManager::GUIDPair, int> guid_id_map_; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mutable std::map<int, PersonalDataManager::GUIDPair> id_guid_map_; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delegate to perform external processing (display, selection) on 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // our behalf. Weak. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutofillExternalDelegate* external_delegate_; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Delegate used in test to get notifications on certain events. 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AutofillManagerTestDelegate* test_delegate_; 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::WeakPtrFactory<AutofillManager> weak_ptr_factory_; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class AutofillManagerTest; 351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) friend class FormStructureBrowserTest; 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeterminePossibleFieldTypesForUpload); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DeterminePossibleFieldTypesForUploadStressTest); 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DisabledAutofillDispatchesError); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AddressSuggestionsCount); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, AutofillIsEnabledAtPageLoad); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, DeveloperEngagement); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, FormFillDuration); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NoQualityMetricsForNonAutofillableForms); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetrics); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsForFailure); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, QualityMetricsWithExperimentId); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, SaneMetricsWithCacheMismatch); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, TestExternalDelegate); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestTabContentsWithExternalDelegate); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UserHappinessFormLoadAndSubmission); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FRIEND_TEST_ALL_PREFIXES(AutofillMetricsTest, UserHappinessFormInteraction); 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FRIEND_TEST_ALL_PREFIXES(AutofillManagerTest, 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch FormSubmittedAutocompleteEnabled); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AutofillManager); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 379c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace autofill 380c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 381eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_MANAGER_H_ 382