| Index: chrome/browser/password_manager/credential_manager_browsertest.cc
|
| diff --git a/chrome/browser/password_manager/credential_manager_browsertest.cc b/chrome/browser/password_manager/credential_manager_browsertest.cc
|
| index e4854093f00e51bc1194b7a2ff8eb498b67ef3c8..978620b2821d5e49f899747b22aa1efc1b773365 100644
|
| --- a/chrome/browser/password_manager/credential_manager_browsertest.cc
|
| +++ b/chrome/browser/password_manager/credential_manager_browsertest.cc
|
| @@ -166,34 +166,54 @@ IN_PROC_BROWSER_TEST_F(CredentialManagerBrowserTest,
|
| EXPECT_FALSE(prompt_observer->IsShowingSavePrompt());
|
| }
|
|
|
| -// Disabled due to flakes; see https://crbug.com/629459.
|
| -IN_PROC_BROWSER_TEST_F(CredentialManagerBrowserTest,
|
| - DISABLED_SaveViaAPIAndAutofill) {
|
| +IN_PROC_BROWSER_TEST_F(CredentialManagerBrowserTest, SaveViaAPIAndAutofill) {
|
| NavigateToFile("/password/password_form.html");
|
| - std::string fill_password =
|
| - "document.getElementById('username_field').value = 'user';"
|
| - "document.getElementById('password_field').value = '12345';";
|
| - ASSERT_TRUE(content::ExecuteScript(RenderViewHost(), fill_password));
|
|
|
| - // Call the API to save the form.
|
| + // Postpone a submit event for 1 second. Even for the static html page Chrome
|
| + // continues to parse and recreate the PasswordFormManager instances after the
|
| + // page load. Calling the API before this would make the test flaky. Clicking
|
| + // on the button emulates server analysing the credential and then saving and
|
| + // navigating to the landing page.
|
| ASSERT_TRUE(content::ExecuteScript(
|
| RenderViewHost(),
|
| - "var c = new PasswordCredential({ id: 'user', password: '12345' });"
|
| - "navigator.credentials.store(c);"));
|
| - // Wait for the password store before checking the prompt because it pops up
|
| - // after the store replies.
|
| - WaitForPasswordStore();
|
| - std::unique_ptr<BubbleObserver> prompt_observer(
|
| - new BubbleObserver(WebContents()));
|
| - EXPECT_TRUE(prompt_observer->IsShowingSavePrompt());
|
| - prompt_observer->Dismiss();
|
| -
|
| + "document.getElementById('input_submit_button').addEventListener('click',"
|
| + "function(event) {"
|
| + "setTimeout( function() {"
|
| + "var c = new PasswordCredential({ id: 'user', password: 'API' });"
|
| + "navigator.credentials.store(c);"
|
| + "document.getElementById('testform').submit();"
|
| + "}, 1000 );"
|
| + "event.preventDefault();"
|
| + "});"));
|
| + // Fill the password and click the button to submit the page later. The API
|
| + // should suppress the autofill password manager.
|
| NavigationObserver form_submit_observer(WebContents());
|
| ASSERT_TRUE(content::ExecuteScript(
|
| RenderViewHost(),
|
| + "document.getElementById('username_field').value = 'user';"
|
| + "document.getElementById('password_field').value = 'autofill';"
|
| "document.getElementById('input_submit_button').click();"));
|
| form_submit_observer.Wait();
|
| - EXPECT_FALSE(prompt_observer->IsShowingSavePrompt());
|
| +
|
| + WaitForPasswordStore();
|
| + std::unique_ptr<BubbleObserver> prompt_observer(
|
| + new BubbleObserver(WebContents()));
|
| + ASSERT_TRUE(prompt_observer->IsShowingSavePrompt());
|
| + prompt_observer->AcceptSavePrompt();
|
| +
|
| + WaitForPasswordStore();
|
| + password_manager::TestPasswordStore::PasswordMap stored =
|
| + static_cast<password_manager::TestPasswordStore*>(
|
| + PasswordStoreFactory::GetForProfile(
|
| + browser()->profile(), ServiceAccessType::IMPLICIT_ACCESS)
|
| + .get())->stored_passwords();
|
| + ASSERT_EQ(1u, stored.size());
|
| + autofill::PasswordForm signin_form = stored.begin()->second[0];
|
| + EXPECT_EQ(base::ASCIIToUTF16("user"), signin_form.username_value);
|
| + EXPECT_EQ(base::ASCIIToUTF16("API"), signin_form.password_value);
|
| + EXPECT_EQ(embedded_test_server()->base_url().spec(),
|
| + signin_form.signon_realm);
|
| + EXPECT_EQ(embedded_test_server()->base_url(), signin_form.origin);
|
| }
|
|
|
| IN_PROC_BROWSER_TEST_F(CredentialManagerBrowserTest, UpdateViaAPIAndAutofill) {
|
|
|