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 "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "chrome/app/chrome_command_ids.h" | 8 #include "chrome/app/chrome_command_ids.h" |
9 #include "chrome/browser/browsing_data/browsing_data_helper.h" | 9 #include "chrome/browser/browsing_data/browsing_data_helper.h" |
10 #include "chrome/browser/password_manager/chrome_password_manager_client.h" | 10 #include "chrome/browser/password_manager/chrome_password_manager_client.h" |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
177 password_manager::ui::AUTO_SIGNIN_STATE && | 177 password_manager::ui::AUTO_SIGNIN_STATE && |
178 passwords_data_.state() != | 178 passwords_data_.state() != |
179 password_manager::ui::CREDENTIAL_REQUEST_STATE) { | 179 password_manager::ui::CREDENTIAL_REQUEST_STATE) { |
180 passwords_data_.OnPasswordAutofilled(password_form_map, origin); | 180 passwords_data_.OnPasswordAutofilled(password_form_map, origin); |
181 UpdateBubbleAndIconVisibility(); | 181 UpdateBubbleAndIconVisibility(); |
182 } | 182 } |
183 } | 183 } |
184 | 184 |
185 void ManagePasswordsUIController::OnLoginsChanged( | 185 void ManagePasswordsUIController::OnLoginsChanged( |
186 const password_manager::PasswordStoreChangeList& changes) { | 186 const password_manager::PasswordStoreChangeList& changes) { |
187 password_manager::ui::State current_state = state(); | 187 password_manager::ui::State current_state = GetState(); |
188 passwords_data_.ProcessLoginsChanged(changes); | 188 passwords_data_.ProcessLoginsChanged(changes); |
189 if (current_state != state()) | 189 if (current_state != GetState()) |
190 UpdateBubbleAndIconVisibility(); | 190 UpdateBubbleAndIconVisibility(); |
191 } | 191 } |
192 | 192 |
193 void ManagePasswordsUIController::NavigateToPasswordManagerSettingsPage() { | 193 const GURL& ManagePasswordsUIController::GetOrigin() const { |
194 #if defined(OS_ANDROID) | 194 return passwords_data_.origin(); |
195 chrome::android::ChromeApplication::ShowPasswordSettings(); | 195 } |
196 #else | 196 |
197 chrome::ShowSettingsSubPage( | 197 password_manager::ui::State ManagePasswordsUIController::GetState() const { |
198 chrome::FindBrowserWithWebContents(web_contents()), | 198 return passwords_data_.state(); |
199 chrome::kPasswordManagerSubPage); | 199 } |
200 #endif | 200 |
| 201 const autofill::PasswordForm& ManagePasswordsUIController:: |
| 202 GetPendingPassword() const { |
| 203 if (GetState() == password_manager::ui::AUTO_SIGNIN_STATE) |
| 204 return *GetCurrentForms()[0]; |
| 205 |
| 206 DCHECK(GetState() == password_manager::ui::PENDING_PASSWORD_STATE || |
| 207 GetState() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || |
| 208 GetState() == password_manager::ui::CONFIRMATION_STATE) |
| 209 << GetState(); |
| 210 password_manager::PasswordFormManager* form_manager = |
| 211 passwords_data_.form_manager(); |
| 212 return form_manager->pending_credentials(); |
| 213 } |
| 214 |
| 215 bool ManagePasswordsUIController::IsPasswordOverridden() const { |
| 216 const password_manager::PasswordFormManager* form_manager = |
| 217 passwords_data_.form_manager(); |
| 218 return form_manager ? form_manager->password_overridden() : false; |
| 219 } |
| 220 |
| 221 const std::vector<const autofill::PasswordForm*>& |
| 222 ManagePasswordsUIController::GetCurrentForms() const { |
| 223 return passwords_data_.GetCurrentForms(); |
| 224 } |
| 225 |
| 226 const std::vector<const autofill::PasswordForm*>& |
| 227 ManagePasswordsUIController::GetFederatedForms() const { |
| 228 return passwords_data_.federated_credentials_forms(); |
| 229 } |
| 230 |
| 231 password_manager::InteractionsStats* |
| 232 ManagePasswordsUIController::GetCurrentInteractionStats() const { |
| 233 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, GetState()); |
| 234 password_manager::PasswordFormManager* form_manager = |
| 235 passwords_data_.form_manager(); |
| 236 return password_manager::FindStatsByUsername( |
| 237 form_manager->interactions_stats(), |
| 238 form_manager->pending_credentials().username_value); |
| 239 } |
| 240 |
| 241 void ManagePasswordsUIController::OnBubbleShown() { |
| 242 should_pop_up_bubble_ = false; |
| 243 } |
| 244 |
| 245 void ManagePasswordsUIController::OnBubbleHidden() { |
| 246 if (GetState() == password_manager::ui::CREDENTIAL_REQUEST_STATE || |
| 247 GetState() == password_manager::ui::CONFIRMATION_STATE || |
| 248 GetState() == password_manager::ui::AUTO_SIGNIN_STATE) { |
| 249 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); |
| 250 UpdateBubbleAndIconVisibility(); |
| 251 } |
| 252 } |
| 253 |
| 254 void ManagePasswordsUIController::OnNoInteractionOnUpdate() { |
| 255 if (GetState() != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { |
| 256 // Do nothing if the state was changed. It can happen for example when the |
| 257 // update bubble is active and a page navigation happens. |
| 258 return; |
| 259 } |
| 260 password_manager::PasswordFormManager* form_manager = |
| 261 passwords_data_.form_manager(); |
| 262 DCHECK(form_manager); |
| 263 form_manager->OnNoInteractionOnUpdate(); |
| 264 } |
| 265 |
| 266 void ManagePasswordsUIController::OnNopeUpdateClicked() { |
| 267 password_manager::PasswordFormManager* form_manager = |
| 268 passwords_data_.form_manager(); |
| 269 DCHECK(form_manager); |
| 270 form_manager->OnNopeUpdateClicked(); |
| 271 } |
| 272 |
| 273 void ManagePasswordsUIController::NeverSavePassword() { |
| 274 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, GetState()); |
| 275 NeverSavePasswordInternal(); |
| 276 // The state stays the same. |
| 277 } |
| 278 |
| 279 void ManagePasswordsUIController::SavePassword() { |
| 280 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, GetState()); |
| 281 SavePasswordInternal(); |
| 282 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); |
| 283 UpdateBubbleAndIconVisibility(); |
| 284 } |
| 285 |
| 286 void ManagePasswordsUIController::UpdatePassword( |
| 287 const autofill::PasswordForm& password_form) { |
| 288 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, GetState()); |
| 289 UpdatePasswordInternal(password_form); |
| 290 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); |
| 291 UpdateBubbleAndIconVisibility(); |
| 292 } |
| 293 |
| 294 void ManagePasswordsUIController::ChooseCredential( |
| 295 const autofill::PasswordForm& form, |
| 296 password_manager::CredentialType credential_type) { |
| 297 passwords_data_.ChooseCredential(form, credential_type); |
201 } | 298 } |
202 | 299 |
203 void ManagePasswordsUIController::NavigateToExternalPasswordManager() { | 300 void ManagePasswordsUIController::NavigateToExternalPasswordManager() { |
204 #if defined(OS_ANDROID) | 301 #if defined(OS_ANDROID) |
205 NOTREACHED(); | 302 NOTREACHED(); |
206 #else | 303 #else |
207 chrome::NavigateParams params( | 304 chrome::NavigateParams params( |
208 chrome::FindBrowserWithWebContents(web_contents()), | 305 chrome::FindBrowserWithWebContents(web_contents()), |
209 GURL(chrome::kPasswordManagerAccountDashboardURL), | 306 GURL(chrome::kPasswordManagerAccountDashboardURL), |
210 ui::PAGE_TRANSITION_LINK); | 307 ui::PAGE_TRANSITION_LINK); |
(...skipping 20 matching lines...) Expand all Loading... |
231 NOTREACHED(); | 328 NOTREACHED(); |
232 #else | 329 #else |
233 chrome::NavigateParams params( | 330 chrome::NavigateParams params( |
234 chrome::FindBrowserWithWebContents(web_contents()), | 331 chrome::FindBrowserWithWebContents(web_contents()), |
235 GURL(chrome::kSmartLockHelpPage), ui::PAGE_TRANSITION_LINK); | 332 GURL(chrome::kSmartLockHelpPage), ui::PAGE_TRANSITION_LINK); |
236 params.disposition = NEW_FOREGROUND_TAB; | 333 params.disposition = NEW_FOREGROUND_TAB; |
237 chrome::Navigate(¶ms); | 334 chrome::Navigate(¶ms); |
238 #endif | 335 #endif |
239 } | 336 } |
240 | 337 |
241 void ManagePasswordsUIController::SavePassword() { | 338 void ManagePasswordsUIController::NavigateToPasswordManagerSettingsPage() { |
242 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state()); | 339 #if defined(OS_ANDROID) |
243 SavePasswordInternal(); | 340 chrome::android::ChromeApplication::ShowPasswordSettings(); |
244 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); | 341 #else |
245 UpdateBubbleAndIconVisibility(); | 342 chrome::ShowSettingsSubPage( |
246 } | 343 chrome::FindBrowserWithWebContents(web_contents()), |
247 | 344 chrome::kPasswordManagerSubPage); |
248 void ManagePasswordsUIController::UpdatePassword( | 345 #endif |
249 const autofill::PasswordForm& password_form) { | |
250 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_UPDATE_STATE, state()); | |
251 UpdatePasswordInternal(password_form); | |
252 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); | |
253 UpdateBubbleAndIconVisibility(); | |
254 } | |
255 | |
256 void ManagePasswordsUIController::ChooseCredential( | |
257 const autofill::PasswordForm& form, | |
258 password_manager::CredentialType credential_type) { | |
259 passwords_data_.ChooseCredential(form, credential_type); | |
260 } | 346 } |
261 | 347 |
262 void ManagePasswordsUIController::SavePasswordInternal() { | 348 void ManagePasswordsUIController::SavePasswordInternal() { |
263 password_manager::PasswordStore* password_store = | 349 password_manager::PasswordStore* password_store = |
264 GetPasswordStore(web_contents()); | 350 GetPasswordStore(web_contents()); |
265 password_manager::PasswordFormManager* form_manager = | 351 password_manager::PasswordFormManager* form_manager = |
266 passwords_data_.form_manager(); | 352 passwords_data_.form_manager(); |
267 for (const autofill::PasswordForm* form : | 353 for (const autofill::PasswordForm* form : |
268 form_manager->blacklisted_matches()) { | 354 form_manager->blacklisted_matches()) { |
269 password_store->RemoveLogin(*form); | 355 password_store->RemoveLogin(*form); |
270 } | 356 } |
271 | 357 |
272 form_manager->Save(); | 358 form_manager->Save(); |
273 } | 359 } |
274 | 360 |
275 void ManagePasswordsUIController::UpdatePasswordInternal( | 361 void ManagePasswordsUIController::UpdatePasswordInternal( |
276 const autofill::PasswordForm& password_form) { | 362 const autofill::PasswordForm& password_form) { |
277 password_manager::PasswordFormManager* form_manager = | 363 password_manager::PasswordFormManager* form_manager = |
278 passwords_data_.form_manager(); | 364 passwords_data_.form_manager(); |
279 form_manager->Update(password_form); | 365 form_manager->Update(password_form); |
280 } | 366 } |
281 | 367 |
282 void ManagePasswordsUIController::NeverSavePassword() { | |
283 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state()); | |
284 NeverSavePasswordInternal(); | |
285 // The state stays the same. | |
286 } | |
287 | |
288 void ManagePasswordsUIController::NeverSavePasswordInternal() { | 368 void ManagePasswordsUIController::NeverSavePasswordInternal() { |
289 password_manager::PasswordFormManager* form_manager = | 369 password_manager::PasswordFormManager* form_manager = |
290 passwords_data_.form_manager(); | 370 passwords_data_.form_manager(); |
291 DCHECK(form_manager); | 371 DCHECK(form_manager); |
292 form_manager->PermanentlyBlacklist(); | 372 form_manager->PermanentlyBlacklist(); |
293 } | 373 } |
294 | 374 |
295 void ManagePasswordsUIController::DidNavigateMainFrame( | 375 void ManagePasswordsUIController::DidNavigateMainFrame( |
296 const content::LoadCommittedDetails& details, | 376 const content::LoadCommittedDetails& details, |
297 const content::FrameNavigateParams& params) { | 377 const content::FrameNavigateParams& params) { |
(...skipping 13 matching lines...) Expand all Loading... |
311 // process of navigating to the landing page is longer than 1 second. | 391 // process of navigating to the landing page is longer than 1 second. |
312 timer_.reset(new base::ElapsedTimer()); | 392 timer_.reset(new base::ElapsedTimer()); |
313 } | 393 } |
314 | 394 |
315 void ManagePasswordsUIController::WasHidden() { | 395 void ManagePasswordsUIController::WasHidden() { |
316 #if !defined(OS_ANDROID) | 396 #if !defined(OS_ANDROID) |
317 TabDialogs::FromWebContents(web_contents())->HideManagePasswordsBubble(); | 397 TabDialogs::FromWebContents(web_contents())->HideManagePasswordsBubble(); |
318 #endif | 398 #endif |
319 } | 399 } |
320 | 400 |
321 const autofill::PasswordForm& ManagePasswordsUIController:: | |
322 PendingPassword() const { | |
323 if (state() == password_manager::ui::AUTO_SIGNIN_STATE) | |
324 return *GetCurrentForms()[0]; | |
325 | |
326 DCHECK(state() == password_manager::ui::PENDING_PASSWORD_STATE || | |
327 state() == password_manager::ui::PENDING_PASSWORD_UPDATE_STATE || | |
328 state() == password_manager::ui::CONFIRMATION_STATE) | |
329 << state(); | |
330 password_manager::PasswordFormManager* form_manager = | |
331 passwords_data_.form_manager(); | |
332 return form_manager->pending_credentials(); | |
333 } | |
334 | |
335 bool ManagePasswordsUIController::PasswordOverridden() const { | |
336 const password_manager::PasswordFormManager* form_manager = | |
337 passwords_data_.form_manager(); | |
338 return form_manager ? form_manager->password_overridden() : false; | |
339 } | |
340 | |
341 password_manager::InteractionsStats* | |
342 ManagePasswordsUIController::GetCurrentInteractionStats() const { | |
343 DCHECK_EQ(password_manager::ui::PENDING_PASSWORD_STATE, state()); | |
344 password_manager::PasswordFormManager* form_manager = | |
345 passwords_data_.form_manager(); | |
346 return password_manager::FindStatsByUsername( | |
347 form_manager->interactions_stats(), | |
348 form_manager->pending_credentials().username_value); | |
349 } | |
350 | |
351 #if !defined(OS_ANDROID) | 401 #if !defined(OS_ANDROID) |
352 void ManagePasswordsUIController::UpdateIconAndBubbleState( | 402 void ManagePasswordsUIController::UpdateIconAndBubbleState( |
353 ManagePasswordsIconView* icon) { | 403 ManagePasswordsIconView* icon) { |
354 if (should_pop_up_bubble_) { | 404 if (should_pop_up_bubble_) { |
355 // We must display the icon before showing the bubble, as the bubble would | 405 // We must display the icon before showing the bubble, as the bubble would |
356 // be otherwise unanchored. | 406 // be otherwise unanchored. |
357 icon->SetState(state()); | 407 icon->SetState(GetState()); |
358 ShowBubbleWithoutUserInteraction(); | 408 ShowBubbleWithoutUserInteraction(); |
359 } else { | 409 } else { |
360 icon->SetState(state()); | 410 icon->SetState(GetState()); |
361 } | 411 } |
362 } | 412 } |
363 #endif | 413 #endif |
364 | 414 |
365 void ManagePasswordsUIController::OnBubbleShown() { | |
366 should_pop_up_bubble_ = false; | |
367 } | |
368 | |
369 void ManagePasswordsUIController::OnNopeUpdateClicked() { | |
370 password_manager::PasswordFormManager* form_manager = | |
371 passwords_data_.form_manager(); | |
372 DCHECK(form_manager); | |
373 form_manager->OnNopeUpdateClicked(); | |
374 } | |
375 | |
376 void ManagePasswordsUIController::OnNoInteractionOnUpdate() { | |
377 if (state() != password_manager::ui::PENDING_PASSWORD_UPDATE_STATE) { | |
378 // Do nothing if the state was changed. It can happen for example when the | |
379 // update bubble is active and a page navigation happens. | |
380 return; | |
381 } | |
382 password_manager::PasswordFormManager* form_manager = | |
383 passwords_data_.form_manager(); | |
384 DCHECK(form_manager); | |
385 form_manager->OnNoInteractionOnUpdate(); | |
386 } | |
387 | |
388 void ManagePasswordsUIController::OnBubbleHidden() { | |
389 // Avoid using |state()| which is overridden for some unit tests. | |
390 if (state() == password_manager::ui::CREDENTIAL_REQUEST_STATE || | |
391 state() == password_manager::ui::CONFIRMATION_STATE || | |
392 state() == password_manager::ui::AUTO_SIGNIN_STATE) { | |
393 passwords_data_.TransitionToState(password_manager::ui::MANAGE_STATE); | |
394 UpdateBubbleAndIconVisibility(); | |
395 } | |
396 } | |
397 | |
398 password_manager::ui::State ManagePasswordsUIController::state() const { | |
399 return passwords_data_.state(); | |
400 } | |
401 | |
402 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { | 415 void ManagePasswordsUIController::ShowBubbleWithoutUserInteraction() { |
403 DCHECK(should_pop_up_bubble_); | 416 DCHECK(should_pop_up_bubble_); |
404 #if !defined(OS_ANDROID) | 417 #if !defined(OS_ANDROID) |
405 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); | 418 Browser* browser = chrome::FindBrowserWithWebContents(web_contents()); |
406 if (!browser || browser->toolbar_model()->input_in_progress()) | 419 if (!browser || browser->toolbar_model()->input_in_progress()) |
407 return; | 420 return; |
408 | 421 |
409 CommandUpdater* updater = browser->command_controller()->command_updater(); | 422 CommandUpdater* updater = browser->command_controller()->command_updater(); |
410 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); | 423 updater->ExecuteCommand(IDC_MANAGE_PASSWORDS_FOR_PAGE); |
411 #endif | 424 #endif |
412 } | 425 } |
413 | 426 |
414 void ManagePasswordsUIController::WebContentsDestroyed() { | 427 void ManagePasswordsUIController::WebContentsDestroyed() { |
415 password_manager::PasswordStore* password_store = | 428 password_manager::PasswordStore* password_store = |
416 GetPasswordStore(web_contents()); | 429 GetPasswordStore(web_contents()); |
417 if (password_store) | 430 if (password_store) |
418 password_store->RemoveObserver(this); | 431 password_store->RemoveObserver(this); |
419 } | 432 } |
OLD | NEW |