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.
5 #ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
6 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_
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"
57 class AutofillDialogSignInDelegate
;
58 class ExpandingTextfield
;
61 // Views toolkit implementation of the Autofill dialog that handles the
62 // imperative autocomplete API call.
63 class AutofillDialogViews
: public AutofillDialogView
,
64 public views::DialogDelegateView
,
65 public views::WidgetObserver
,
66 public views::TextfieldController
,
67 public views::FocusChangeListener
,
68 public views::ComboboxListener
,
69 public views::StyledLabelListener
,
70 public views::MenuButtonListener
{
72 explicit AutofillDialogViews(AutofillDialogViewDelegate
* delegate
);
73 virtual ~AutofillDialogViews();
75 // AutofillDialogView implementation:
76 virtual void Show() OVERRIDE
;
77 virtual void Hide() OVERRIDE
;
78 virtual void UpdatesStarted() OVERRIDE
;
79 virtual void UpdatesFinished() OVERRIDE
;
80 virtual void UpdateAccountChooser() OVERRIDE
;
81 virtual void UpdateButtonStrip() OVERRIDE
;
82 virtual void UpdateOverlay() OVERRIDE
;
83 virtual void UpdateDetailArea() OVERRIDE
;
84 virtual void UpdateForErrors() OVERRIDE
;
85 virtual void UpdateNotificationArea() OVERRIDE
;
86 virtual void UpdateSection(DialogSection section
) OVERRIDE
;
87 virtual void UpdateErrorBubble() OVERRIDE
;
88 virtual void FillSection(DialogSection section
,
89 ServerFieldType originating_type
) OVERRIDE
;
90 virtual void GetUserInput(DialogSection section
,
91 FieldValueMap
* output
) OVERRIDE
;
92 virtual base::string16
GetCvc() OVERRIDE
;
93 virtual bool SaveDetailsLocally() OVERRIDE
;
94 virtual const content::NavigationController
* ShowSignIn() OVERRIDE
;
95 virtual void HideSignIn() OVERRIDE
;
96 virtual void ModelChanged() OVERRIDE
;
97 virtual void OnSignInResize(const gfx::Size
& pref_size
) OVERRIDE
;
98 virtual void ValidateSection(DialogSection section
) OVERRIDE
;
100 // views::View implementation.
101 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
102 virtual gfx::Size
GetMinimumSize() const OVERRIDE
;
103 virtual void Layout() OVERRIDE
;
104 virtual void OnNativeThemeChanged(const ui::NativeTheme
* theme
) OVERRIDE
;
106 // views::DialogDelegate implementation:
107 virtual base::string16
GetWindowTitle() const OVERRIDE
;
108 virtual void WindowClosing() OVERRIDE
;
109 virtual void DeleteDelegate() OVERRIDE
;
110 virtual views::View
* CreateOverlayView() OVERRIDE
;
111 virtual int GetDialogButtons() const OVERRIDE
;
112 virtual int GetDefaultDialogButton() const OVERRIDE
;
113 virtual base::string16
GetDialogButtonLabel(ui::DialogButton button
) const
115 virtual bool ShouldDefaultButtonBeBlue() const OVERRIDE
;
116 virtual bool IsDialogButtonEnabled(ui::DialogButton button
) const OVERRIDE
;
117 virtual views::View
* GetInitiallyFocusedView() OVERRIDE
;
118 virtual views::View
* CreateExtraView() OVERRIDE
;
119 virtual views::View
* CreateTitlebarExtraView() OVERRIDE
;
120 virtual views::View
* CreateFootnoteView() OVERRIDE
;
121 virtual bool Cancel() OVERRIDE
;
122 virtual bool Accept() OVERRIDE
;
124 // views::WidgetObserver implementation:
125 virtual void OnWidgetClosing(views::Widget
* widget
) OVERRIDE
;
126 virtual void OnWidgetDestroying(views::Widget
* widget
) OVERRIDE
;
127 virtual void OnWidgetBoundsChanged(views::Widget
* widget
,
128 const gfx::Rect
& new_bounds
) OVERRIDE
;
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
;
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
;
144 // views::ComboboxListener implementation:
145 virtual void OnPerformAction(views::Combobox
* combobox
) OVERRIDE
;
147 // views::StyledLabelListener implementation:
148 virtual void StyledLabelLinkClicked(const gfx::Range
& range
, int event_flags
)
151 // views::MenuButtonListener implementation.
152 virtual void OnMenuButtonClicked(views::View
* source
,
153 const gfx::Point
& point
) OVERRIDE
;
156 // Exposed for testing.
157 views::View
* GetLoadingShieldForTesting();
158 views::WebView
* GetSignInWebViewForTesting();
159 views::View
* GetNotificationAreaForTesting();
160 views::View
* GetScrollableAreaForTesting();
163 friend class AutofillDialogViewTesterViews
;
165 // What the entire dialog should be doing (e.g. gathering info from the user,
166 // asking the user to sign in, etc.).
173 // A View which displays the currently selected account and lets the user
175 class AccountChooser
: public views::View
,
176 public views::LinkListener
,
177 public views::MenuButtonListener
,
178 public base::SupportsWeakPtr
<AccountChooser
> {
180 explicit AccountChooser(AutofillDialogViewDelegate
* delegate
);
181 virtual ~AccountChooser();
183 // Updates the view based on the state that |delegate_| reports.
186 // views::LinkListener implementation.
187 virtual void LinkClicked(views::Link
* source
, int event_flags
) OVERRIDE
;
189 // views::MenuButtonListener implementation.
190 virtual void OnMenuButtonClicked(views::View
* source
,
191 const gfx::Point
& point
) OVERRIDE
;
194 // The icon for the currently in-use account.
195 views::ImageView
* image_
;
197 // The button for showing a menu to change the currently in-use account.
198 views::MenuButton
* menu_button_
;
203 // The delegate |this| queries for logic and state.
204 AutofillDialogViewDelegate
* delegate_
;
206 // Runs the suggestion menu (triggered by each section's |suggested_button|.
207 scoped_ptr
<views::MenuRunner
> menu_runner_
;
209 DISALLOW_COPY_AND_ASSIGN(AccountChooser
);
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
{
216 explicit OverlayView(AutofillDialogViewDelegate
* delegate
);
217 virtual ~OverlayView();
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
);
224 // Sets the state to whatever |delegate_| says it should be.
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
;
235 // Gets the border of the non-client frame view as a BubbleBorder.
236 views::BubbleBorder
* GetBubbleBorder();
238 // Gets the bounds of this view without the frame view's bubble border.
239 gfx::Rect
ContentBoundsSansBubbleBorder();
241 // The delegate that provides |state| when UpdateState is called.
242 AutofillDialogViewDelegate
* delegate_
;
244 // Child View. Front and center.
245 views::ImageView
* image_view_
;
246 // Child View. When visible, below |image_view_|.
247 views::Label
* message_view_
;
249 DISALLOW_COPY_AND_ASSIGN(OverlayView
);
252 // An area for notifications. Some notifications point at the account chooser.
253 class NotificationArea
: public views::View
{
255 explicit NotificationArea(AutofillDialogViewDelegate
* delegate
);
256 virtual ~NotificationArea();
258 // Displays the given notifications.
259 void SetNotifications(const std::vector
<DialogNotification
>& notifications
);
261 // views::View implementation.
262 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
263 virtual const char* GetClassName() const OVERRIDE
;
264 virtual void PaintChildren(gfx::Canvas
* canvas
,
265 const views::CullSet
& cull_set
) OVERRIDE
;
266 virtual void OnPaint(gfx::Canvas
* canvas
) OVERRIDE
;
268 void set_arrow_centering_anchor(
269 const base::WeakPtr
<views::View
>& arrow_centering_anchor
) {
270 arrow_centering_anchor_
= arrow_centering_anchor
;
274 // Utility function for determining whether an arrow should be drawn
275 // pointing at |arrow_centering_anchor_|.
278 // A reference to the delegate/controller than owns this view.
279 // Used to report when checkboxes change their values.
280 AutofillDialogViewDelegate
* delegate_
; // weak
282 // If HasArrow() is true, the arrow should point at this.
283 base::WeakPtr
<views::View
> arrow_centering_anchor_
;
285 std::vector
<DialogNotification
> notifications_
;
287 DISALLOW_COPY_AND_ASSIGN(NotificationArea
);
290 typedef std::map
<ServerFieldType
, ExpandingTextfield
*> TextfieldMap
;
291 typedef std::map
<ServerFieldType
, views::Combobox
*> ComboboxMap
;
293 // A view that packs a label on the left and some related controls
295 class SectionContainer
: public views::View
{
297 SectionContainer(const base::string16
& label
,
298 views::View
* controls
,
299 views::Button
* proxy_button
);
300 virtual ~SectionContainer();
302 // Sets the visual appearance of the section to active (considered active
303 // when showing the menu or hovered by the mouse cursor).
304 void SetActive(bool active
);
306 // Sets whether mouse events should be forwarded to |proxy_button_|.
307 void SetForwardMouseEvents(bool forward
);
309 // views::View implementation.
310 virtual const char* GetClassName() const OVERRIDE
;
311 virtual void OnMouseMoved(const ui::MouseEvent
& event
) OVERRIDE
;
312 virtual void OnMouseEntered(const ui::MouseEvent
& event
) OVERRIDE
;
313 virtual void OnMouseExited(const ui::MouseEvent
& event
) OVERRIDE
;
314 virtual bool OnMousePressed(const ui::MouseEvent
& event
) OVERRIDE
;
315 virtual void OnMouseReleased(const ui::MouseEvent
& event
) OVERRIDE
;
316 virtual void OnGestureEvent(ui::GestureEvent
* event
) OVERRIDE
;
317 // This is needed because not all events percolate up the views hierarchy.
318 virtual View
* GetEventHandlerForRect(const gfx::Rect
& rect
) OVERRIDE
;
321 // Converts |event| to one suitable for |proxy_button_|.
322 static ui::MouseEvent
ProxyEvent(const ui::MouseEvent
& event
);
324 // Returns true if the given event should be forwarded to |proxy_button_|.
325 bool ShouldForwardEvent(const ui::LocatedEvent
& event
);
327 // Mouse events on |this| are sent to this button.
328 views::Button
* proxy_button_
; // Weak reference.
330 // When true, all mouse events will be forwarded to |proxy_button_|.
331 bool forward_mouse_events_
;
333 DISALLOW_COPY_AND_ASSIGN(SectionContainer
);
336 // A button to show address or billing suggestions.
337 class SuggestedButton
: public views::MenuButton
{
339 explicit SuggestedButton(views::MenuButtonListener
* listener
);
340 virtual ~SuggestedButton();
342 // views::MenuButton implementation.
343 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
344 virtual const char* GetClassName() const OVERRIDE
;
345 virtual void PaintChildren(gfx::Canvas
* canvas
,
346 const views::CullSet
& cull_set
) OVERRIDE
;
347 virtual void OnPaint(gfx::Canvas
* canvas
) OVERRIDE
;
350 // Returns the corred resource ID (i.e. IDR_*) for the current |state()|.
351 int ResourceIDForState() const;
353 DISALLOW_COPY_AND_ASSIGN(SuggestedButton
);
356 // A view that runs a callback whenever its bounds change, and which can
357 // optionally suppress layout.
358 class DetailsContainerView
: public views::View
{
360 explicit DetailsContainerView(const base::Closure
& callback
);
361 virtual ~DetailsContainerView();
363 void set_ignore_layouts(bool ignore_layouts
) {
364 ignore_layouts_
= ignore_layouts
;
367 // views::View implementation.
368 virtual void OnBoundsChanged(const gfx::Rect
& previous_bounds
) OVERRIDE
;
369 virtual void Layout() OVERRIDE
;
372 base::Closure bounds_changed_callback_
;
374 // The view ignores Layout() calls when this is true.
375 bool ignore_layouts_
;
377 DISALLOW_COPY_AND_ASSIGN(DetailsContainerView
);
380 // A view that contains a suggestion (such as a known address).
381 class SuggestionView
: public views::View
{
383 explicit SuggestionView(AutofillDialogViews
* autofill_dialog
);
384 virtual ~SuggestionView();
386 void SetState(const SuggestionState
& state
);
388 // views::View implementation.
389 virtual gfx::Size
GetPreferredSize() const OVERRIDE
;
390 virtual int GetHeightForWidth(int width
) const OVERRIDE
;
391 virtual void OnBoundsChanged(const gfx::Rect
& previous_bounds
) OVERRIDE
;
393 ExpandingTextfield
* textfield() { return textfield_
; }
396 // Returns whether there's room to display |state_.vertically_compact_text|
397 // without resorting to an ellipsis for a pixel width of |available_width|.
398 // Fills in |resulting_height| with the amount of space required to display
399 // |vertically_compact_text| or |horizontally_compact_text| as the case may
401 bool CanUseVerticallyCompactText(int available_width
,
402 int* resulting_height
) const;
404 // Sets the display text of the suggestion.
405 void SetLabelText(const base::string16
& text
);
407 // Sets the icon which should be displayed ahead of the text.
408 void SetIcon(const gfx::Image
& image
);
410 // Shows an auxiliary textfield to the right of the suggestion icon and
411 // text. This is currently only used to show a CVC field for the CC section.
412 void SetTextfield(const base::string16
& placeholder_text
,
413 const gfx::Image
& icon
);
415 // Calls SetLabelText() with the appropriate text based on current bounds.
416 void UpdateLabelText();
418 // The state of |this|.
419 SuggestionState state_
;
421 // This caches preferred heights for given widths. The key is a preferred
422 // width, the value is a cached result of CanUseVerticallyCompactText.
423 mutable std::map
<int, std::pair
<bool, int> > calculated_heights_
;
425 // The label that holds the suggestion description text.
426 views::Label
* label_
;
427 // The second (and greater) line of text that describes the suggestion.
428 views::Label
* label_line_2_
;
429 // The icon that comes just before |label_|.
430 views::ImageView
* icon_
;
431 // The input set by ShowTextfield.
432 ExpandingTextfield
* textfield_
;
434 DISALLOW_COPY_AND_ASSIGN(SuggestionView
);
437 // A convenience struct for holding pointers to views within each detail
438 // section. None of the member pointers are owned.
439 struct DetailsGroup
{
440 explicit DetailsGroup(DialogSection section
);
443 // The section this group is associated with.
444 const DialogSection section
;
445 // The view that contains the entire section (label + input).
446 SectionContainer
* container
;
447 // The view that allows manual input.
448 views::View
* manual_input
;
449 // The textfields in |manual_input|, tracked by their ServerFieldType.
450 TextfieldMap textfields
;
451 // The comboboxes in |manual_input|, tracked by their ServerFieldType.
452 ComboboxMap comboboxes
;
453 // The view that holds the text of the suggested data. This will be
454 // visible IFF |manual_input| is not visible.
455 SuggestionView
* suggested_info
;
456 // The view that allows selecting other data suggestions.
457 SuggestedButton
* suggested_button
;
460 typedef std::map
<DialogSection
, DetailsGroup
> DetailGroupMap
;
462 // Returns the preferred size or minimum size (if |get_minimum_size| is true).
463 gfx::Size
CalculatePreferredSize(bool get_minimum_size
) const;
465 // Returns the minimum size of the sign in view for this dialog.
466 gfx::Size
GetMinimumSignInViewSize() const;
468 // Returns the maximum size of the sign in view for this dialog.
469 gfx::Size
GetMaximumSignInViewSize() const;
471 // Returns which section should currently be used for credit card info.
472 DialogSection
GetCreditCardSection() const;
474 void InitChildViews();
476 // Creates and returns a view that holds all detail sections.
477 views::View
* CreateDetailsContainer();
479 // Creates and returns a view that holds the requesting host and intro text.
480 views::View
* CreateNotificationArea();
482 // Creates and returns a view that holds the main controls of this dialog.
483 views::View
* CreateMainContainer();
485 // Creates a detail section (Shipping, Email, etc.) with the given label,
486 // inputs View, and suggestion model. Relevant pointers are stored in |group|.
487 void CreateDetailsSection(DialogSection section
);
489 // Creates the view that holds controls for inputing or selecting data for
491 views::View
* CreateInputsContainer(DialogSection section
);
493 // Creates a grid of inputs for the given section.
494 void InitInputsView(DialogSection section
);
496 // Changes the function of the whole dialog. Currently this can show a loading
497 // shield, an embedded sign in web view, or the more typical detail input mode
498 // (suggestions and form inputs).
499 void ShowDialogInMode(DialogMode dialog_mode
);
501 // Updates the given section to match the state provided by |delegate_|. If
502 // |clobber_inputs| is true, the current state of the textfields will be
503 // ignored, otherwise their contents will be preserved.
504 void UpdateSectionImpl(DialogSection section
, bool clobber_inputs
);
506 // Updates the visual state of the given group as per the model.
507 void UpdateDetailsGroupState(const DetailsGroup
& group
);
509 // Gets a pointer to the DetailsGroup that's associated with the given section
511 DetailsGroup
* GroupForSection(DialogSection section
);
513 // Gets a pointer to the DetailsGroup that's associated with a given |view|.
514 // Returns NULL if no DetailsGroup was found.
515 DetailsGroup
* GroupForView(views::View
* view
);
517 // Erases all views in |group| from |validity_map_|.
518 void EraseInvalidViewsInGroup(const DetailsGroup
* group
);
520 // Explicitly focuses the initially focusable view.
521 void FocusInitialView();
523 // Sets the visual state for an input to be either valid or invalid. This
524 // should work on Comboboxes or ExpandingTextfields. If |message| is empty,
525 // the input is valid.
527 void SetValidityForInput(T
* input
, const base::string16
& message
);
529 // Shows an error bubble pointing at |view| if |view| has a message in
531 void ShowErrorBubbleForViewIfNecessary(views::View
* view
);
533 // Hides |error_bubble_| (if it exists).
534 void HideErrorBubble();
536 // Updates validity of the inputs in |section| with new |validity_messages|.
537 // Fields are only updated with unsure messages if |overwrite_valid| is true.
538 void MarkInputsInvalid(DialogSection section
,
539 const ValidityMessages
& validity_messages
,
540 bool overwrite_invalid
);
542 // Checks all manual inputs in |group| for validity. Decorates the invalid
543 // ones and returns true if all were valid.
544 bool ValidateGroup(const DetailsGroup
& group
, ValidationType type
);
546 // Checks all manual inputs in the form for validity. Decorates the invalid
547 // ones and returns true if all were valid.
550 // When an input is edited (its contents change) or activated (clicked while
551 // focused), this function will inform the delegate to take the appropriate
552 // action (textfields may show a suggestion popup, comboboxes may rebuild the
553 // section inputs). May also reset the validity state of the input.
554 void InputEditedOrActivated(ServerFieldType type
,
555 const gfx::Rect
& bounds
,
558 // Updates the views in the button strip.
559 void UpdateButtonStripExtraView();
561 // Call this when the size of anything in |contents_| might've changed.
562 void ContentsPreferredSizeChanged();
563 void DoContentsPreferredSizeChanged();
565 // Gets the textfield view that is shown for the given |type| or NULL.
566 ExpandingTextfield
* TextfieldForType(ServerFieldType type
);
568 // Returns the associated ServerFieldType for |textfield|.
569 ServerFieldType
TypeForTextfield(const views::View
* textfield
);
571 // Gets the combobox view that is shown for the given |type|, or NULL.
572 views::Combobox
* ComboboxForType(ServerFieldType type
);
574 // Returns the associated ServerFieldType for |combobox|.
575 ServerFieldType
TypeForCombobox(const views::Combobox
* combobox
) const;
577 // Called when the details container changes in size or position.
578 void DetailsContainerBoundsChanged();
580 // Sets the icons in |section| according to the field values. For example,
581 // sets the credit card and CVC icons according to the credit card number.
582 void SetIconsForSection(DialogSection section
);
584 // Iterates over all the inputs in |section| and sets their enabled/disabled
586 void SetEditabilityForSection(DialogSection section
);
588 // Handles mouse presses on the non-client view.
589 void NonClientMousePressed();
591 // The delegate that drives this view. Weak pointer, always non-NULL.
592 AutofillDialogViewDelegate
* const delegate_
;
594 // The preferred size of the view, cached to avoid needless recomputation.
595 mutable gfx::Size preferred_size_
;
597 // The current number of unmatched calls to UpdatesStarted.
600 // True when there's been a call to ContentsPreferredSizeChanged() suppressed
601 // due to an unmatched UpdatesStarted.
604 // The window that displays |contents_|. Weak pointer; may be NULL when the
605 // dialog is closing.
606 views::Widget
* window_
;
608 // A DialogSection-keyed map of the DetailGroup structs.
609 DetailGroupMap detail_groups_
;
611 // Somewhere to show notification messages about errors, warnings, or promos.
612 NotificationArea
* notification_area_
;
614 // Runs the suggestion menu (triggered by each section's |suggested_button|.
615 scoped_ptr
<views::MenuRunner
> menu_runner_
;
617 // The view that allows the user to toggle the data source.
618 AccountChooser
* account_chooser_
;
620 // A WebView to that navigates to a Google sign-in page to allow the user to
622 views::WebView
* sign_in_web_view_
;
624 // View that wraps |details_container_| and makes it scroll vertically.
625 views::ScrollView
* scrollable_area_
;
627 // View to host details sections.
628 DetailsContainerView
* details_container_
;
630 // A view that overlays |this| (for "loading..." messages).
631 views::View
* loading_shield_
;
633 // The height for |loading_shield_|. This prevents the height of the dialog
634 // from changing while the loading shield is showing.
635 int loading_shield_height_
;
637 // The view that completely overlays the dialog (used for the splash page).
638 OverlayView
* overlay_view_
;
640 // The "Extra view" is on the same row as the dialog buttons.
641 views::View
* button_strip_extra_view_
;
643 // This checkbox controls whether new details are saved to the Autofill
644 // database. It lives in |extra_view_|.
645 views::Checkbox
* save_in_chrome_checkbox_
;
647 // Holds the above checkbox and an associated tooltip icon.
648 views::View
* save_in_chrome_checkbox_container_
;
650 // Used to display an image in the button strip extra view.
651 views::ImageView
* button_strip_image_
;
653 // View that aren't in the hierarchy but are owned by |this|. Currently
654 // just holds the (hidden) country comboboxes.
655 ScopedVector
<views::View
> other_owned_views_
;
657 // The view that is appended to the bottom of the dialog, below the button
658 // strip. Used to display legal document links.
659 views::View
* footnote_view_
;
661 // The legal document text and links.
662 views::StyledLabel
* legal_document_view_
;
664 // The focus manager for |window_|.
665 views::FocusManager
* focus_manager_
;
667 // The object that manages the error bubble widget.
668 InfoBubble
* error_bubble_
; // Weak; owns itself.
670 // Map from input view (textfield or combobox) to error string.
671 std::map
<views::View
*, base::string16
> validity_map_
;
673 ScopedObserver
<views::Widget
, AutofillDialogViews
> observer_
;
675 // Delegate for the sign-in dialog's webview.
676 scoped_ptr
<AutofillDialogSignInDelegate
> sign_in_delegate_
;
678 // Used to tell the delegate when focus moves to hide the Autofill popup.
679 scoped_ptr
<ui::EventHandler
> event_handler_
;
681 DISALLOW_COPY_AND_ASSIGN(AutofillDialogViews
);
684 } // namespace autofill
686 #endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_