1 // Copyright 2014 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_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_ 6 #define CHROME_BROWSER_UI_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_ 7 8 #include <string> 9 10 #include "base/basictypes.h" 11 #include "base/memory/weak_ptr.h" 12 #include "chrome/browser/ui/autofill/password_generation_popup_controller.h" 13 #include "chrome/browser/ui/autofill/popup_controller_common.h" 14 #include "components/autofill/core/common/password_form.h" 15 #include "ui/gfx/native_widget_types.h" 16 #include "ui/gfx/range/range.h" 17 #include "ui/gfx/rect.h" 18 #include "ui/gfx/rect_f.h" 19 20 namespace content { 21 struct NativeWebKeyboardEvent; 22 class WebContents; 23 } 24 25 namespace password_manager { 26 class PasswordManager; 27 } 28 29 namespace autofill { 30 31 class PasswordGenerator; 32 class PasswordGenerationPopupObserver; 33 class PasswordGenerationPopupView; 34 35 // This class controls a PasswordGenerationPopupView. It is responsible for 36 // determining the location of the popup, handling keypress events while the 37 // popup is active, and notifying both the renderer and the password manager 38 // if the password is accepted. 39 class PasswordGenerationPopupControllerImpl 40 : public PasswordGenerationPopupController { 41 public: 42 // Create a controller or return |previous| if it is suitable. Will hide 43 // |previous| if it is not returned. |bounds| is the bounds of the element 44 // that we are showing the dropdown for in screen space. |form| is the 45 // identifier for the form that we are filling, and is used to notify 46 // |password_manager| if the password is generated. |max_length| is used to 47 // determine the length of the password shown. If not NULL, |observer| will 48 // be notified of changes of the popup state. 49 static base::WeakPtr<PasswordGenerationPopupControllerImpl> GetOrCreate( 50 base::WeakPtr<PasswordGenerationPopupControllerImpl> previous, 51 const gfx::RectF& bounds, 52 const PasswordForm& form, 53 int max_length, 54 password_manager::PasswordManager* password_manager, 55 PasswordGenerationPopupObserver* observer, 56 content::WebContents* web_contents, 57 gfx::NativeView container_view); 58 virtual ~PasswordGenerationPopupControllerImpl(); 59 60 // Create a PasswordGenerationPopupView if one doesn't already exist. 61 // If |display_password| is true, a generated password is shown that can be 62 // selected by the user. Otherwise just the text explaining generated 63 // passwords is shown. Idempotent. 64 void Show(bool display_password); 65 66 // Hides the popup and destroys |this|. 67 void HideAndDestroy(); 68 69 // Accessors. 70 content::WebContents* web_contents() { 71 return controller_common_.web_contents(); 72 } 73 const gfx::RectF& element_bounds() { 74 return controller_common_.element_bounds(); 75 } 76 77 protected: 78 PasswordGenerationPopupControllerImpl( 79 const gfx::RectF& bounds, 80 const PasswordForm& form, 81 int max_length, 82 password_manager::PasswordManager* password_manager, 83 PasswordGenerationPopupObserver* observer, 84 content::WebContents* web_contents, 85 gfx::NativeView container_view); 86 87 // Handle to the popup. May be NULL if popup isn't showing. 88 PasswordGenerationPopupView* view_; 89 90 private: 91 // PasswordGenerationPopupController implementation: 92 virtual void Hide() OVERRIDE; 93 virtual void ViewDestroyed() OVERRIDE; 94 virtual void SetSelectionAtPoint(const gfx::Point& point) OVERRIDE; 95 virtual bool AcceptSelectedLine() OVERRIDE; 96 virtual void SelectionCleared() OVERRIDE; 97 virtual void OnSavedPasswordsLinkClicked() OVERRIDE; 98 virtual int GetMinimumWidth() OVERRIDE; 99 virtual gfx::NativeView container_view() OVERRIDE; 100 virtual const gfx::Rect& popup_bounds() const OVERRIDE; 101 virtual bool display_password() const OVERRIDE; 102 virtual bool password_selected() const OVERRIDE; 103 virtual base::string16 password() const OVERRIDE; 104 virtual base::string16 SuggestedText() OVERRIDE; 105 virtual const base::string16& HelpText() OVERRIDE; 106 virtual const gfx::Range& HelpTextLinkRange() OVERRIDE; 107 108 base::WeakPtr<PasswordGenerationPopupControllerImpl> GetWeakPtr(); 109 110 bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event); 111 112 // Set if the password is currently selected. 113 void PasswordSelected(bool selected); 114 115 // Accept the password. Causes the controller to hide itself as the popup 116 // is no longer necessary. 117 void PasswordAccepted(); 118 119 // Accept password if it's selected. 120 bool PossiblyAcceptPassword(); 121 122 // Get desired size of popup. Height depends on width because we do text 123 // wrapping. 124 void CalculateBounds(); 125 126 PasswordForm form_; 127 password_manager::PasswordManager* password_manager_; 128 129 // May be NULL. 130 PasswordGenerationPopupObserver* observer_; 131 132 // Controls how passwords are generated. 133 scoped_ptr<PasswordGenerator> generator_; 134 135 // Contains common popup functionality. 136 PopupControllerCommon controller_common_; 137 138 // Help text and the range in the text that corresponds to the saved passwords 139 // link. 140 base::string16 help_text_; 141 gfx::Range link_range_; 142 143 base::string16 current_password_; 144 bool password_selected_; 145 146 // If a password will be shown in this popup. 147 bool display_password_; 148 149 // Bounds for all the elements of the popup. 150 gfx::Rect popup_bounds_; 151 152 base::WeakPtrFactory<PasswordGenerationPopupControllerImpl> weak_ptr_factory_; 153 154 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationPopupControllerImpl); 155 }; 156 157 } // namespace autofill 158 159 #endif // CHROME_BROWSER_UI_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_ 160