autofill_dialog_views.h revision effb81e5f8246d0db0270817048dc992db66e9fb
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/memory/scoped_vector.h"
12#include "base/memory/weak_ptr.h"
13#include "base/scoped_observer.h"
14#include "chrome/browser/ui/autofill/autofill_dialog_types.h"
15#include "chrome/browser/ui/autofill/autofill_dialog_view.h"
16#include "chrome/browser/ui/autofill/autofill_dialog_view_delegate.h"
17#include "ui/views/controls/button/button.h"
18#include "ui/views/controls/button/menu_button.h"
19#include "ui/views/controls/button/menu_button_listener.h"
20#include "ui/views/controls/combobox/combobox_listener.h"
21#include "ui/views/controls/link_listener.h"
22#include "ui/views/controls/progress_bar.h"
23#include "ui/views/controls/scroll_view.h"
24#include "ui/views/controls/styled_label_listener.h"
25#include "ui/views/controls/textfield/textfield_controller.h"
26#include "ui/views/focus/focus_manager.h"
27#include "ui/views/widget/widget_observer.h"
28#include "ui/views/window/dialog_delegate.h"
29
30namespace gfx {
31class Image;
32}
33
34namespace views {
35class BubbleBorder;
36class Checkbox;
37class Combobox;
38class FocusManager;
39class ImageView;
40class Label;
41class LabelButton;
42class Link;
43class MenuRunner;
44class StyledLabel;
45class WebView;
46class Widget;
47}  // namespace views
48
49namespace ui {
50class ComboboxModel;
51class KeyEvent;
52}
53
54namespace autofill {
55
56class AutofillDialogSignInDelegate;
57class ExpandingTextfield;
58class InfoBubble;
59
60// Views toolkit implementation of the Autofill dialog that handles the
61// imperative autocomplete API call.
62class AutofillDialogViews : public AutofillDialogView,
63                            public views::DialogDelegateView,
64                            public views::WidgetObserver,
65                            public views::TextfieldController,
66                            public views::FocusChangeListener,
67                            public views::ComboboxListener,
68                            public views::StyledLabelListener,
69                            public views::MenuButtonListener {
70 public:
71  explicit AutofillDialogViews(AutofillDialogViewDelegate* delegate);
72  virtual ~AutofillDialogViews();
73
74  // AutofillDialogView implementation:
75  virtual void Show() OVERRIDE;
76  virtual void Hide() OVERRIDE;
77  virtual void UpdatesStarted() OVERRIDE;
78  virtual void UpdatesFinished() OVERRIDE;
79  virtual void UpdateAccountChooser() OVERRIDE;
80  virtual void UpdateButtonStrip() OVERRIDE;
81  virtual void UpdateOverlay() OVERRIDE;
82  virtual void UpdateDetailArea() OVERRIDE;
83  virtual void UpdateForErrors() OVERRIDE;
84  virtual void UpdateNotificationArea() OVERRIDE;
85  virtual void UpdateSection(DialogSection section) OVERRIDE;
86  virtual void UpdateErrorBubble() OVERRIDE;
87  virtual void FillSection(DialogSection section,
88                           ServerFieldType originating_type) OVERRIDE;
89  virtual void GetUserInput(DialogSection section,
90                            FieldValueMap* output) OVERRIDE;
91  virtual base::string16 GetCvc() OVERRIDE;
92  virtual bool HitTestInput(ServerFieldType type,
93                            const gfx::Point& screen_point) OVERRIDE;
94  virtual bool SaveDetailsLocally() OVERRIDE;
95  virtual const content::NavigationController* ShowSignIn() OVERRIDE;
96  virtual void HideSignIn() OVERRIDE;
97  virtual void ModelChanged() OVERRIDE;
98  virtual void OnSignInResize(const gfx::Size& pref_size) OVERRIDE;
99  virtual void ValidateSection(DialogSection section) OVERRIDE;
100
101  // views::View implementation.
102  virtual gfx::Size GetPreferredSize() OVERRIDE;
103  virtual gfx::Size GetMinimumSize() OVERRIDE;
104  virtual void Layout() OVERRIDE;
105  virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE;
106
107  // views::DialogDelegate implementation:
108  virtual base::string16 GetWindowTitle() const OVERRIDE;
109  virtual void WindowClosing() OVERRIDE;
110  virtual void DeleteDelegate() OVERRIDE;
111  virtual views::View* CreateOverlayView() OVERRIDE;
112  virtual int GetDialogButtons() const OVERRIDE;
113  virtual int GetDefaultDialogButton() const OVERRIDE;
114  virtual base::string16 GetDialogButtonLabel(ui::DialogButton button) const
115      OVERRIDE;
116  virtual bool ShouldDefaultButtonBeBlue() const OVERRIDE;
117  virtual bool IsDialogButtonEnabled(ui::DialogButton button) const OVERRIDE;
118  virtual views::View* GetInitiallyFocusedView() OVERRIDE;
119  virtual views::View* CreateExtraView() OVERRIDE;
120  virtual views::View* CreateTitlebarExtraView() OVERRIDE;
121  virtual views::View* CreateFootnoteView() OVERRIDE;
122  virtual bool Cancel() OVERRIDE;
123  virtual bool Accept() OVERRIDE;
124
125  // views::WidgetObserver implementation:
126  virtual void OnWidgetClosing(views::Widget* widget) OVERRIDE;
127  virtual void OnWidgetBoundsChanged(views::Widget* widget,
128                                     const gfx::Rect& new_bounds) OVERRIDE;
129
130  // views::TextfieldController implementation:
131  virtual void ContentsChanged(views::Textfield* sender,
132                               const base::string16& new_contents) OVERRIDE;
133  virtual bool HandleKeyEvent(views::Textfield* sender,
134                              const ui::KeyEvent& key_event) OVERRIDE;
135  virtual bool HandleMouseEvent(views::Textfield* sender,
136                                const ui::MouseEvent& key_event) OVERRIDE;
137
138  // views::FocusChangeListener implementation.
139  virtual void OnWillChangeFocus(views::View* focused_before,
140                                 views::View* focused_now) OVERRIDE;
141  virtual void OnDidChangeFocus(views::View* focused_before,
142                                views::View* focused_now) OVERRIDE;
143
144  // views::ComboboxListener implementation:
145  virtual void OnPerformAction(views::Combobox* combobox) OVERRIDE;
146
147  // views::StyledLabelListener implementation:
148  virtual void StyledLabelLinkClicked(const gfx::Range& range, int event_flags)
149      OVERRIDE;
150
151  // views::MenuButtonListener implementation.
152  virtual void OnMenuButtonClicked(views::View* source,
153                                   const gfx::Point& point) OVERRIDE;
154
155 protected:
156  // Exposed for testing.
157  views::View* GetLoadingShieldForTesting();
158  views::WebView* GetSignInWebViewForTesting();
159  views::View* GetNotificationAreaForTesting();
160  views::View* GetScrollableAreaForTesting();
161
162 private:
163  friend class AutofillDialogViewTesterViews;
164
165  // What the entire dialog should be doing (e.g. gathering info from the user,
166  // asking the user to sign in, etc.).
167  enum DialogMode {
168    DETAIL_INPUT,
169    LOADING,
170    SIGN_IN,
171  };
172
173  // A View which displays the currently selected account and lets the user
174  // switch accounts.
175  class AccountChooser : public views::View,
176                         public views::LinkListener,
177                         public views::MenuButtonListener,
178                         public base::SupportsWeakPtr<AccountChooser> {
179   public:
180    explicit AccountChooser(AutofillDialogViewDelegate* delegate);
181    virtual ~AccountChooser();
182
183    // Updates the view based on the state that |delegate_| reports.
184    void Update();
185
186    // views::LinkListener implementation.
187    virtual void LinkClicked(views::Link* source, int event_flags) OVERRIDE;
188
189    // views::MenuButtonListener implementation.
190    virtual void OnMenuButtonClicked(views::View* source,
191                                     const gfx::Point& point) OVERRIDE;
192
193   private:
194    // The icon for the currently in-use account.
195    views::ImageView* image_;
196
197    // The button for showing a menu to change the currently in-use account.
198    views::MenuButton* menu_button_;
199
200    // The sign in link.
201    views::Link* link_;
202
203    // The delegate |this| queries for logic and state.
204    AutofillDialogViewDelegate* delegate_;
205
206    // Runs the suggestion menu (triggered by each section's |suggested_button|.
207    scoped_ptr<views::MenuRunner> menu_runner_;
208
209    DISALLOW_COPY_AND_ASSIGN(AccountChooser);
210  };
211
212  // A view which displays an image, optionally some messages and a button. Used
213  // for the Wallet interstitial.
214  class OverlayView : public views::View {
215   public:
216    explicit OverlayView(AutofillDialogViewDelegate* delegate);
217    virtual ~OverlayView();
218
219    // Returns a height which should be used when the contents view has width
220    // |w|. Note that the value returned should be used as the height of the
221    // dialog's contents.
222    int GetHeightForContentsForWidth(int width);
223
224    // Sets the state to whatever |delegate_| says it should be.
225    void UpdateState();
226
227    // views::View implementation:
228    virtual gfx::Insets GetInsets() const OVERRIDE;
229    virtual void Layout() OVERRIDE;
230    virtual const char* GetClassName() const OVERRIDE;
231    virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
232    virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE;
233
234   private:
235    // Gets the border of the non-client frame view as a BubbleBorder.
236    views::BubbleBorder* GetBubbleBorder();
237
238    // Gets the bounds of this view without the frame view's bubble border.
239    gfx::Rect ContentBoundsSansBubbleBorder();
240
241    // The delegate that provides |state| when UpdateState is called.
242    AutofillDialogViewDelegate* delegate_;
243
244    // Child View. Front and center.
245    views::ImageView* image_view_;
246    // Child View. When visible, below |image_view_|.
247    views::Label* message_view_;
248
249    DISALLOW_COPY_AND_ASSIGN(OverlayView);
250  };
251
252  // An area for notifications. Some notifications point at the account chooser.
253  class NotificationArea : public views::View {
254   public:
255    explicit NotificationArea(AutofillDialogViewDelegate* delegate);
256    virtual ~NotificationArea();
257
258    // Displays the given notifications.
259    void SetNotifications(const std::vector<DialogNotification>& notifications);
260
261    // views::View implementation.
262    virtual gfx::Size GetPreferredSize() OVERRIDE;
263    virtual const char* GetClassName() const OVERRIDE;
264    virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
265    virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
266
267    void set_arrow_centering_anchor(
268        const base::WeakPtr<views::View>& arrow_centering_anchor) {
269      arrow_centering_anchor_ = arrow_centering_anchor;
270    }
271
272   private:
273    // Utility function for determining whether an arrow should be drawn
274    // pointing at |arrow_centering_anchor_|.
275    bool HasArrow();
276
277    // A reference to the delegate/controller than owns this view.
278    // Used to report when checkboxes change their values.
279    AutofillDialogViewDelegate* delegate_;  // weak
280
281    // If HasArrow() is true, the arrow should point at this.
282    base::WeakPtr<views::View> arrow_centering_anchor_;
283
284    std::vector<DialogNotification> notifications_;
285
286    DISALLOW_COPY_AND_ASSIGN(NotificationArea);
287  };
288
289  typedef std::map<ServerFieldType, ExpandingTextfield*> TextfieldMap;
290  typedef std::map<ServerFieldType, views::Combobox*> ComboboxMap;
291
292  // A view that packs a label on the left and some related controls
293  // on the right.
294  class SectionContainer : public views::View {
295   public:
296    SectionContainer(const base::string16& label,
297                     views::View* controls,
298                     views::Button* proxy_button);
299    virtual ~SectionContainer();
300
301    // Sets the visual appearance of the section to active (considered active
302    // when showing the menu or hovered by the mouse cursor).
303    void SetActive(bool active);
304
305    // Sets whether mouse events should be forwarded to |proxy_button_|.
306    void SetForwardMouseEvents(bool forward);
307
308    // views::View implementation.
309    virtual const char* GetClassName() const OVERRIDE;
310    virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE;
311    virtual void OnMouseEntered(const ui::MouseEvent& event) OVERRIDE;
312    virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
313    virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
314    virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
315    virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
316    // This is needed because not all events percolate up the views hierarchy.
317    virtual View* GetEventHandlerForRect(const gfx::Rect& rect) OVERRIDE;
318
319   private:
320    // Converts |event| to one suitable for |proxy_button_|.
321    static ui::MouseEvent ProxyEvent(const ui::MouseEvent& event);
322
323    // Returns true if the given event should be forwarded to |proxy_button_|.
324    bool ShouldForwardEvent(const ui::LocatedEvent& event);
325
326    // Mouse events on |this| are sent to this button.
327    views::Button* proxy_button_;  // Weak reference.
328
329    // When true, all mouse events will be forwarded to |proxy_button_|.
330    bool forward_mouse_events_;
331
332    DISALLOW_COPY_AND_ASSIGN(SectionContainer);
333  };
334
335  // A button to show address or billing suggestions.
336  class SuggestedButton : public views::MenuButton {
337   public:
338    explicit SuggestedButton(views::MenuButtonListener* listener);
339    virtual ~SuggestedButton();
340
341    // views::MenuButton implementation.
342    virtual gfx::Size GetPreferredSize() OVERRIDE;
343    virtual const char* GetClassName() const OVERRIDE;
344    virtual void PaintChildren(gfx::Canvas* canvas) OVERRIDE;
345    virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
346
347   private:
348    // Returns the corred resource ID (i.e. IDR_*) for the current |state()|.
349    int ResourceIDForState() const;
350
351    DISALLOW_COPY_AND_ASSIGN(SuggestedButton);
352  };
353
354  // A view that runs a callback whenever its bounds change, and which can
355  // optionally suppress layout.
356  class DetailsContainerView : public views::View {
357   public:
358    explicit DetailsContainerView(const base::Closure& callback);
359    virtual ~DetailsContainerView();
360
361    void set_ignore_layouts(bool ignore_layouts) {
362      ignore_layouts_ = ignore_layouts;
363    }
364
365    // views::View implementation.
366    virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
367    virtual void Layout() OVERRIDE;
368
369   private:
370    base::Closure bounds_changed_callback_;
371
372    // The view ignores Layout() calls when this is true.
373    bool ignore_layouts_;
374
375    DISALLOW_COPY_AND_ASSIGN(DetailsContainerView);
376  };
377
378  // A view that contains a suggestion (such as a known address) and a link to
379  // edit the suggestion.
380  class SuggestionView : public views::View {
381   public:
382    explicit SuggestionView(AutofillDialogViews* autofill_dialog);
383    virtual ~SuggestionView();
384
385    void SetState(const SuggestionState& state);
386
387    // views::View implementation.
388    virtual gfx::Size GetPreferredSize() OVERRIDE;
389    virtual int GetHeightForWidth(int width) OVERRIDE;
390    virtual void OnBoundsChanged(const gfx::Rect& previous_bounds) OVERRIDE;
391
392    ExpandingTextfield* textfield() { return textfield_; }
393
394   private:
395    // Returns whether there's room to display |state_.vertically_compact_text|
396    // without resorting to an ellipsis for a pixel width of |available_width|.
397    // Fills in |resulting_height| with the amount of space required to display
398    // |vertically_compact_text| or |horizontally_compact_text| as the case may
399    // be.
400    bool CanUseVerticallyCompactText(int available_width,
401                                     int* resulting_height);
402
403    // Sets the display text of the suggestion.
404    void SetLabelText(const base::string16& text);
405
406    // Sets the icon which should be displayed ahead of the text.
407    void SetIcon(const gfx::Image& image);
408
409    // Shows an auxiliary textfield to the right of the suggestion icon and
410    // text. This is currently only used to show a CVC field for the CC section.
411    void SetTextfield(const base::string16& placeholder_text,
412                      const gfx::Image& icon);
413
414    // Calls SetLabelText() with the appropriate text based on current bounds.
415    void UpdateLabelText();
416
417    // The state of |this|.
418    SuggestionState state_;
419
420    // This caches preferred heights for given widths. The key is a preferred
421    // width, the value is a cached result of CanUseVerticallyCompactText.
422    std::map<int, std::pair<bool, int> > calculated_heights_;
423
424    // The label that holds the suggestion description text.
425    views::Label* label_;
426    // The second (and greater) line of text that describes the suggestion.
427    views::Label* label_line_2_;
428    // The icon that comes just before |label_|.
429    views::ImageView* icon_;
430    // The input set by ShowTextfield.
431    ExpandingTextfield* textfield_;
432    // An "Edit" link that flips to editable inputs rather than suggestion text.
433    views::Link* edit_link_;
434
435    DISALLOW_COPY_AND_ASSIGN(SuggestionView);
436  };
437
438  // A convenience struct for holding pointers to views within each detail
439  // section. None of the member pointers are owned.
440  struct DetailsGroup {
441    explicit DetailsGroup(DialogSection section);
442    ~DetailsGroup();
443
444    // The section this group is associated with.
445    const DialogSection section;
446    // The view that contains the entire section (label + input).
447    SectionContainer* container;
448    // The view that allows manual input.
449    views::View* manual_input;
450    // The textfields in |manual_input|, tracked by their ServerFieldType.
451    TextfieldMap textfields;
452    // The comboboxes in |manual_input|, tracked by their ServerFieldType.
453    ComboboxMap comboboxes;
454    // The view that holds the text of the suggested data. This will be
455    // visible IFF |manual_input| is not visible.
456    SuggestionView* suggested_info;
457    // The view that allows selecting other data suggestions.
458    SuggestedButton* suggested_button;
459  };
460
461  typedef std::map<DialogSection, DetailsGroup> DetailGroupMap;
462
463  // Returns the preferred size or minimum size (if |get_minimum_size| is true).
464  gfx::Size CalculatePreferredSize(bool get_minimum_size);
465
466  // Returns the minimum size of the sign in view for this dialog.
467  gfx::Size GetMinimumSignInViewSize() const;
468
469  // Returns the maximum size of the sign in view for this dialog.
470  gfx::Size GetMaximumSignInViewSize() const;
471
472  // Returns which section should currently be used for credit card info.
473  DialogSection GetCreditCardSection() const;
474
475  void InitChildViews();
476
477  // Creates and returns a view that holds all detail sections.
478  views::View* CreateDetailsContainer();
479
480  // Creates and returns a view that holds the requesting host and intro text.
481  views::View* CreateNotificationArea();
482
483  // Creates and returns a view that holds the main controls of this dialog.
484  views::View* CreateMainContainer();
485
486  // Creates a detail section (Shipping, Email, etc.) with the given label,
487  // inputs View, and suggestion model. Relevant pointers are stored in |group|.
488  void CreateDetailsSection(DialogSection section);
489
490  // Creates the view that holds controls for inputing or selecting data for
491  // a given section.
492  views::View* CreateInputsContainer(DialogSection section);
493
494  // Creates a grid of inputs for the given section.
495  void InitInputsView(DialogSection section);
496
497  // Changes the function of the whole dialog. Currently this can show a loading
498  // shield, an embedded sign in web view, or the more typical detail input mode
499  // (suggestions and form inputs).
500  void ShowDialogInMode(DialogMode dialog_mode);
501
502  // Updates the given section to match the state provided by |delegate_|. If
503  // |clobber_inputs| is true, the current state of the textfields will be
504  // ignored, otherwise their contents will be preserved.
505  void UpdateSectionImpl(DialogSection section, bool clobber_inputs);
506
507  // Updates the visual state of the given group as per the model.
508  void UpdateDetailsGroupState(const DetailsGroup& group);
509
510  // Gets a pointer to the DetailsGroup that's associated with the given section
511  // of the dialog.
512  DetailsGroup* GroupForSection(DialogSection section);
513
514  // Gets a pointer to the DetailsGroup that's associated with a given |view|.
515  // Returns NULL if no DetailsGroup was found.
516  DetailsGroup* GroupForView(views::View* view);
517
518  // Erases all views in |group| from |validity_map_|.
519  void EraseInvalidViewsInGroup(const DetailsGroup* group);
520
521  // Explicitly focuses the initially focusable view.
522  void FocusInitialView();
523
524  // Sets the visual state for an input to be either valid or invalid. This
525  // should work on Comboboxes or ExpandingTextfields. If |message| is empty,
526  // the input is valid.
527  template<class T>
528  void SetValidityForInput(T* input, const base::string16& message);
529
530  // Shows an error bubble pointing at |view| if |view| has a message in
531  // |validity_map_|.
532  void ShowErrorBubbleForViewIfNecessary(views::View* view);
533
534  // Hides |error_bubble_| (if it exists).
535  void HideErrorBubble();
536
537  // Updates validity of the inputs in |section| with new |validity_messages|.
538  // Fields are only updated with unsure messages if |overwrite_valid| is true.
539  void MarkInputsInvalid(DialogSection section,
540                         const ValidityMessages& validity_messages,
541                         bool overwrite_invalid);
542
543  // Checks all manual inputs in |group| for validity. Decorates the invalid
544  // ones and returns true if all were valid.
545  bool ValidateGroup(const DetailsGroup& group, ValidationType type);
546
547  // Checks all manual inputs in the form for validity. Decorates the invalid
548  // ones and returns true if all were valid.
549  bool ValidateForm();
550
551  // When an input is edited (its contents change) or activated (clicked while
552  // focused), this function will inform the delegate to take the appropriate
553  // action (textfields may show a suggestion popup, comboboxes may rebuild the
554  // section inputs). May also reset the validity state of the input.
555  void InputEditedOrActivated(ServerFieldType type,
556                              const gfx::Rect& bounds,
557                              bool was_edit);
558
559  // Updates the views in the button strip.
560  void UpdateButtonStripExtraView();
561
562  // Call this when the size of anything in |contents_| might've changed.
563  void ContentsPreferredSizeChanged();
564  void DoContentsPreferredSizeChanged();
565
566  // Gets the textfield view that is shown for the given |type| or NULL.
567  ExpandingTextfield* TextfieldForType(ServerFieldType type);
568
569  // Returns the associated ServerFieldType for |textfield|.
570  ServerFieldType TypeForTextfield(const views::View* textfield);
571
572  // Gets the combobox view that is shown for the given |type|, or NULL.
573  views::Combobox* ComboboxForType(ServerFieldType type);
574
575  // Returns the associated ServerFieldType for |combobox|.
576  ServerFieldType TypeForCombobox(const views::Combobox* combobox) const;
577
578  // Called when the details container changes in size or position.
579  void DetailsContainerBoundsChanged();
580
581  // Sets the icons in |section| according to the field values. For example,
582  // sets the credit card and CVC icons according to the credit card number.
583  void SetIconsForSection(DialogSection section);
584
585  // Iterates over all the inputs in |section| and sets their enabled/disabled
586  // state.
587  void SetEditabilityForSection(DialogSection section);
588
589  // The delegate that drives this view. Weak pointer, always non-NULL.
590  AutofillDialogViewDelegate* const delegate_;
591
592  // The preferred size of the view, cached to avoid needless recomputation.
593  gfx::Size preferred_size_;
594
595  // The current number of unmatched calls to UpdatesStarted.
596  int updates_scope_;
597
598  // True when there's been a call to ContentsPreferredSizeChanged() suppressed
599  // due to an unmatched UpdatesStarted.
600  bool needs_update_;
601
602  // The window that displays |contents_|. Weak pointer; may be NULL when the
603  // dialog is closing.
604  views::Widget* window_;
605
606  // A DialogSection-keyed map of the DetailGroup structs.
607  DetailGroupMap detail_groups_;
608
609  // Somewhere to show notification messages about errors, warnings, or promos.
610  NotificationArea* notification_area_;
611
612  // Runs the suggestion menu (triggered by each section's |suggested_button|.
613  scoped_ptr<views::MenuRunner> menu_runner_;
614
615  // The view that allows the user to toggle the data source.
616  AccountChooser* account_chooser_;
617
618  // A WebView to that navigates to a Google sign-in page to allow the user to
619  // sign-in.
620  views::WebView* sign_in_web_view_;
621
622  // View that wraps |details_container_| and makes it scroll vertically.
623  views::ScrollView* scrollable_area_;
624
625  // View to host details sections.
626  DetailsContainerView* details_container_;
627
628  // A view that overlays |this| (for "loading..." messages).
629  views::View* loading_shield_;
630
631  // The height for |loading_shield_|. This prevents the height of the dialog
632  // from changing while the loading shield is showing.
633  int loading_shield_height_;
634
635  // The view that completely overlays the dialog (used for the splash page).
636  OverlayView* overlay_view_;
637
638  // The "Extra view" is on the same row as the dialog buttons.
639  views::View* button_strip_extra_view_;
640
641  // This checkbox controls whether new details are saved to the Autofill
642  // database. It lives in |extra_view_|.
643  views::Checkbox* save_in_chrome_checkbox_;
644
645  // Holds the above checkbox and an associated tooltip icon.
646  views::View* save_in_chrome_checkbox_container_;
647
648  // Used to display an image in the button strip extra view.
649  views::ImageView* button_strip_image_;
650
651  // View that aren't in the hierarchy but are owned by |this|. Currently
652  // just holds the (hidden) country comboboxes.
653  ScopedVector<views::View> other_owned_views_;
654
655  // The view that is appended to the bottom of the dialog, below the button
656  // strip. Used to display legal document links.
657  views::View* footnote_view_;
658
659  // The legal document text and links.
660  views::StyledLabel* legal_document_view_;
661
662  // The focus manager for |window_|.
663  views::FocusManager* focus_manager_;
664
665  // The object that manages the error bubble widget.
666  InfoBubble* error_bubble_;  // Weak; owns itself.
667
668  // Map from input view (textfield or combobox) to error string.
669  std::map<views::View*, base::string16> validity_map_;
670
671  ScopedObserver<views::Widget, AutofillDialogViews> observer_;
672
673  // Delegate for the sign-in dialog's webview.
674  scoped_ptr<AutofillDialogSignInDelegate> sign_in_delegate_;
675
676  DISALLOW_COPY_AND_ASSIGN(AutofillDialogViews);
677};
678
679}  // namespace autofill
680
681#endif  // CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
682