| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "base/strings/utf_string_conversions.h" | 5 #include "base/strings/utf_string_conversions.h" |
| 6 #include "chrome/browser/password_manager/chrome_password_manager_client.h" | 6 #include "chrome/browser/password_manager/chrome_password_manager_client.h" |
| 7 #include "chrome/browser/profiles/profile.h" | 7 #include "chrome/browser/profiles/profile.h" |
| 8 #include "chrome/browser/ui/browser.h" | 8 #include "chrome/browser/ui/browser.h" |
| 9 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" | 9 #include "chrome/browser/ui/passwords/manage_passwords_ui_controller.h" |
| 10 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 10 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 11 #include "chrome/browser/ui/views/frame/browser_view.h" |
| 11 #include "chrome/browser/ui/views/passwords/account_chooser_dialog_view.h" | 12 #include "chrome/browser/ui/views/passwords/account_chooser_dialog_view.h" |
| 12 #include "chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.h" | 13 #include "chrome/browser/ui/views/passwords/auto_signin_first_run_dialog_view.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" | 14 #include "chrome/test/base/in_process_browser_test.h" |
| 14 #include "chrome/test/base/ui_test_utils.h" | 15 #include "chrome/test/base/ui_test_utils.h" |
| 15 #include "components/password_manager/core/browser/password_bubble_experiment.h" | 16 #include "components/password_manager/core/browser/password_bubble_experiment.h" |
| 16 #include "components/password_manager/core/common/password_manager_pref_names.h" | 17 #include "components/password_manager/core/common/password_manager_pref_names.h" |
| 17 #include "components/prefs/pref_service.h" | 18 #include "components/prefs/pref_service.h" |
| 18 #include "net/url_request/test_url_fetcher_factory.h" | 19 #include "net/url_request/test_url_fetcher_factory.h" |
| 19 #include "testing/gmock/include/gmock/gmock.h" | 20 #include "testing/gmock/include/gmock/gmock.h" |
| 20 #include "ui/views/widget/widget.h" | 21 #include "ui/views/widget/widget.h" |
| (...skipping 16 matching lines...) Expand all Loading... |
| 37 url, d, response_data, response_code, status)); | 38 url, d, response_data, response_code, status)); |
| 38 } | 39 } |
| 39 | 40 |
| 40 MOCK_METHOD1(OnRequestDone, void(const GURL&)); | 41 MOCK_METHOD1(OnRequestDone, void(const GURL&)); |
| 41 }; | 42 }; |
| 42 | 43 |
| 43 // ManagePasswordsUIController subclass to capture the dialog instance | 44 // ManagePasswordsUIController subclass to capture the dialog instance |
| 44 class TestManagePasswordsUIController : public ManagePasswordsUIController { | 45 class TestManagePasswordsUIController : public ManagePasswordsUIController { |
| 45 public: | 46 public: |
| 46 explicit TestManagePasswordsUIController(content::WebContents* web_contents); | 47 explicit TestManagePasswordsUIController(content::WebContents* web_contents); |
| 48 ~TestManagePasswordsUIController() override; |
| 47 | 49 |
| 48 void OnDialogHidden() override; | 50 void OnDialogHidden() override; |
| 49 AccountChooserPrompt* CreateAccountChooser( | 51 AccountChooserPrompt* CreateAccountChooser( |
| 50 PasswordDialogController* controller) override; | 52 PasswordDialogController* controller) override; |
| 51 AutoSigninFirstRunPrompt* CreateAutoSigninPrompt( | 53 AutoSigninFirstRunPrompt* CreateAutoSigninPrompt( |
| 52 PasswordDialogController* controller) override; | 54 PasswordDialogController* controller) override; |
| 53 | 55 |
| 54 AccountChooserDialogView* current_account_chooser() const { | 56 AccountChooserDialogView* current_account_chooser() const { |
| 55 return static_cast<AccountChooserDialogView*>(current_account_chooser_); | 57 return static_cast<AccountChooserDialogView*>(current_account_chooser_); |
| 56 } | 58 } |
| 57 | 59 |
| 58 AutoSigninFirstRunDialogView* current_autosignin_prompt() const { | 60 AutoSigninFirstRunDialogView* current_autosignin_prompt() const { |
| 59 return static_cast<AutoSigninFirstRunDialogView*>( | 61 return static_cast<AutoSigninFirstRunDialogView*>( |
| 60 current_autosignin_prompt_); | 62 current_autosignin_prompt_); |
| 61 } | 63 } |
| 62 | 64 |
| 63 MOCK_METHOD0(OnDialogClosed, void()); | 65 MOCK_METHOD0(OnDialogClosed, void()); |
| 64 | 66 |
| 65 private: | 67 private: |
| 66 AccountChooserPrompt* current_account_chooser_; | 68 AccountChooserPrompt* current_account_chooser_; |
| 67 AutoSigninFirstRunPrompt* current_autosignin_prompt_; | 69 AutoSigninFirstRunPrompt* current_autosignin_prompt_; |
| 70 bool dialog_closed_; |
| 68 | 71 |
| 69 DISALLOW_COPY_AND_ASSIGN(TestManagePasswordsUIController); | 72 DISALLOW_COPY_AND_ASSIGN(TestManagePasswordsUIController); |
| 70 }; | 73 }; |
| 71 | 74 |
| 72 TestManagePasswordsUIController::TestManagePasswordsUIController( | 75 TestManagePasswordsUIController::TestManagePasswordsUIController( |
| 73 content::WebContents* web_contents) | 76 content::WebContents* web_contents) |
| 74 : ManagePasswordsUIController(web_contents), | 77 : ManagePasswordsUIController(web_contents), |
| 75 current_account_chooser_(nullptr), | 78 current_account_chooser_(nullptr), |
| 76 current_autosignin_prompt_(nullptr) { | 79 current_autosignin_prompt_(nullptr), |
| 80 dialog_closed_(false) { |
| 77 // Attach TestManagePasswordsUIController to |web_contents| so the default | 81 // Attach TestManagePasswordsUIController to |web_contents| so the default |
| 78 // ManagePasswordsUIController isn't created. | 82 // ManagePasswordsUIController isn't created. |
| 79 // Do not silently replace an existing ManagePasswordsUIController because it | 83 // Do not silently replace an existing ManagePasswordsUIController because it |
| 80 // unregisters itself in WebContentsDestroyed(). | 84 // unregisters itself in WebContentsDestroyed(). |
| 81 EXPECT_FALSE(web_contents->GetUserData(UserDataKey())); | 85 EXPECT_FALSE(web_contents->GetUserData(UserDataKey())); |
| 82 web_contents->SetUserData(UserDataKey(), this); | 86 web_contents->SetUserData(UserDataKey(), this); |
| 83 } | 87 } |
| 84 | 88 |
| 89 TestManagePasswordsUIController::~TestManagePasswordsUIController() { |
| 90 if (!dialog_closed_) |
| 91 OnDialogHidden(); |
| 92 } |
| 93 |
| 85 void TestManagePasswordsUIController::OnDialogHidden() { | 94 void TestManagePasswordsUIController::OnDialogHidden() { |
| 86 ManagePasswordsUIController::OnDialogHidden(); | 95 ManagePasswordsUIController::OnDialogHidden(); |
| 87 OnDialogClosed(); | 96 OnDialogClosed(); |
| 97 dialog_closed_ = true; |
| 88 } | 98 } |
| 89 | 99 |
| 90 AccountChooserPrompt* TestManagePasswordsUIController::CreateAccountChooser( | 100 AccountChooserPrompt* TestManagePasswordsUIController::CreateAccountChooser( |
| 91 PasswordDialogController* controller) { | 101 PasswordDialogController* controller) { |
| 92 current_account_chooser_ = | 102 current_account_chooser_ = |
| 93 ManagePasswordsUIController::CreateAccountChooser(controller); | 103 ManagePasswordsUIController::CreateAccountChooser(controller); |
| 94 return current_account_chooser_; | 104 return current_account_chooser_; |
| 95 } | 105 } |
| 96 | 106 |
| 97 AutoSigninFirstRunPrompt* | 107 AutoSigninFirstRunPrompt* |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 203 |
| 194 SetupChooseCredentials(std::move(local_credentials), | 204 SetupChooseCredentials(std::move(local_credentials), |
| 195 ScopedVector<autofill::PasswordForm>(), origin); | 205 ScopedVector<autofill::PasswordForm>(), origin); |
| 196 ASSERT_TRUE(controller()->current_account_chooser()); | 206 ASSERT_TRUE(controller()->current_account_chooser()); |
| 197 AccountChooserDialogView* dialog = controller()->current_account_chooser(); | 207 AccountChooserDialogView* dialog = controller()->current_account_chooser(); |
| 198 EXPECT_CALL(*this, | 208 EXPECT_CALL(*this, |
| 199 OnChooseCredential(Field( | 209 OnChooseCredential(Field( |
| 200 &password_manager::CredentialInfo::type, | 210 &password_manager::CredentialInfo::type, |
| 201 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY))); | 211 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY))); |
| 202 EXPECT_CALL(*controller(), OnDialogClosed()); | 212 EXPECT_CALL(*controller(), OnDialogClosed()); |
| 203 EXPECT_TRUE(dialog->Close()); | 213 dialog->GetWidget()->Close(); |
| 204 | 214 |
| 205 EXPECT_FALSE(controller()->current_autosignin_prompt()); | 215 EXPECT_FALSE(controller()->current_autosignin_prompt()); |
| 206 } | 216 } |
| 207 | 217 |
| 208 IN_PROC_BROWSER_TEST_F( | 218 IN_PROC_BROWSER_TEST_F( |
| 209 PasswordDialogViewTest, | 219 PasswordDialogViewTest, |
| 210 PopupAccountChooserWithMultipleCredentialsReturnNonEmpty) { | 220 PopupAccountChooserWithMultipleCredentialsReturnNonEmpty) { |
| 211 GURL origin("https://example.com"); | 221 GURL origin("https://example.com"); |
| 212 ScopedVector<autofill::PasswordForm> local_credentials; | 222 ScopedVector<autofill::PasswordForm> local_credentials; |
| 213 autofill::PasswordForm form; | 223 autofill::PasswordForm form; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 254 SetupChooseCredentials(std::move(local_credentials), | 264 SetupChooseCredentials(std::move(local_credentials), |
| 255 ScopedVector<autofill::PasswordForm>(), origin); | 265 ScopedVector<autofill::PasswordForm>(), origin); |
| 256 | 266 |
| 257 EXPECT_TRUE(controller()->current_account_chooser()); | 267 EXPECT_TRUE(controller()->current_account_chooser()); |
| 258 AccountChooserDialogView* dialog = controller()->current_account_chooser(); | 268 AccountChooserDialogView* dialog = controller()->current_account_chooser(); |
| 259 EXPECT_CALL(*this, | 269 EXPECT_CALL(*this, |
| 260 OnChooseCredential(Field( | 270 OnChooseCredential(Field( |
| 261 &password_manager::CredentialInfo::type, | 271 &password_manager::CredentialInfo::type, |
| 262 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY))); | 272 password_manager::CredentialType::CREDENTIAL_TYPE_EMPTY))); |
| 263 EXPECT_CALL(*controller(), OnDialogClosed()); | 273 EXPECT_CALL(*controller(), OnDialogClosed()); |
| 264 EXPECT_TRUE(dialog->Close()); | 274 dialog->GetWidget()->Close(); |
| 265 EXPECT_FALSE(controller()->current_autosignin_prompt()); | 275 EXPECT_FALSE(controller()->current_autosignin_prompt()); |
| 266 } | 276 } |
| 267 | 277 |
| 268 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, | 278 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, |
| 269 PopupAccountChooserWithSingleCredentialReturnNonEmpty) { | 279 PopupAccountChooserWithSingleCredentialReturnNonEmpty) { |
| 270 GURL origin("https://example.com"); | 280 GURL origin("https://example.com"); |
| 271 ScopedVector<autofill::PasswordForm> local_credentials; | 281 ScopedVector<autofill::PasswordForm> local_credentials; |
| 272 autofill::PasswordForm form; | 282 autofill::PasswordForm form; |
| 273 form.origin = origin; | 283 form.origin = origin; |
| 274 form.display_name = base::ASCIIToUTF16("Peter"); | 284 form.display_name = base::ASCIIToUTF16("Peter"); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 285 EXPECT_CALL(*this, | 295 EXPECT_CALL(*this, |
| 286 OnChooseCredential(Field( | 296 OnChooseCredential(Field( |
| 287 &password_manager::CredentialInfo::type, | 297 &password_manager::CredentialInfo::type, |
| 288 password_manager::CredentialType::CREDENTIAL_TYPE_PASSWORD))); | 298 password_manager::CredentialType::CREDENTIAL_TYPE_PASSWORD))); |
| 289 EXPECT_TRUE( | 299 EXPECT_TRUE( |
| 290 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( | 300 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( |
| 291 browser()->profile()->GetPrefs())); | 301 browser()->profile()->GetPrefs())); |
| 292 controller()->ChooseCredential( | 302 controller()->ChooseCredential( |
| 293 form, password_manager::CredentialType::CREDENTIAL_TYPE_PASSWORD); | 303 form, password_manager::CredentialType::CREDENTIAL_TYPE_PASSWORD); |
| 294 | 304 |
| 305 EXPECT_TRUE(controller()->current_autosignin_prompt()); |
| 295 EXPECT_CALL(*controller(), OnDialogClosed()); | 306 EXPECT_CALL(*controller(), OnDialogClosed()); |
| 296 EXPECT_TRUE(controller()->current_autosignin_prompt()); | |
| 297 } | 307 } |
| 298 | 308 |
| 299 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, | 309 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, |
| 300 PopupAccountChooserWithDisabledAutoSignin) { | 310 PopupAccountChooserWithDisabledAutoSignin) { |
| 301 EXPECT_TRUE( | 311 EXPECT_TRUE( |
| 302 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( | 312 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( |
| 303 browser()->profile()->GetPrefs())); | 313 browser()->profile()->GetPrefs())); |
| 304 GURL origin("https://example.com"); | 314 GURL origin("https://example.com"); |
| 305 ScopedVector<autofill::PasswordForm> local_credentials; | 315 ScopedVector<autofill::PasswordForm> local_credentials; |
| 306 autofill::PasswordForm form; | 316 autofill::PasswordForm form; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 | 380 |
| 371 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, PopupAutoSigninPrompt) { | 381 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, PopupAutoSigninPrompt) { |
| 372 EXPECT_TRUE( | 382 EXPECT_TRUE( |
| 373 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( | 383 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( |
| 374 browser()->profile()->GetPrefs())); | 384 browser()->profile()->GetPrefs())); |
| 375 controller()->OnPromptEnableAutoSignin(); | 385 controller()->OnPromptEnableAutoSignin(); |
| 376 ASSERT_TRUE(controller()->current_autosignin_prompt()); | 386 ASSERT_TRUE(controller()->current_autosignin_prompt()); |
| 377 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->GetState()); | 387 EXPECT_EQ(password_manager::ui::INACTIVE_STATE, controller()->GetState()); |
| 378 AutoSigninFirstRunDialogView* dialog = | 388 AutoSigninFirstRunDialogView* dialog = |
| 379 controller()->current_autosignin_prompt(); | 389 controller()->current_autosignin_prompt(); |
| 380 // This is the way how ESC is processed. It's important to reproduce it | |
| 381 // because of double AutoSigninFirstRunDialogView::OnClosed call due to a bug | |
| 382 // http://crbug.com/583330. | |
| 383 ui::Accelerator esc(ui::VKEY_ESCAPE, 0); | 390 ui::Accelerator esc(ui::VKEY_ESCAPE, 0); |
| 384 EXPECT_CALL(*controller(), OnDialogClosed()); | 391 EXPECT_CALL(*controller(), OnDialogClosed()); |
| 385 EXPECT_TRUE(dialog->GetWidget()->client_view()->AcceleratorPressed(esc)); | 392 EXPECT_TRUE(dialog->GetWidget()->client_view()->AcceleratorPressed(esc)); |
| 393 content::RunAllPendingInMessageLoop(); |
| 386 testing::Mock::VerifyAndClearExpectations(controller()); | 394 testing::Mock::VerifyAndClearExpectations(controller()); |
| 387 EXPECT_TRUE( | 395 EXPECT_TRUE( |
| 388 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( | 396 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( |
| 389 browser()->profile()->GetPrefs())); | 397 browser()->profile()->GetPrefs())); |
| 390 } | 398 } |
| 391 | 399 |
| 392 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, | 400 IN_PROC_BROWSER_TEST_F(PasswordDialogViewTest, |
| 393 PopupAutoSigninPromptAfterBlockedZeroclick) { | 401 PopupAutoSigninPromptAfterBlockedZeroclick) { |
| 394 EXPECT_TRUE( | 402 EXPECT_TRUE( |
| 395 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( | 403 password_bubble_experiment::ShouldShowAutoSignInPromptFirstRunExperience( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 426 client()->NotifyUserAutoSigninBlockedOnFirstRun(std::move(blocked_form)); | 434 client()->NotifyUserAutoSigninBlockedOnFirstRun(std::move(blocked_form)); |
| 427 client()->NotifySuccessfulLoginWithExistingPassword(form); | 435 client()->NotifySuccessfulLoginWithExistingPassword(form); |
| 428 ASSERT_FALSE(controller()->current_autosignin_prompt()); | 436 ASSERT_FALSE(controller()->current_autosignin_prompt()); |
| 429 browser()->profile()->GetPrefs()->SetBoolean( | 437 browser()->profile()->GetPrefs()->SetBoolean( |
| 430 password_manager::prefs::kCredentialsEnableAutosignin, true); | 438 password_manager::prefs::kCredentialsEnableAutosignin, true); |
| 431 | 439 |
| 432 // Successful login with the same form after block will prompt: | 440 // Successful login with the same form after block will prompt: |
| 433 blocked_form.reset(new autofill::PasswordForm(form)); | 441 blocked_form.reset(new autofill::PasswordForm(form)); |
| 434 client()->NotifyUserAutoSigninBlockedOnFirstRun(std::move(blocked_form)); | 442 client()->NotifyUserAutoSigninBlockedOnFirstRun(std::move(blocked_form)); |
| 435 client()->NotifySuccessfulLoginWithExistingPassword(form); | 443 client()->NotifySuccessfulLoginWithExistingPassword(form); |
| 444 ASSERT_TRUE(controller()->current_autosignin_prompt()); |
| 445 |
| 436 EXPECT_CALL(*controller(), OnDialogClosed()); | 446 EXPECT_CALL(*controller(), OnDialogClosed()); |
| 437 ASSERT_TRUE(controller()->current_autosignin_prompt()); | |
| 438 } | 447 } |
| 439 | 448 |
| 440 } // namespace | 449 } // namespace |
| OLD | NEW |