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.
5 #ifndef CHROME_BROWSER_UI_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_
6 #define CHROME_BROWSER_UI_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_
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"
21 struct NativeWebKeyboardEvent;
25 namespace password_manager {
26 class PasswordManager;
31 class PasswordGenerator;
32 class PasswordGenerationPopupObserver;
33 class PasswordGenerationPopupView;
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 {
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,
54 password_manager::PasswordManager* password_manager,
55 PasswordGenerationPopupObserver* observer,
56 content::WebContents* web_contents,
57 gfx::NativeView container_view);
58 ~PasswordGenerationPopupControllerImpl() override;
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);
66 // Hides the popup and destroys |this|.
67 void HideAndDestroy();
70 content::WebContents* web_contents() {
71 return controller_common_.web_contents();
75 PasswordGenerationPopupControllerImpl(
76 const gfx::RectF& bounds,
77 const PasswordForm& form,
79 password_manager::PasswordManager* password_manager,
80 PasswordGenerationPopupObserver* observer,
81 content::WebContents* web_contents,
82 gfx::NativeView container_view);
84 // Handle to the popup. May be NULL if popup isn't showing.
85 PasswordGenerationPopupView* view_;
88 // PasswordGenerationPopupController implementation:
90 void ViewDestroyed() override;
91 void SetSelectionAtPoint(const gfx::Point& point) override;
92 bool AcceptSelectedLine() override;
93 void SelectionCleared() override;
94 void PasswordAccepted() override;
95 void OnSavedPasswordsLinkClicked() override;
96 int GetMinimumWidth() override;
97 gfx::NativeView container_view() override;
98 const gfx::Rect& popup_bounds() const override;
99 const gfx::RectF& element_bounds() const override;
100 bool IsRTL() const override;
101 bool display_password() const override;
102 bool password_selected() const override;
103 base::string16 password() const override;
104 base::string16 SuggestedText() override;
105 const base::string16& HelpText() override;
106 base::string16 AccessibleName() override;
107 const gfx::Range& HelpTextLinkRange() override;
109 base::WeakPtr<PasswordGenerationPopupControllerImpl> GetWeakPtr();
111 bool HandleKeyPressEvent(const content::NativeWebKeyboardEvent& event);
113 // Set if the password is currently selected.
114 void PasswordSelected(bool selected);
116 // Accept password if it's selected.
117 bool PossiblyAcceptPassword();
119 // Get desired size of popup. Height depends on width because we do text
121 void CalculateBounds();
124 password_manager::PasswordManager* password_manager_;
127 PasswordGenerationPopupObserver* observer_;
129 // Controls how passwords are generated.
130 scoped_ptr<PasswordGenerator> generator_;
132 // Contains common popup functionality.
133 PopupControllerCommon controller_common_;
135 // Help text and the range in the text that corresponds to the saved passwords
137 base::string16 help_text_;
138 gfx::Range link_range_;
140 base::string16 current_password_;
141 bool password_selected_;
143 // If a password will be shown in this popup.
144 bool display_password_;
146 // Bounds for all the elements of the popup.
147 gfx::Rect popup_bounds_;
149 base::WeakPtrFactory<PasswordGenerationPopupControllerImpl> weak_ptr_factory_;
151 DISALLOW_COPY_AND_ASSIGN(PasswordGenerationPopupControllerImpl);
154 } // namespace autofill
156 #endif // CHROME_BROWSER_UI_AUTOFILL_PASSWORD_GENERATION_POPUP_CONTROLLER_IMPL_H_