autofill_external_delegate.h revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/string16.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/core/browser/autofill_popup_delegate.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/core/browser/password_autofill_manager.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "components/autofill/core/common/password_form_fill_data.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace autofill {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillDriver;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillManager;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(csharp): A lot of the logic in this class is copied from autofillagent.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Once Autofill is moved out of WebKit this class should be the only home for
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// this logic. See http://crbug.com/51644
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Delegate for in-browser Autocomplete and Autofill display and selection.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AutofillExternalDelegate
40    : public AutofillPopupDelegate {
41 public:
42  // Creates an AutofillExternalDelegate for the specified contents,
43  // AutofillManager, and AutofillDriver.
44  AutofillExternalDelegate(content::WebContents* web_contents,
45                           AutofillManager* autofill_manager,
46                           AutofillDriver* autofill_driver);
47  virtual ~AutofillExternalDelegate();
48
49  // AutofillPopupDelegate implementation.
50  virtual void OnPopupShown(content::KeyboardListener* listener) OVERRIDE;
51  virtual void OnPopupHidden(content::KeyboardListener* listener) OVERRIDE;
52  virtual void DidSelectSuggestion(int identifier) OVERRIDE;
53  virtual void DidAcceptSuggestion(const base::string16& value,
54                                   int identifier) OVERRIDE;
55  virtual void RemoveSuggestion(const base::string16& value,
56                                int identifier) OVERRIDE;
57  virtual void ClearPreviewedForm() OVERRIDE;
58
59  // Records and associates a query_id with web form data.  Called
60  // when the renderer posts an Autofill query to the browser. |bounds|
61  // is window relative. |display_warning_if_disabled| tells us if we should
62  // display warnings (such as autofill is disabled, but had suggestions).
63  // We might not want to display the warning if a website has disabled
64  // Autocomplete because they have their own popup, and showing our popup
65  // on to of theirs would be a poor user experience.
66  virtual void OnQuery(int query_id,
67                       const FormData& form,
68                       const FormFieldData& field,
69                       const gfx::RectF& element_bounds,
70                       bool display_warning_if_disabled);
71
72  // Records query results and correctly formats them before sending them off
73  // to be displayed.  Called when an Autofill query result is available.
74  virtual void OnSuggestionsReturned(
75      int query_id,
76      const std::vector<base::string16>& autofill_values,
77      const std::vector<base::string16>& autofill_labels,
78      const std::vector<base::string16>& autofill_icons,
79      const std::vector<int>& autofill_unique_ids);
80
81  // Show password suggestions in the popup.
82  void OnShowPasswordSuggestions(const std::vector<base::string16>& suggestions,
83                                 const std::vector<base::string16>& realms,
84                                 const FormFieldData& field,
85                                 const gfx::RectF& bounds);
86
87  // Set the data list value associated with the current field.
88  void SetCurrentDataListValues(
89      const std::vector<base::string16>& data_list_values,
90      const std::vector<base::string16>& data_list_labels);
91
92  // Inform the delegate that the text field editing has ended. This is
93  // used to help record the metrics of when a new popup is shown.
94  void DidEndTextFieldEditing();
95
96  // Returns the delegate to its starting state by removing any page specific
97  // values or settings.
98  void Reset();
99
100  // Inform the Password Manager of a filled form.
101  void AddPasswordFormMapping(
102      const FormFieldData& form,
103      const PasswordFormFillData& fill_data);
104
105 protected:
106  content::WebContents* web_contents() { return web_contents_; }
107
108  base::WeakPtr<AutofillExternalDelegate> GetWeakPtr();
109
110 private:
111  // Fills the form with the Autofill data corresponding to |unique_id|.
112  // If |is_preview| is true then this is just a preview to show the user what
113  // would be selected and if |is_preview| is false then the user has selected
114  // this data.
115  void FillAutofillFormData(int unique_id, bool is_preview);
116
117  // Handle applying any Autofill warnings to the Autofill popup.
118  void ApplyAutofillWarnings(std::vector<base::string16>* autofill_values,
119                             std::vector<base::string16>* autofill_labels,
120                             std::vector<base::string16>* autofill_icons,
121                             std::vector<int>* autofill_unique_ids);
122
123  // Handle applying any Autofill option listings to the Autofill popup.
124  // This function should only get called when there is at least one
125  // multi-field suggestion in the list of suggestions.
126  void ApplyAutofillOptions(std::vector<base::string16>* autofill_values,
127                            std::vector<base::string16>* autofill_labels,
128                            std::vector<base::string16>* autofill_icons,
129                            std::vector<int>* autofill_unique_ids);
130
131  // Insert the data list values at the start of the given list, including
132  // any required separators.
133  void InsertDataListValues(std::vector<base::string16>* autofill_values,
134                            std::vector<base::string16>* autofill_labels,
135                            std::vector<base::string16>* autofill_icons,
136                            std::vector<int>* autofill_unique_ids);
137
138  // The web_contents associated with this delegate.
139  content::WebContents* web_contents_;  // weak; owns me.
140  AutofillManager* autofill_manager_;  // weak.
141
142  // Provides driver-level context to the shared code of the component. Must
143  // outlive this object.
144  AutofillDriver* autofill_driver_;  // weak
145
146  // Password Autofill manager, handles all password-related Autofilling.
147  PasswordAutofillManager password_autofill_manager_;
148
149  // The ID of the last request sent for form field Autofill.  Used to ignore
150  // out of date responses.
151  int autofill_query_id_;
152
153  // The current form and field selected by Autofill.
154  FormData autofill_query_form_;
155  FormFieldData autofill_query_field_;
156
157  // The bounds of the form field that user is interacting with.
158  gfx::RectF element_bounds_;
159
160  // Should we display a warning if Autofill is disabled?
161  bool display_warning_if_disabled_;
162
163  // Does the popup include any Autofill profile or credit card suggestions?
164  bool has_autofill_suggestion_;
165
166  // Have we already shown Autofill suggestions for the field the user is
167  // currently editing?  Used to keep track of state for metrics logging.
168  bool has_shown_autofill_popup_for_current_edit_;
169
170  // The RenderViewHost that this object has been registered with as a
171  // keyboard listener.
172  content::RenderViewHost* registered_keyboard_listener_with_;
173
174  // The current data list values.
175  std::vector<base::string16> data_list_values_;
176  std::vector<base::string16> data_list_labels_;
177
178  base::WeakPtrFactory<AutofillExternalDelegate> weak_ptr_factory_;
179
180  DISALLOW_COPY_AND_ASSIGN(AutofillExternalDelegate);
181};
182
183}  // namespace autofill
184
185#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_AUTOFILL_EXTERNAL_DELEGATE_H_
186