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
20namespace content {
21struct NativeWebKeyboardEvent;
22class WebContents;
23}
24
25namespace password_manager {
26class PasswordManager;
27}
28
29namespace autofill {
30
31class PasswordGenerator;
32class PasswordGenerationPopupObserver;
33class 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.
39class 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