autofill_dialog_views.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
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 EventHandler; 52class KeyEvent; 53} 54 55namespace autofill { 56 57class AutofillDialogSignInDelegate; 58class ExpandingTextfield; 59class InfoBubble; 60 61// Views toolkit implementation of the Autofill dialog that handles the 62// imperative autocomplete API call. 63class 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 { 71 public: 72 explicit AutofillDialogViews(AutofillDialogViewDelegate* delegate); 73 virtual ~AutofillDialogViews(); 74 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; 99 100 // views::View implementation. 101 virtual gfx::Size GetPreferredSize() OVERRIDE; 102 virtual gfx::Size GetMinimumSize() OVERRIDE; 103 virtual void Layout() OVERRIDE; 104 virtual void OnNativeThemeChanged(const ui::NativeTheme* theme) OVERRIDE; 105 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 114 OVERRIDE; 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; 123 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; 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 // Handles mouse presses on the non-client view. 590 void NonClientMousePressed(); 591 592 // The delegate that drives this view. Weak pointer, always non-NULL. 593 AutofillDialogViewDelegate* const delegate_; 594 595 // The preferred size of the view, cached to avoid needless recomputation. 596 gfx::Size preferred_size_; 597 598 // The current number of unmatched calls to UpdatesStarted. 599 int updates_scope_; 600 601 // True when there's been a call to ContentsPreferredSizeChanged() suppressed 602 // due to an unmatched UpdatesStarted. 603 bool needs_update_; 604 605 // The window that displays |contents_|. Weak pointer; may be NULL when the 606 // dialog is closing. 607 views::Widget* window_; 608 609 // A DialogSection-keyed map of the DetailGroup structs. 610 DetailGroupMap detail_groups_; 611 612 // Somewhere to show notification messages about errors, warnings, or promos. 613 NotificationArea* notification_area_; 614 615 // Runs the suggestion menu (triggered by each section's |suggested_button|. 616 scoped_ptr<views::MenuRunner> menu_runner_; 617 618 // The view that allows the user to toggle the data source. 619 AccountChooser* account_chooser_; 620 621 // A WebView to that navigates to a Google sign-in page to allow the user to 622 // sign-in. 623 views::WebView* sign_in_web_view_; 624 625 // View that wraps |details_container_| and makes it scroll vertically. 626 views::ScrollView* scrollable_area_; 627 628 // View to host details sections. 629 DetailsContainerView* details_container_; 630 631 // A view that overlays |this| (for "loading..." messages). 632 views::View* loading_shield_; 633 634 // The height for |loading_shield_|. This prevents the height of the dialog 635 // from changing while the loading shield is showing. 636 int loading_shield_height_; 637 638 // The view that completely overlays the dialog (used for the splash page). 639 OverlayView* overlay_view_; 640 641 // The "Extra view" is on the same row as the dialog buttons. 642 views::View* button_strip_extra_view_; 643 644 // This checkbox controls whether new details are saved to the Autofill 645 // database. It lives in |extra_view_|. 646 views::Checkbox* save_in_chrome_checkbox_; 647 648 // Holds the above checkbox and an associated tooltip icon. 649 views::View* save_in_chrome_checkbox_container_; 650 651 // Used to display an image in the button strip extra view. 652 views::ImageView* button_strip_image_; 653 654 // View that aren't in the hierarchy but are owned by |this|. Currently 655 // just holds the (hidden) country comboboxes. 656 ScopedVector<views::View> other_owned_views_; 657 658 // The view that is appended to the bottom of the dialog, below the button 659 // strip. Used to display legal document links. 660 views::View* footnote_view_; 661 662 // The legal document text and links. 663 views::StyledLabel* legal_document_view_; 664 665 // The focus manager for |window_|. 666 views::FocusManager* focus_manager_; 667 668 // The object that manages the error bubble widget. 669 InfoBubble* error_bubble_; // Weak; owns itself. 670 671 // Map from input view (textfield or combobox) to error string. 672 std::map<views::View*, base::string16> validity_map_; 673 674 ScopedObserver<views::Widget, AutofillDialogViews> observer_; 675 676 // Delegate for the sign-in dialog's webview. 677 scoped_ptr<AutofillDialogSignInDelegate> sign_in_delegate_; 678 679 // Used to tell the delegate when focus moves to hide the Autofill popup. 680 scoped_ptr<ui::EventHandler> event_handler_; 681 682 DISALLOW_COPY_AND_ASSIGN(AutofillDialogViews); 683}; 684 685} // namespace autofill 686 687#endif // CHROME_BROWSER_UI_VIEWS_AUTOFILL_AUTOFILL_DIALOG_VIEWS_H_ 688