OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" | 5 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
6 | 6 |
7 #include "chrome/app/chrome_command_ids.h" | 7 #include "chrome/app/chrome_command_ids.h" |
8 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 8 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
9 #include "chrome/browser/password_manager/password_store_factory.h" | 9 #include "chrome/browser/password_manager/password_store_factory.h" |
10 #include "chrome/browser/ui/browser_command_controller.h" | 10 #include "chrome/browser/ui/browser_command_controller.h" |
11 #include "chrome/browser/ui/browser_dialogs.h" | 11 #include "chrome/browser/ui/browser_dialogs.h" |
12 #include "chrome/browser/ui/browser_finder.h" | 12 #include "chrome/browser/ui/browser_finder.h" |
13 #include "chrome/browser/ui/chrome_pages.h" | 13 #include "chrome/browser/ui/chrome_pages.h" |
14 #include "chrome/browser/ui/location_bar/location_bar.h" | 14 #include "chrome/browser/ui/location_bar/location_bar.h" |
15 #include "chrome/browser/ui/passwords/manage_passwords_icon.h" | 15 #include "chrome/browser/ui/passwords/manage_passwords_icon.h" |
16 #include "chrome/browser/ui/passwords/password_bubble_experiment.h" | 16 #include "chrome/browser/ui/passwords/password_bubble_experiment.h" |
17 #include "chrome/common/url_constants.h" | 17 #include "chrome/common/url_constants.h" |
| 18 #include "components/password_manager/content/common/credential_manager_types.h" |
18 #include "components/password_manager/core/browser/password_form_manager.h" | 19 #include "components/password_manager/core/browser/password_form_manager.h" |
19 #include "content/public/browser/navigation_details.h" | 20 #include "content/public/browser/navigation_details.h" |
20 | 21 |
21 #if defined(OS_ANDROID) | 22 #if defined(OS_ANDROID) |
22 #include "chrome/browser/android/chromium_application.h" | 23 #include "chrome/browser/android/chromium_application.h" |
23 #endif | 24 #endif |
24 | 25 |
25 using autofill::PasswordFormMap; | 26 using autofill::PasswordFormMap; |
26 using password_manager::PasswordFormManager; | 27 using password_manager::PasswordFormManager; |
27 | 28 |
(...skipping 27 matching lines...) Expand all Loading... |
55 } | 56 } |
56 } | 57 } |
57 | 58 |
58 } // namespace | 59 } // namespace |
59 | 60 |
60 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); | 61 DEFINE_WEB_CONTENTS_USER_DATA_KEY(ManagePasswordsUIController); |
61 | 62 |
62 ManagePasswordsUIController::ManagePasswordsUIController( | 63 ManagePasswordsUIController::ManagePasswordsUIController( |
63 content::WebContents* web_contents) | 64 content::WebContents* web_contents) |
64 : content::WebContentsObserver(web_contents), | 65 : content::WebContentsObserver(web_contents), |
65 state_(password_manager::ui::INACTIVE_STATE) { | 66 state_(password_manager::ui::INACTIVE_STATE), |
| 67 bubble_shown_(false) { |
66 password_manager::PasswordStore* password_store = | 68 password_manager::PasswordStore* password_store = |
67 GetPasswordStore(web_contents); | 69 GetPasswordStore(web_contents); |
68 if (password_store) | 70 if (password_store) |
69 password_store->AddObserver(this); | 71 password_store->AddObserver(this); |
70 } | 72 } |
71 | 73 |
72 ManagePasswordsUIController::~ManagePasswordsUIController() {} | 74 ManagePasswordsUIController::~ManagePasswordsUIController() {} |
73 | 75 |
74 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { | 76 void ManagePasswordsUIController::UpdateBubbleAndIconVisibility() { |
| 77 bubble_shown_ = false; |
75 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't | 78 // If we're not on a "webby" URL (e.g. "chrome://sign-in"), we shouldn't |
76 // display either the bubble or the icon. | 79 // display either the bubble or the icon. |
77 if (!BrowsingDataHelper::IsWebScheme( | 80 if (!BrowsingDataHelper::IsWebScheme( |
78 web_contents()->GetLastCommittedURL().scheme())) { | 81 web_contents()->GetLastCommittedURL().scheme())) { |
79 state_ = password_manager::ui::INACTIVE_STATE; | 82 state_ = password_manager::ui::INACTIVE_STATE; |
80 } | 83 } |
81 | 84 |
82 #if !defined(OS_ANDROID) | 85 #if !defined(OS_ANDROID) |
83 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); | 86 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
84 if (!browser) | 87 if (!browser) |
85 return; | 88 return; |
86 LocationBar* location_bar = browser->window()->GetLocationBar(); | 89 LocationBar* location_bar = browser->window()->GetLocationBar(); |
87 DCHECK(location_bar); | 90 DCHECK(location_bar); |
88 location_bar->UpdateManagePasswordsIconAndBubble(); | 91 location_bar->UpdateManagePasswordsIconAndBubble(); |
89 #endif | 92 #endif |
90 } | 93 } |
91 | 94 |
92 void ManagePasswordsUIController::OnPasswordSubmitted( | 95 void ManagePasswordsUIController::OnPasswordSubmitted( |
93 scoped_ptr<PasswordFormManager> form_manager) { | 96 scoped_ptr<PasswordFormManager> form_manager) { |
94 form_manager_ = form_manager.Pass(); | 97 form_manager_ = form_manager.Pass(); |
95 password_form_map_ = ConstifyMap(form_manager_->best_matches()); | 98 password_form_map_ = ConstifyMap(form_manager_->best_matches()); |
96 origin_ = PendingCredentials().origin; | 99 origin_ = PendingPassword().origin; |
97 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; | 100 state_ = password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; |
98 UpdateBubbleAndIconVisibility(); | 101 UpdateBubbleAndIconVisibility(); |
99 } | 102 } |
100 | 103 |
| 104 bool ManagePasswordsUIController::OnChooseCredentials( |
| 105 ScopedVector<autofill::PasswordForm> credentials, |
| 106 base::Callback<void(const password_manager::CredentialInfo&)> callback){ |
| 107 DCHECK(!credentials.empty()); |
| 108 form_manager_.reset(); |
| 109 origin_ = credentials[0]->origin; |
| 110 new_password_forms_.swap(credentials); |
| 111 // The map is useless because usernames may overlap. |
| 112 password_form_map_.clear(); |
| 113 state_ = password_manager::ui::CREDENTIAL_REQUEST_AND_BUBBLE_STATE; |
| 114 UpdateBubbleAndIconVisibility(); |
| 115 if (bubble_shown_) |
| 116 credentials_callback_ = callback; |
| 117 return bubble_shown_; |
| 118 } |
| 119 |
101 void ManagePasswordsUIController::OnAutomaticPasswordSave( | 120 void ManagePasswordsUIController::OnAutomaticPasswordSave( |
102 scoped_ptr<PasswordFormManager> form_manager) { | 121 scoped_ptr<PasswordFormManager> form_manager) { |
103 form_manager_ = form_manager.Pass(); | 122 form_manager_ = form_manager.Pass(); |
104 password_form_map_ = ConstifyMap(form_manager_->best_matches()); | 123 password_form_map_ = ConstifyMap(form_manager_->best_matches()); |
105 password_form_map_[form_manager_->associated_username()] = | 124 password_form_map_[form_manager_->associated_username()] = |
106 &form_manager_->pending_credentials(); | 125 &form_manager_->pending_credentials(); |
107 origin_ = form_manager_->pending_credentials().origin; | 126 origin_ = form_manager_->pending_credentials().origin; |
108 state_ = password_manager::ui::CONFIRMATION_STATE; | 127 state_ = password_manager::ui::CONFIRMATION_STATE; |
109 UpdateBubbleAndIconVisibility(); | 128 UpdateBubbleAndIconVisibility(); |
110 } | 129 } |
(...skipping 30 matching lines...) Expand all Loading... |
141 if (changed_form.blacklisted_by_user) | 160 if (changed_form.blacklisted_by_user) |
142 state_ = password_manager::ui::MANAGE_STATE; | 161 state_ = password_manager::ui::MANAGE_STATE; |
143 } else { | 162 } else { |
144 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); | 163 new_password_forms_.push_back(new autofill::PasswordForm(changed_form)); |
145 password_form_map_[changed_form.username_value] = | 164 password_form_map_[changed_form.username_value] = |
146 new_password_forms_.back(); | 165 new_password_forms_.back(); |
147 if (changed_form.blacklisted_by_user) | 166 if (changed_form.blacklisted_by_user) |
148 state_ = password_manager::ui::BLACKLIST_STATE; | 167 state_ = password_manager::ui::BLACKLIST_STATE; |
149 } | 168 } |
150 } | 169 } |
| 170 // TODO(vasilii): handle CREDENTIAL_REQUEST_STATE. |
151 if (current_state != state_) | 171 if (current_state != state_) |
152 UpdateBubbleAndIconVisibility(); | 172 UpdateBubbleAndIconVisibility(); |
153 } | 173 } |
154 | 174 |
155 void ManagePasswordsUIController:: | 175 void ManagePasswordsUIController:: |
156 NavigateToPasswordManagerSettingsPage() { | 176 NavigateToPasswordManagerSettingsPage() { |
157 #if defined(OS_ANDROID) | 177 #if defined(OS_ANDROID) |
158 chrome::android::ChromiumApplication::ShowPasswordSettings(); | 178 chrome::android::ChromiumApplication::ShowPasswordSettings(); |
159 #else | 179 #else |
160 chrome::ShowSettingsSubPage( | 180 chrome::ShowSettingsSubPage( |
161 chrome::FindBrowserWithWebContents(web_contents()), | 181 chrome::FindBrowserWithWebContents(web_contents()), |
162 chrome::kPasswordManagerSubPage); | 182 chrome::kPasswordManagerSubPage); |
163 #endif | 183 #endif |
164 } | 184 } |
165 | 185 |
166 void ManagePasswordsUIController::SavePassword() { | 186 void ManagePasswordsUIController::SavePassword() { |
167 DCHECK(PasswordPendingUserDecision()); | 187 DCHECK(PasswordPendingUserDecision()); |
168 SavePasswordInternal(); | 188 SavePasswordInternal(); |
169 state_ = password_manager::ui::MANAGE_STATE; | 189 state_ = password_manager::ui::MANAGE_STATE; |
170 UpdateBubbleAndIconVisibility(); | 190 UpdateBubbleAndIconVisibility(); |
171 } | 191 } |
172 | 192 |
| 193 void ManagePasswordsUIController::ChooseCredential( |
| 194 bool was_chosen, |
| 195 const autofill::PasswordForm& form) { |
| 196 DCHECK(password_manager::ui::IsCredentialsState(state_)); |
| 197 DCHECK(!credentials_callback_.is_null()); |
| 198 password_manager::CredentialInfo info = was_chosen ? |
| 199 password_manager::CredentialInfo(form) : |
| 200 password_manager::CredentialInfo(); |
| 201 credentials_callback_.Run(info); |
| 202 state_ = password_manager::ui::INACTIVE_STATE; |
| 203 UpdateBubbleAndIconVisibility(); |
| 204 } |
| 205 |
173 void ManagePasswordsUIController::SavePasswordInternal() { | 206 void ManagePasswordsUIController::SavePasswordInternal() { |
174 DCHECK(form_manager_.get()); | 207 DCHECK(form_manager_.get()); |
175 form_manager_->Save(); | 208 form_manager_->Save(); |
176 } | 209 } |
177 | 210 |
178 void ManagePasswordsUIController::NeverSavePassword() { | 211 void ManagePasswordsUIController::NeverSavePassword() { |
179 DCHECK(PasswordPendingUserDecision()); | 212 DCHECK(PasswordPendingUserDecision()); |
180 NeverSavePasswordInternal(); | 213 NeverSavePasswordInternal(); |
181 state_ = password_manager::ui::BLACKLIST_STATE; | 214 state_ = password_manager::ui::BLACKLIST_STATE; |
182 UpdateBubbleAndIconVisibility(); | 215 UpdateBubbleAndIconVisibility(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 timer_.reset(new base::ElapsedTimer()); | 257 timer_.reset(new base::ElapsedTimer()); |
225 } | 258 } |
226 | 259 |
227 void ManagePasswordsUIController::WasHidden() { | 260 void ManagePasswordsUIController::WasHidden() { |
228 #if !defined(OS_ANDROID) | 261 #if !defined(OS_ANDROID) |
229 chrome::CloseManagePasswordsBubble(web_contents()); | 262 chrome::CloseManagePasswordsBubble(web_contents()); |
230 #endif | 263 #endif |
231 } | 264 } |
232 | 265 |
233 const autofill::PasswordForm& ManagePasswordsUIController:: | 266 const autofill::PasswordForm& ManagePasswordsUIController:: |
234 PendingCredentials() const { | 267 PendingPassword() const { |
235 DCHECK(form_manager_); | 268 DCHECK(form_manager_); |
236 return form_manager_->pending_credentials(); | 269 return form_manager_->pending_credentials(); |
237 } | 270 } |
238 | 271 |
239 void ManagePasswordsUIController::UpdateIconAndBubbleState( | 272 void ManagePasswordsUIController::UpdateIconAndBubbleState( |
240 ManagePasswordsIcon* icon) { | 273 ManagePasswordsIcon* icon) { |
241 if (password_manager::ui::IsAutomaticDisplayState(state_)) { | 274 if (password_manager::ui::IsAutomaticDisplayState(state_)) { |
242 // We must display the icon before showing the bubble, as the bubble would | 275 // We must display the icon before showing the bubble, as the bubble would |
243 // be otherwise unanchored. However, we can't change the controller's state | 276 // be otherwise unanchored. However, we can't change the controller's state |
244 // until _after_ the bubble is shown, as our metrics depend on the seeing | 277 // until _after_ the bubble is shown, as our metrics depend on the seeing |
245 // the original state to determine if the bubble opened automagically or via | 278 // the original state to determine if the bubble opened automagically or via |
246 // user action. | 279 // user action. |
247 password_manager::ui::State end_state = | 280 password_manager::ui::State end_state = |
248 GetEndStateForAutomaticState(state_); | 281 GetEndStateForAutomaticState(state_); |
249 icon->SetState(end_state); | 282 icon->SetState(end_state); |
250 ShowBubbleWithoutUserInteraction(); | 283 ShowBubbleWithoutUserInteraction(); |
251 state_ = end_state; | 284 state_ = end_state; |
252 } else { | 285 } else { |
253 icon->SetState(state_); | 286 icon->SetState(state_); |
254 } | 287 } |
255 } | 288 } |
256 | 289 |
| 290 void ManagePasswordsUIController::OnBubbleShown() { |
| 291 bubble_shown_ = true; |
| 292 } |
| 293 |
257 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { | 294 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
258 DCHECK(password_manager::ui::IsAutomaticDisplayState(state_)); | 295 DCHECK(password_manager::ui::IsAutomaticDisplayState(state_)); |
259 #if !defined(OS_ANDROID) | 296 #if !defined(OS_ANDROID) |
260 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); | 297 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
261 if (!browser || browser->toolbar_model()->input_in_progress()) | 298 if (!browser || browser->toolbar_model()->input_in_progress()) |
262 return; | 299 return; |
263 if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE && | 300 if (state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE && |
264 !password_bubble_experiment::ShouldShowBubble( | 301 !password_bubble_experiment::ShouldShowBubble( |
265 browser->profile()->GetPrefs())) | 302 browser->profile()->GetPrefs())) |
266 return; | 303 return; |
267 CommandUpdater* updater = browser->command_controller()->command_updater(); | 304 CommandUpdater* updater = browser->command_controller()->command_updater(); |
268 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); | 305 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); |
269 #endif | 306 #endif |
270 } | 307 } |
271 | 308 |
272 bool ManagePasswordsUIController::PasswordPendingUserDecision() const { | 309 bool ManagePasswordsUIController::PasswordPendingUserDecision() const { |
273 return state_ == password_manager::ui::PENDING_PASSWORD_STATE || | 310 return password_manager::ui::IsPendingState(state_); |
274 state_ == password_manager::ui::PENDING_PASSWORD_AND_BUBBLE_STATE; | |
275 } | 311 } |
276 | 312 |
277 void ManagePasswordsUIController::WebContentsDestroyed() { | 313 void ManagePasswordsUIController::WebContentsDestroyed() { |
278 password_manager::PasswordStore* password_store = | 314 password_manager::PasswordStore* password_store = |
279 GetPasswordStore(web_contents()); | 315 GetPasswordStore(web_contents()); |
280 if (password_store) | 316 if (password_store) |
281 password_store->RemoveObserver(this); | 317 password_store->RemoveObserver(this); |
282 } | 318 } |
OLD | NEW |