1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_ 6 #define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_ 7 8 #include <vector> 9 10 #include "base/compiler_specific.h" 11 #include "base/memory/weak_ptr.h" 12 #include "base/strings/string16.h" 13 #include "components/autofill/core/browser/autofill_popup_delegate.h" 14 #include "components/autofill/core/common/form_data.h" 15 #include "components/autofill/core/common/form_field_data.h" 16 #include "ui/gfx/rect.h" 17 18 namespace autofill { 19 20 class AutofillDriver; 21 class AutofillManager; 22 23 // TODO(csharp): A lot of the logic in this class is copied from autofillagent. 24 // Once Autofill is moved out of WebKit this class should be the only home for 25 // this logic. See http://crbug.com/51644 26 27 // Delegate for in-browser Autocomplete and Autofill display and selection. 28 class AutofillExternalDelegate 29 : public AutofillPopupDelegate { 30 public: 31 // Creates an AutofillExternalDelegate for the specified AutofillManager and 32 // AutofillDriver. 33 AutofillExternalDelegate(AutofillManager* manager, 34 AutofillDriver* driver); 35 virtual ~AutofillExternalDelegate(); 36 37 // AutofillPopupDelegate implementation. 38 virtual void OnPopupShown() OVERRIDE; 39 virtual void OnPopupHidden() OVERRIDE; 40 virtual void DidSelectSuggestion(const base::string16& value, 41 int identifier) OVERRIDE; 42 virtual void DidAcceptSuggestion(const base::string16& value, 43 int identifier) OVERRIDE; 44 virtual void RemoveSuggestion(const base::string16& value, 45 int identifier) OVERRIDE; 46 virtual void ClearPreviewedForm() OVERRIDE; 47 48 // Records and associates a query_id with web form data. Called 49 // when the renderer posts an Autofill query to the browser. |bounds| 50 // is window relative. |display_warning_if_disabled| tells us if we should 51 // display warnings (such as autofill is disabled, but had suggestions). 52 // We might not want to display the warning if a website has disabled 53 // Autocomplete because they have their own popup, and showing our popup 54 // on to of theirs would be a poor user experience. 55 virtual void OnQuery(int query_id, 56 const FormData& form, 57 const FormFieldData& field, 58 const gfx::RectF& element_bounds, 59 bool display_warning_if_disabled); 60 61 // Records query results and correctly formats them before sending them off 62 // to be displayed. Called when an Autofill query result is available. 63 virtual void OnSuggestionsReturned( 64 int query_id, 65 const std::vector<base::string16>& values, 66 const std::vector<base::string16>& labels, 67 const std::vector<base::string16>& icons, 68 const std::vector<int>& unique_ids); 69 70 // Set the data list value associated with the current field. 71 void SetCurrentDataListValues( 72 const std::vector<base::string16>& data_list_values, 73 const std::vector<base::string16>& data_list_labels); 74 75 // Inform the delegate that the text field editing has ended. This is 76 // used to help record the metrics of when a new popup is shown. 77 void DidEndTextFieldEditing(); 78 79 // Returns the delegate to its starting state by removing any page specific 80 // values or settings. 81 void Reset(); 82 83 // The renderer sent an IPC acknowledging an earlier ping IPC. 84 void OnPingAck(); 85 86 protected: 87 base::WeakPtr<AutofillExternalDelegate> GetWeakPtr(); 88 89 private: 90 // Fills the form with the Autofill data corresponding to |unique_id|. 91 // If |is_preview| is true then this is just a preview to show the user what 92 // would be selected and if |is_preview| is false then the user has selected 93 // this data. 94 void FillAutofillFormData(int unique_id, bool is_preview); 95 96 // Handle applying any Autofill warnings to the Autofill popup. 97 void ApplyAutofillWarnings(std::vector<base::string16>* values, 98 std::vector<base::string16>* labels, 99 std::vector<base::string16>* icons, 100 std::vector<int>* unique_ids); 101 102 // Handle applying any Autofill option listings to the Autofill popup. 103 // This function should only get called when there is at least one 104 // multi-field suggestion in the list of suggestions. 105 void ApplyAutofillOptions(std::vector<base::string16>* values, 106 std::vector<base::string16>* labels, 107 std::vector<base::string16>* icons, 108 std::vector<int>* unique_ids); 109 110 // Insert the data list values at the start of the given list, including 111 // any required separators. 112 void InsertDataListValues(std::vector<base::string16>* values, 113 std::vector<base::string16>* labels, 114 std::vector<base::string16>* icons, 115 std::vector<int>* unique_ids); 116 117 #if defined(OS_MACOSX) && !defined(OS_IOS) 118 // Pings the renderer. 119 void PingRenderer(); 120 #endif // defined(OS_MACOSX) && !defined(OS_IOS) 121 122 AutofillManager* manager_; // weak. 123 124 // Provides driver-level context to the shared code of the component. Must 125 // outlive this object. 126 AutofillDriver* driver_; // weak 127 128 // The ID of the last request sent for form field Autofill. Used to ignore 129 // out of date responses. 130 int query_id_; 131 132 // The current form and field selected by Autofill. 133 FormData query_form_; 134 FormFieldData query_field_; 135 136 // The bounds of the form field that user is interacting with. 137 gfx::RectF element_bounds_; 138 139 // Should we display a warning if Autofill is disabled? 140 bool display_warning_if_disabled_; 141 142 // Does the popup include any Autofill profile or credit card suggestions? 143 bool has_suggestion_; 144 145 // Have we already shown Autofill suggestions for the field the user is 146 // currently editing? Used to keep track of state for metrics logging. 147 bool has_shown_popup_for_current_edit_; 148 149 // The current data list values. 150 std::vector<base::string16> data_list_values_; 151 std::vector<base::string16> data_list_labels_; 152 153 base::WeakPtrFactory<AutofillExternalDelegate> weak_ptr_factory_; 154 155 // Whether the access Address Book prompt has ever been shown for the current 156 // |query_form_|. This variable is only used on OSX. 157 bool has_shown_address_book_prompt; 158 159 DISALLOW_COPY_AND_ASSIGN(AutofillExternalDelegate); 160 }; 161 162 } // namespace autofill 163 164 #endif // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_ 165