Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: chrome/browser/ui/views/autofill/autofill_dialog_views.h

Issue 1931043002: Remove requestAutocomplete (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2012 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 CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
6 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
7
8 #include <map>
9 #include <set>
10
11 #include "base/macros.h"
12 #include "base/memory/scoped_vector.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/scoped_observer.h"
15 #include "chrome/browser/ui/autofill/autofill_dialog_types.h"
16 #include "chrome/browser/ui/autofill/autofill_dialog_view.h"
17 #include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h"
18 #include "ui/views/controls/button/button.h"
19 #include "ui/views/controls/button/menu_button.h"
20 #include "ui/views/controls/button/menu_button_listener.h"
21 #include "ui/views/controls/combobox/combobox_listener.h"
22 #include "ui/views/controls/link_listener.h"
23 #include "ui/views/controls/progress_bar.h"
24 #include "ui/views/controls/scroll_view.h"
25 #include "ui/views/controls/styled_label_listener.h"
26 #include "ui/views/controls/textfield/textfield_controller.h"
27 #include "ui/views/focus/focus_manager.h"
28 #include "ui/views/view_targeter_delegate.h"
29 #include "ui/views/widget/widget_observer.h"
30 #include "ui/views/window/dialog_delegate.h"
31
32 namespace gfx {
33 class Image;
34 }
35
36 namespace views {
37 class BubbleBorder;
38 class Checkbox;
39 class Combobox;
40 class FocusManager;
41 class ImageView;
42 class Label;
43 class LabelButton;
44 class Link;
45 class MenuRunner;
46 class StyledLabel;
47 class WebView;
48 class Widget;
49 } // namespace views
50
51 namespace ui {
52 class ComboboxModel;
53 class EventHandler;
54 class KeyEvent;
55 }
56
57 namespace autofill {
58
59 class AutofillDialogSignInDelegate;
60 class ExpandingTextfield;
61 class InfoBubble;
62
63 // Views toolkit implementation of the Autofill dialog that handles the
64 // imperative autocomplete API call.
65 class AutofillDialogViews : public AutofillDialogView,
66 public views::DialogDelegateView,
67 public views::WidgetObserver,
68 public views::TextfieldController,
69 public views::FocusChangeListener,
70 public views::ComboboxListener,
71 public views::MenuButtonListener {
72 public:
73 explicit AutofillDialogViews(AutofillDialogViewDelegate* delegate);
74 ~AutofillDialogViews() override;
75
76 // AutofillDialogView implementation:
77 void Show() override;
78 void Hide() override;
79 void UpdatesStarted() override;
80 void UpdatesFinished() override;
81 void UpdateButtonStrip() override;
82 void UpdateDetailArea() override;
83 void UpdateForErrors() override;
84 void UpdateNotificationArea() override;
85 void UpdateSection(DialogSection section) override;
86 void UpdateErrorBubble() override;
87 void FillSection(DialogSection section,
88 ServerFieldType originating_type) override;
89 void GetUserInput(DialogSection section, FieldValueMap* output) override;
90 base::string16 GetCvc() override;
91 bool SaveDetailsLocally() override;
92 void ModelChanged() override;
93 void ValidateSection(DialogSection section) override;
94
95 // views::View implementation.
96 gfx::Size GetPreferredSize() const override;
97 gfx::Size GetMinimumSize() const override;
98 void Layout() override;
99
100 // views::DialogDelegate implementation:
101 ui::ModalType GetModalType() const override;
102 base::string16 GetWindowTitle() const override;
103 void WindowClosing() override;
104 void DeleteDelegate() override;
105 int GetDialogButtons() const override;
106 int GetDefaultDialogButton() const override;
107 base::string16 GetDialogButtonLabel(ui::DialogButton button) const override;
108 bool ShouldDefaultButtonBeBlue() const override;
109 bool IsDialogButtonEnabled(ui::DialogButton button) const override;
110 views::View* GetInitiallyFocusedView() override;
111 views::View* CreateExtraView() override;
112 bool Cancel() override;
113 bool Accept() override;
114
115 // views::WidgetObserver implementation:
116 void OnWidgetClosing(views::Widget* widget) override;
117 void OnWidgetDestroying(views::Widget* widget) override;
118 void OnWidgetBoundsChanged(views::Widget* widget,
119 const gfx::Rect& new_bounds) override;
120
121 // views::TextfieldController implementation:
122 void ContentsChanged(views::Textfield* sender,
123 const base::string16& new_contents) override;
124 bool HandleKeyEvent(views::Textfield* sender,
125 const ui::KeyEvent& key_event) override;
126 bool HandleMouseEvent(views::Textfield* sender,
127 const ui::MouseEvent& key_event) override;
128
129 // views::FocusChangeListener implementation.
130 void OnWillChangeFocus(views::View* focused_before,
131 views::View* focused_now) override;
132 void OnDidChangeFocus(views::View* focused_before,
133 views::View* focused_now) override;
134
135 // views::ComboboxListener implementation:
136 void OnPerformAction(views::Combobox* combobox) override;
137
138 // views::MenuButtonListener implementation.
139 void OnMenuButtonClicked(views::MenuButton* source,
140 const gfx::Point& point,
141 const ui::Event* event) override;
142
143 protected:
144 // Exposed for testing.
145 views::View* GetNotificationAreaForTesting();
146 views::View* GetScrollableAreaForTesting();
147
148 private:
149 friend class AutofillDialogViewTesterViews;
150
151 // An area for notifications. Some notifications point at the account chooser.
152 class NotificationArea : public views::View {
153 public:
154 explicit NotificationArea(AutofillDialogViewDelegate* delegate);
155 ~NotificationArea() override;
156
157 // Displays the given notifications.
158 void SetNotifications(const std::vector<DialogNotification>& notifications);
159
160 // views::View implementation.
161 gfx::Size GetPreferredSize() const override;
162 const char* GetClassName() const override;
163 void PaintChildren(const ui::PaintContext& context) override;
164
165 void set_arrow_centering_anchor(
166 const base::WeakPtr<views::View>& arrow_centering_anchor) {
167 arrow_centering_anchor_ = arrow_centering_anchor;
168 }
169
170 private:
171 // Utility function for determining whether an arrow should be drawn
172 // pointing at |arrow_centering_anchor_|.
173 bool HasArrow();
174
175 // A reference to the delegate/controller than owns this view.
176 // Used to report when checkboxes change their values.
177 AutofillDialogViewDelegate* delegate_; // weak
178
179 // If HasArrow() is true, the arrow should point at this.
180 base::WeakPtr<views::View> arrow_centering_anchor_;
181
182 std::vector<DialogNotification> notifications_;
183
184 DISALLOW_COPY_AND_ASSIGN(NotificationArea);
185 };
186
187 typedef std::map<ServerFieldType, ExpandingTextfield*> TextfieldMap;
188 typedef std::map<ServerFieldType, views::Combobox*> ComboboxMap;
189
190 // A view that packs a label on the left and some related controls
191 // on the right.
192 class SectionContainer : public views::View,
193 public views::ViewTargeterDelegate {
194 public:
195 SectionContainer(const base::string16& label,
196 views::View* controls,
197 views::Button* proxy_button);
198 ~SectionContainer() override;
199
200 // Sets the visual appearance of the section to active (considered active
201 // when showing the menu or hovered by the mouse cursor).
202 void SetActive(bool active);
203
204 // Sets whether mouse events should be forwarded to |proxy_button_|.
205 void SetForwardMouseEvents(bool forward);
206
207 // views::View implementation.
208 const char* GetClassName() const override;
209 void OnMouseMoved(const ui::MouseEvent& event) override;
210 void OnMouseEntered(const ui::MouseEvent& event) override;
211 void OnMouseExited(const ui::MouseEvent& event) override;
212 bool OnMousePressed(const ui::MouseEvent& event) override;
213 void OnMouseReleased(const ui::MouseEvent& event) override;
214 void OnGestureEvent(ui::GestureEvent* event) override;
215
216 private:
217 // views::ViewTargeterDelegate:
218 views::View* TargetForRect(views::View* root,
219 const gfx::Rect& rect) override;
220
221 // Converts |event| to one suitable for |proxy_button_|.
222 static ui::MouseEvent ProxyEvent(const ui::MouseEvent& event);
223
224 // Returns true if the given event should be forwarded to |proxy_button_|.
225 bool ShouldForwardEvent(const ui::LocatedEvent& event);
226
227 // Mouse events on |this| are sent to this button.
228 views::Button* proxy_button_; // Weak reference.
229
230 // When true, all mouse events will be forwarded to |proxy_button_|.
231 bool forward_mouse_events_;
232
233 DISALLOW_COPY_AND_ASSIGN(SectionContainer);
234 };
235
236 // A button to show address or billing suggestions.
237 class SuggestedButton : public views::MenuButton {
238 public:
239 explicit SuggestedButton(views::MenuButtonListener* listener);
240 ~SuggestedButton() override;
241
242 // views::MenuButton implementation.
243 gfx::Size GetPreferredSize() const override;
244 const char* GetClassName() const override;
245 void OnPaint(gfx::Canvas* canvas) override;
246
247 private:
248 // Returns the corred resource ID (i.e. IDR_*) for the current |state()|.
249 int ResourceIDForState() const;
250
251 DISALLOW_COPY_AND_ASSIGN(SuggestedButton);
252 };
253
254 // A view that runs a callback whenever its bounds change, and which can
255 // optionally suppress layout.
256 class DetailsContainerView : public views::View {
257 public:
258 explicit DetailsContainerView(const base::Closure& callback);
259 ~DetailsContainerView() override;
260
261 void set_ignore_layouts(bool ignore_layouts) {
262 ignore_layouts_ = ignore_layouts;
263 }
264
265 // views::View implementation.
266 void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
267 void Layout() override;
268
269 private:
270 base::Closure bounds_changed_callback_;
271
272 // The view ignores Layout() calls when this is true.
273 bool ignore_layouts_;
274
275 DISALLOW_COPY_AND_ASSIGN(DetailsContainerView);
276 };
277
278 // A view that contains a suggestion (such as a known address).
279 class SuggestionView : public views::View {
280 public:
281 explicit SuggestionView(AutofillDialogViews* autofill_dialog);
282 ~SuggestionView() override;
283
284 void SetState(const SuggestionState& state);
285
286 // views::View implementation.
287 gfx::Size GetPreferredSize() const override;
288 int GetHeightForWidth(int width) const override;
289 void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
290
291 ExpandingTextfield* textfield() { return textfield_; }
292
293 private:
294 // Returns whether there's room to display |state_.vertically_compact_text|
295 // without resorting to an ellipsis for a pixel width of |available_width|.
296 // Fills in |resulting_height| with the amount of space required to display
297 // |vertically_compact_text| or |horizontally_compact_text| as the case may
298 // be.
299 bool CanUseVerticallyCompactText(int available_width,
300 int* resulting_height) const;
301
302 // Sets the display text of the suggestion.
303 void SetLabelText(const base::string16& text);
304
305 // Sets the icon which should be displayed ahead of the text.
306 void SetIcon(const gfx::Image& image);
307
308 // Shows an auxiliary textfield to the right of the suggestion icon and
309 // text. This is currently only used to show a CVC field for the CC section.
310 void SetTextfield(const base::string16& placeholder_text,
311 const gfx::Image& icon);
312
313 // Calls SetLabelText() with the appropriate text based on current bounds.
314 void UpdateLabelText();
315
316 // The state of |this|.
317 SuggestionState state_;
318
319 // This caches preferred heights for given widths. The key is a preferred
320 // width, the value is a cached result of CanUseVerticallyCompactText.
321 mutable std::map<int, std::pair<bool, int> > calculated_heights_;
322
323 // The label that holds the suggestion description text.
324 views::Label* label_;
325 // The second (and greater) line of text that describes the suggestion.
326 views::Label* label_line_2_;
327 // The icon that comes just before |label_|.
328 views::ImageView* icon_;
329 // The input set by ShowTextfield.
330 ExpandingTextfield* textfield_;
331
332 DISALLOW_COPY_AND_ASSIGN(SuggestionView);
333 };
334
335 // A convenience struct for holding pointers to views within each detail
336 // section. None of the member pointers are owned.
337 struct DetailsGroup {
338 explicit DetailsGroup(DialogSection section);
339 DetailsGroup(const DetailsGroup& other);
340 ~DetailsGroup();
341
342 // The section this group is associated with.
343 const DialogSection section;
344 // The view that contains the entire section (label + input).
345 SectionContainer* container;
346 // The view that allows manual input.
347 views::View* manual_input;
348 // The textfields in |manual_input|, tracked by their ServerFieldType.
349 TextfieldMap textfields;
350 // The comboboxes in |manual_input|, tracked by their ServerFieldType.
351 ComboboxMap comboboxes;
352 // The view that holds the text of the suggested data. This will be
353 // visible IFF |manual_input| is not visible.
354 SuggestionView* suggested_info;
355 // The view that allows selecting other data suggestions.
356 SuggestedButton* suggested_button;
357 };
358
359 typedef std::map<DialogSection, DetailsGroup> DetailGroupMap;
360
361 // Returns the preferred size or minimum size (if |get_minimum_size| is true).
362 gfx::Size CalculatePreferredSize(bool get_minimum_size) const;
363
364 // Returns the minimum size of the sign in view for this dialog.
365 gfx::Size GetMinimumSignInViewSize() const;
366
367 // Returns the maximum size of the sign in view for this dialog.
368 gfx::Size GetMaximumSignInViewSize() const;
369
370 // Returns which section should currently be used for credit card info.
371 DialogSection GetCreditCardSection() const;
372
373 void InitChildViews();
374
375 // Creates and returns a view that holds all detail sections.
376 views::View* CreateDetailsContainer();
377
378 // Creates and returns a view that holds the requesting host and intro text.
379 views::View* CreateNotificationArea();
380
381 // Creates and returns a view that holds the main controls of this dialog.
382 views::View* CreateMainContainer();
383
384 // Creates a detail section (Shipping, Email, etc.) with the given label,
385 // inputs View, and suggestion model. Relevant pointers are stored in |group|.
386 void CreateDetailsSection(DialogSection section);
387
388 // Creates the view that holds controls for inputing or selecting data for
389 // a given section.
390 views::View* CreateInputsContainer(DialogSection section);
391
392 // Creates a grid of inputs for the given section.
393 void InitInputsView(DialogSection section);
394
395 // Updates the given section to match the state provided by |delegate_|. If
396 // |clobber_inputs| is true, the current state of the textfields will be
397 // ignored, otherwise their contents will be preserved.
398 void UpdateSectionImpl(DialogSection section, bool clobber_inputs);
399
400 // Updates the visual state of the given group as per the model.
401 void UpdateDetailsGroupState(const DetailsGroup& group);
402
403 // Gets a pointer to the DetailsGroup that's associated with the given section
404 // of the dialog.
405 DetailsGroup* GroupForSection(DialogSection section);
406
407 // Gets a pointer to the DetailsGroup that's associated with a given |view|.
408 // Returns NULL if no DetailsGroup was found.
409 DetailsGroup* GroupForView(views::View* view);
410
411 // Erases all views in |group| from |validity_map_|.
412 void EraseInvalidViewsInGroup(const DetailsGroup* group);
413
414 // Explicitly focuses the initially focusable view.
415 void FocusInitialView();
416
417 // Sets the visual state for an input to be either valid or invalid. This
418 // should work on Comboboxes or ExpandingTextfields. If |message| is empty,
419 // the input is valid.
420 template<class T>
421 void SetValidityForInput(T* input, const base::string16& message);
422
423 // Shows an error bubble pointing at |view| if |view| has a message in
424 // |validity_map_|.
425 void ShowErrorBubbleForViewIfNecessary(views::View* view);
426
427 // Hides |error_bubble_| (if it exists).
428 void HideErrorBubble();
429
430 // Updates validity of the inputs in |section| with new |validity_messages|.
431 // Fields are only updated with unsure messages if |overwrite_valid| is true.
432 void MarkInputsInvalid(DialogSection section,
433 const ValidityMessages& validity_messages,
434 bool overwrite_invalid);
435
436 // Checks all manual inputs in |group| for validity. Decorates the invalid
437 // ones and returns true if all were valid.
438 bool ValidateGroup(const DetailsGroup& group, ValidationType type);
439
440 // Checks all manual inputs in the form for validity. Decorates the invalid
441 // ones and returns true if all were valid.
442 bool ValidateForm();
443
444 // When an input is edited (its contents change) or activated (clicked while
445 // focused), this function will inform the delegate to take the appropriate
446 // action (textfields may show a suggestion popup, comboboxes may rebuild the
447 // section inputs). May also reset the validity state of the input.
448 void InputEditedOrActivated(ServerFieldType type,
449 const gfx::Rect& bounds,
450 bool was_edit);
451
452 // Updates the views in the button strip.
453 void UpdateButtonStripExtraView();
454
455 // Call this when the size of anything in the contents might have changed.
456 void ContentsPreferredSizeChanged();
457 void DoContentsPreferredSizeChanged();
458
459 // Gets the textfield view that is shown for the given |type| or NULL.
460 ExpandingTextfield* TextfieldForType(ServerFieldType type);
461
462 // Returns the associated ServerFieldType for |textfield|.
463 ServerFieldType TypeForTextfield(const views::View* textfield);
464
465 // Gets the combobox view that is shown for the given |type|, or NULL.
466 views::Combobox* ComboboxForType(ServerFieldType type);
467
468 // Returns the associated ServerFieldType for |combobox|.
469 ServerFieldType TypeForCombobox(const views::Combobox* combobox) const;
470
471 // Called when the details container changes in size or position.
472 void DetailsContainerBoundsChanged();
473
474 // Sets the icons in |section| according to the field values. For example,
475 // sets the credit card and CVC icons according to the credit card number.
476 void SetIconsForSection(DialogSection section);
477
478 // Handles mouse presses on the non-client view.
479 void NonClientMousePressed();
480
481 // The delegate that drives this view. Weak pointer, always non-NULL.
482 AutofillDialogViewDelegate* const delegate_;
483
484 // The preferred size of the view, cached to avoid needless recomputation.
485 mutable gfx::Size preferred_size_;
486
487 // The current number of unmatched calls to UpdatesStarted.
488 int updates_scope_;
489
490 // True when there's been a call to ContentsPreferredSizeChanged() suppressed
491 // due to an unmatched UpdatesStarted.
492 bool needs_update_;
493
494 // The window that displays the dialog contents. Weak pointer; may be NULL
495 // when the dialog is closing.
496 views::Widget* window_;
497
498 // A DialogSection-keyed map of the DetailGroup structs.
499 DetailGroupMap detail_groups_;
500
501 // Somewhere to show notification messages about errors, warnings, or promos.
502 NotificationArea* notification_area_;
503
504 // Runs the suggestion menu (triggered by each section's |suggested_button|).
505 std::unique_ptr<views::MenuRunner> menu_runner_;
506
507 // View that wraps |details_container_| and makes it scroll vertically.
508 views::ScrollView* scrollable_area_;
509
510 // View to host details sections.
511 DetailsContainerView* details_container_;
512
513 // The "Extra view" is on the same row as the dialog buttons.
514 views::View* button_strip_extra_view_;
515
516 // This checkbox controls whether new details are saved to the Autofill
517 // database. It lives in |extra_view_|.
518 views::Checkbox* save_in_chrome_checkbox_;
519
520 // Holds the above checkbox and an associated tooltip icon.
521 views::View* save_in_chrome_checkbox_container_;
522
523 // View that aren't in the hierarchy but are owned by |this|. Currently
524 // just holds the (hidden) country comboboxes.
525 ScopedVector<views::View> other_owned_views_;
526
527 // The focus manager for |window_|.
528 views::FocusManager* focus_manager_;
529
530 // The object that manages the error bubble widget.
531 InfoBubble* error_bubble_; // Weak; owns itself.
532
533 // Map from input view (textfield or combobox) to error string.
534 std::map<views::View*, base::string16> validity_map_;
535
536 ScopedObserver<views::Widget, AutofillDialogViews> observer_;
537
538 // Used to tell the delegate when focus moves to hide the Autofill popup.
539 std::unique_ptr<ui::EventHandler> event_handler_;
540
541 DISALLOW_COPY_AND_ASSIGN(AutofillDialogViews);
542 };
543
544 } // namespace autofill
545
546 #endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698