• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_PASSWORD_MANAGER_CHROME_PASSWORD_MANAGER_CLIENT_H_
6 #define CHROME_BROWSER_PASSWORD_MANAGER_CHROME_PASSWORD_MANAGER_CLIENT_H_
7 
8 #include "base/basictypes.h"
9 #include "base/compiler_specific.h"
10 #include "components/password_manager/content/browser/content_password_manager_driver.h"
11 #include "components/password_manager/core/browser/password_manager_client.h"
12 #include "content/public/browser/web_contents_observer.h"
13 #include "content/public/browser/web_contents_user_data.h"
14 #include "ui/gfx/rect.h"
15 
16 class Profile;
17 
18 namespace autofill {
19 class PasswordGenerationPopupObserver;
20 class PasswordGenerationPopupControllerImpl;
21 }
22 
23 namespace content {
24 class WebContents;
25 }
26 
27 namespace password_manager {
28 struct CredentialInfo;
29 class PasswordGenerationManager;
30 class PasswordManager;
31 }
32 
33 // ChromePasswordManagerClient implements the PasswordManagerClient interface.
34 class ChromePasswordManagerClient
35     : public password_manager::PasswordManagerClient,
36       public content::WebContentsObserver,
37       public content::WebContentsUserData<ChromePasswordManagerClient> {
38  public:
39   virtual ~ChromePasswordManagerClient();
40 
41   // PasswordManagerClient implementation.
42   virtual bool IsAutomaticPasswordSavingEnabled() const OVERRIDE;
43   virtual bool IsPasswordManagerEnabledForCurrentPage() const OVERRIDE;
44   virtual bool ShouldFilterAutofillResult(
45       const autofill::PasswordForm& form) OVERRIDE;
46   virtual bool IsSyncAccountCredential(
47       const std::string& username, const std::string& origin) const OVERRIDE;
48   virtual void AutofillResultsComputed() OVERRIDE;
49   virtual bool PromptUserToSavePassword(
50       scoped_ptr<password_manager::PasswordFormManager> form_to_save) OVERRIDE;
51   virtual void AutomaticPasswordSave(
52       scoped_ptr<password_manager::PasswordFormManager> saved_form_manager)
53       OVERRIDE;
54   virtual void PasswordWasAutofilled(
55       const autofill::PasswordFormMap& best_matches) const OVERRIDE;
56   virtual void PasswordAutofillWasBlocked(
57       const autofill::PasswordFormMap& best_matches) const OVERRIDE;
58   virtual void AuthenticateAutofillAndFillForm(
59       scoped_ptr<autofill::PasswordFormFillData> fill_data) OVERRIDE;
60   virtual PrefService* GetPrefs() OVERRIDE;
61   virtual password_manager::PasswordStore* GetPasswordStore() OVERRIDE;
62   virtual password_manager::PasswordManagerDriver* GetDriver() OVERRIDE;
63   virtual base::FieldTrial::Probability GetProbabilityForExperiment(
64       const std::string& experiment_name) OVERRIDE;
65   virtual bool IsPasswordSyncEnabled() OVERRIDE;
66   virtual void OnLogRouterAvailabilityChanged(bool router_can_be_used) OVERRIDE;
67   virtual void LogSavePasswordProgress(const std::string& text) OVERRIDE;
68   virtual bool IsLoggingActive() const OVERRIDE;
69   virtual void OnNotifyFailedSignIn(
70       int request_id,
71       const password_manager::CredentialInfo&) OVERRIDE;
72   virtual void OnNotifySignedIn(
73       int request_id,
74       const password_manager::CredentialInfo&) OVERRIDE;
75   virtual void OnNotifySignedOut(int request_id) OVERRIDE;
76   virtual void OnRequestCredential(
77       int request_id,
78       bool zero_click_only,
79       const std::vector<GURL>& federations) OVERRIDE;
80 
81   // Hides any visible generation UI.
82   void HidePasswordGenerationPopup();
83 
84   static void CreateForWebContentsWithAutofillClient(
85       content::WebContents* contents,
86       autofill::AutofillClient* autofill_client);
87 
88   // Convenience method to allow //chrome code easy access to a PasswordManager
89   // from a WebContents instance.
90   static password_manager::PasswordManager* GetManagerFromWebContents(
91       content::WebContents* contents);
92 
93   // Convenience method to allow //chrome code easy access to a
94   // PasswordGenerationManager from a WebContents instance.
95   static password_manager::PasswordGenerationManager*
96       GetGenerationManagerFromWebContents(content::WebContents* contents);
97 
98   // Observer for PasswordGenerationPopup events. Used for testing.
99   void SetTestObserver(autofill::PasswordGenerationPopupObserver* observer);
100 
101   // Returns true if the bubble UI is enabled, and false if we're still using
102   // the sad old Infobar UI.
103   static bool IsTheHotNewBubbleUIEnabled();
104 
105   // Returns true if the password manager should be enabled during sync signin.
106   static bool EnabledForSyncSignin();
107 
108  protected:
109   // Callable for tests.
110   ChromePasswordManagerClient(content::WebContents* web_contents,
111                               autofill::AutofillClient* autofill_client);
112 
113  private:
114   enum AutofillForSyncCredentialsState {
115     ALLOW_SYNC_CREDENTIALS,
116     DISALLOW_SYNC_CREDENTIALS_FOR_REAUTH,
117     DISALLOW_SYNC_CREDENTIALS,
118   };
119 
120   friend class content::WebContentsUserData<ChromePasswordManagerClient>;
121 
122   // content::WebContentsObserver overrides.
123   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
124 
125   // Callback method to be triggered when authentication is successful for a
126   // given password authentication request.  If authentication is disabled or
127   // not supported, this will be triggered directly.
128   void CommitFillPasswordForm(autofill::PasswordFormFillData* fill_data);
129 
130   // Given |bounds| in the renderers coordinate system, return the same bounds
131   // in the screens coordinate system.
132   gfx::RectF GetBoundsInScreenSpace(const gfx::RectF& bounds);
133 
134   // Causes the password generation UI to be shown for the specified form.
135   // The popup will be anchored at |element_bounds|. The generated password
136   // will be no longer than |max_length|.
137   void ShowPasswordGenerationPopup(const gfx::RectF& bounds,
138                                    int max_length,
139                                    const autofill::PasswordForm& form);
140 
141   // Causes the password editing UI to be shown anchored at |element_bounds|.
142   void ShowPasswordEditingPopup(
143       const gfx::RectF& bounds, const autofill::PasswordForm& form);
144 
145   // Sends a message to the renderer with the current value of
146   // |can_use_log_router_|.
147   void NotifyRendererOfLoggingAvailability();
148 
149   // Returns true if the last loaded page was for transactional re-auth on a
150   // Google property.
151   bool LastLoadWasTransactionalReauthPage() const;
152 
153   // Returns true if |url| is the reauth page for accessing the password
154   // website.
155   bool IsURLPasswordWebsiteReauth(const GURL& url) const;
156 
157   // Sets |autofill_state_| based on experiment and flag values.
158   void SetUpAutofillSyncState();
159 
160   Profile* const profile_;
161 
162   password_manager::ContentPasswordManagerDriver driver_;
163 
164   // Observer for password generation popup.
165   autofill::PasswordGenerationPopupObserver* observer_;
166 
167   // Controls the popup
168   base::WeakPtr<
169     autofill::PasswordGenerationPopupControllerImpl> popup_controller_;
170 
171   // True if |this| is registered with some LogRouter which can accept logs.
172   bool can_use_log_router_;
173 
174   // How to handle the sync credential in ShouldFilterAutofillResult().
175   AutofillForSyncCredentialsState autofill_sync_state_;
176 
177   // If the sync credential was filtered during autofill. Used for statistics
178   // reporting.
179   bool sync_credential_was_filtered_;
180 
181   // Allows authentication callbacks to be destroyed when this client is gone.
182   base::WeakPtrFactory<ChromePasswordManagerClient> weak_factory_;
183 
184   DISALLOW_COPY_AND_ASSIGN(ChromePasswordManagerClient);
185 };
186 
187 #endif  // CHROME_BROWSER_PASSWORD_MANAGER_CHROME_PASSWORD_MANAGER_CLIENT_H_
188