• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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