15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/chrome_render_view_test.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/content/common/autofill_messages.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/autofill_agent.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/autofill/content/renderer/form_autofill_util.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "components/autofill/content/renderer/password_autofill_agent.h"
123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "components/autofill/content/renderer/test_password_autofill_agent.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_data.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "components/autofill/core/common/form_field_data.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "components/autofill/core/common/password_autofill_util.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebElement.h"
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFormElement.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebInputElement.h"
230529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "third_party/WebKit/public/web/WebLocalFrame.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebNode.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebView.h"
26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)using autofill::PasswordForm;
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::UTF16ToUTF8;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebDocument;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebElement;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebFrame;
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebInputElement;
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebString;
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebView;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The name of the username/password element in the form.
413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kUsernameName[] = "username";
423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kPasswordName[] = "password";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAliceUsername[] = "alice";
453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kAlicePassword[] = "password";
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kBobUsername[] = "bob";
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kBobPassword[] = "secret";
483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kCarolUsername[] = "Carol";
493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kCarolPassword[] = "test";
503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kCarolAlternateUsername[] = "RealCarolUsername";
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kFormHTML[] =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "<FORM name='LoginTestForm' action='http://www.bidule.com'>"
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  <INPUT type='text' id='username'/>"
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  <INPUT type='password' id='password'/>"
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "  <INPUT type='submit' value='Login'/>"
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    "</FORM>";
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kVisibleFormHTML[] =
603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<head> <style> form {display: inline;} </style> </head>"
613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<body>"
623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "  <form>"
633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "    <div>"
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "      <input type='password' id='password'/>"
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "    </div>"
663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "  </form>"
673551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "</body>";
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kEmptyFormHTML[] =
703551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<head> <style> form {display: inline;} </style> </head>"
713551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<body> <form> </form> </body>";
723551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)const char kNonVisibleFormHTML[] =
743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<head> <style> form {display: none;} </style> </head>"
753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "<body>"
763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "  <form>"
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "    <div>"
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "      <input type='password' id='password'/>"
793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "    </div>"
803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "  </form>"
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    "</body>";
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kEmptyWebpage[] =
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "<html>"
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <head>"
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </head>"
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <body>"
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </body>"
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "</html>";
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kRedirectionWebpage[] =
9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "<html>"
9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <head>"
9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <meta http-equiv='Content-Type' content='text/html'>"
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <title>Redirection page</title>"
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <script></script>"
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </head>"
9858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <body>"
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <script type='text/javascript'>"
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "         function test(){}"
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       </script>"
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </body>"
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "</html>";
10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
10558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSimpleWebpage[] =
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "<html>"
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <head>"
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <meta charset='utf-8' />"
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <title>Title</title>"
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </head>"
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <body>"
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <form name='LoginTestForm'>"
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "           <input type='text' id='username'/>"
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "           <input type='password' id='password'/>"
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "           <input type='submit' value='Login'/>"
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       </form>"
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </body>"
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "</html>";
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kWebpageWithDynamicContent[] =
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "<html>"
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <head>"
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <meta charset='utf-8' />"
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <title>Title</title>"
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </head>"
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   <body>"
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       <script type='text/javascript'>"
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "           function addParagraph() {"
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "             var p = document.createElement('p');"
13058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "             document.body.appendChild(p);"
13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "            }"
13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "           window.onload = addParagraph;"
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "       </script>"
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "   </body>"
13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    "</html>";
13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
137a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)const char kJavaScriptClick[] =
138a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "var event = new MouseEvent('click', {"
139a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "   'view': window,"
140a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "   'bubbles': true,"
141a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "   'cancelable': true"
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "});"
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "var form = document.getElementById('myform1');"
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "form.dispatchEvent(event);"
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    "console.log('clicked!');";
146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const char kOnChangeDetectionScript[] =
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "<script>"
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  usernameOnchangeCalled = false;"
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  passwordOnchangeCalled = false;"
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  document.getElementById('username').onchange = function() {"
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    usernameOnchangeCalled = true;"
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  };"
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  document.getElementById('password').onchange = function() {"
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "    passwordOnchangeCalled = true;"
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "  };"
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    "</script>";
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Sets the "readonly" attribute of |element| to the value given by |read_only|.
1605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid SetElementReadOnly(WebInputElement& element, bool read_only) {
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  element.setAttribute(WebString::fromUTF8("readonly"),
1625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                       read_only ? WebString::fromUTF8("true") : WebString());
1635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace autofill {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PasswordAutofillAgentTest : public ChromeRenderViewTest {
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PasswordAutofillAgentTest() {
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates the fill password form message being sent to the renderer.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We use that so we don't have to make RenderView::OnFillPasswordForm()
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // protected.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateOnFillPasswordForm(
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const PasswordFormFillData& fill_data) {
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    AutofillMsg_FillPasswordForm msg(0, fill_data);
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<content::RenderViewObserver*>(password_autofill_agent_)
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->OnMessageReceived(msg);
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  void SendVisiblePasswordForms() {
1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<content::RenderViewObserver*>(password_autofill_agent_)
1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->DidFinishLoad(GetMainFrame());
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  }
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ChromeRenderViewTest::SetUp();
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Add a preferred login and an additional login to the FillData.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username1_ = ASCIIToUTF16(kAliceUsername);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password1_ = ASCIIToUTF16(kAlicePassword);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username2_ = ASCIIToUTF16(kBobUsername);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password2_ = ASCIIToUTF16(kBobPassword);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username3_ = ASCIIToUTF16(kCarolUsername);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password3_ = ASCIIToUTF16(kCarolPassword);
199868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    alternate_username3_ = ASCIIToUTF16(kCarolAlternateUsername);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormFieldData username_field;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username_field.name = ASCIIToUTF16(kUsernameName);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username_field.value = username1_;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fill_data_.basic_data.fields.push_back(username_field);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    FormFieldData password_field;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password_field.name = ASCIIToUTF16(kPasswordName);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password_field.value = password1_;
209868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    password_field.form_control_type = "password";
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fill_data_.basic_data.fields.push_back(password_field);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PasswordAndRealm password2;
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    password2.password = password2_;
214eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fill_data_.additional_logins[username2_] = password2;
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    PasswordAndRealm password3;
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    password3.password = password3_;
217eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    fill_data_.additional_logins[username3_] = password3;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    UsernamesCollectionKey key;
220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    key.username = username3_;
221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    key.password = password3_;
222558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch    key.realm = "google.com";
223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    fill_data_.other_possible_usernames[key].push_back(alternate_username3_);
224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // We need to set the origin so it matches the frame URL and the action so
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // it matches the form action, otherwise we won't autocomplete.
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateOriginForHTML(kFormHTML);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    fill_data_.basic_data.action = GURL("http://www.bidule.com");
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LoadHTML(kFormHTML);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Now retrieve the input elements so the test can access them.
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    UpdateUsernameAndPasswordElements();
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void TearDown() {
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    username_element_.reset();
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    password_element_.reset();
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ChromeRenderViewTest::TearDown();
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void UpdateOriginForHTML(const std::string& html) {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    std::string origin = "data:text/html;charset=utf-8," + html;
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    fill_data_.basic_data.origin = GURL(origin);
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void UpdateUsernameAndPasswordElements() {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebDocument document = GetMainFrame()->document();
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebElement element =
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        document.getElementById(WebString::fromUTF8(kUsernameName));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(element.isNull());
252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    username_element_ = element.to<blink::WebInputElement>();
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    element = document.getElementById(WebString::fromUTF8(kPasswordName));
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_FALSE(element.isNull());
255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    password_element_ = element.to<blink::WebInputElement>();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearUsernameAndPasswordFields() {
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username_element_.setValue("");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    username_element_.setAutofilled(false);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password_element_.setValue("");
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    password_element_.setAutofilled(false);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SimulateDidEndEditing(WebFrame* input_frame, WebInputElement& input) {
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<blink::WebAutofillClient*>(autofill_agent_)
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->textFieldDidEndEditing(input);
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  void SimulateInputChangeForElement(const std::string& new_value,
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     bool move_caret_to_end,
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     WebFrame* input_frame,
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     WebInputElement& input,
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                     bool is_user_input) {
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input.setValue(WebString::fromUTF8(new_value), is_user_input);
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The field must have focus or AutofillAgent will think the
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // change should be ignored.
2781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    while (!input.focused())
279f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      input_frame->document().frame()->view()->advanceFocus(false);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (move_caret_to_end)
2811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      input.setSelectionRange(new_value.length(), new_value.length());
282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (is_user_input)
2831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->FirstUserGestureObserved();
2841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<blink::WebAutofillClient*>(autofill_agent_)
2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->textFieldDidChange(input);
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Processing is delayed because of a Blink bug:
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // https://bugs.webkit.org/show_bug.cgi?id=16976
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // See PasswordAutofillAgent::TextDidChangeInTextField() for details.
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // Autocomplete will trigger a style recalculation when we put up the next
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // frame, but we don't want to wait that long. Instead, trigger a style
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // recalcuation manually after TextFieldDidChangeImpl runs.
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::MessageLoop::current()->PostTask(FROM_HERE, base::Bind(
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        &PasswordAutofillAgentTest::LayoutMainFrame, base::Unretained(this)));
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
296a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    base::MessageLoop::current()->RunUntilIdle();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
299116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void SimulateSuggestionChoice(WebInputElement& username_input) {
3001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::string16 username(base::ASCIIToUTF16(kAliceUsername));
3011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::string16 password(base::ASCIIToUTF16(kAlicePassword));
302116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // This call is necessary to setup the autofill agent appropriate for the
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // user selection; simulates the menu actually popping up.
305116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    render_thread_->sink().ClearMessages();
3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<autofill::PageClickListener*>(autofill_agent_)
3071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->FormControlElementClicked(username_input, false);
308116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    AutofillMsg_FillPasswordSuggestion msg(0, username, password);
3101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<content::RenderViewObserver*>(autofill_agent_)
3111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->OnMessageReceived(msg);
312116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
313116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
3145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void LayoutMainFrame() {
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    GetMainFrame()->view()->layout();
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SimulateUsernameChange(const std::string& username,
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              bool move_caret_to_end,
320116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                              bool is_user_input = false) {
3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    SimulateInputChangeForElement(username,
3221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  move_caret_to_end,
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  GetMainFrame(),
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  username_element_,
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                  is_user_input);
326f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Tests that no suggestion popup is generated when the username_element_ is
3295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // edited.
3305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ExpectNoSuggestionsPopup() {
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // The first test below ensures that the suggestions have been handled by
3325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // the password_autofill_agent, even though autocomplete='off' is set. The
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // second check ensures that, although handled, no "show suggestions" IPC to
3345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // the browser was generated.
3355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //
3365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // This is interesting in the specific case of an autocomplete='off' form
3375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // that also has a remembered username and password
3385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // (http://crbug.com/326679). To fix the DCHECK that this case used to hit,
3395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // |true| is returned from ShowSuggestions for all forms with valid
3405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // usersnames that are autocomplete='off', prentending that a selection box
3415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // has been shown to the user. Of course, it hasn't, so a message is never
3425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // sent to the browser on acceptance, and the DCHECK isn't hit (and nothing
3435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // is filled).
3445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    //
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // These tests only make sense in the context of not ignoring
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // autocomplete='off', so only test them if the disable autocomplete='off'
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // flag is not enabled.
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(jww): Remove this function and callers once autocomplete='off' is
3495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // permanently ignored.
3505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!ShouldIgnoreAutocompleteOffForPasswordFields()) {
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_TRUE(
3521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          password_autofill_agent_->ShowSuggestions(username_element_, false));
3535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          AutofillHostMsg_ShowPasswordSuggestions::ID));
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SimulateKeyDownEvent(const WebInputElement& element,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            ui::KeyboardCode key_code) {
361f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    blink::WebKeyboardEvent key_event;
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    key_event.windowsKeyCode = key_code;
3631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    static_cast<blink::WebAutofillClient*>(autofill_agent_)
3641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ->textFieldDidReceiveKeyDown(element, key_event);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
367f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void CheckTextFieldsStateForElements(const WebInputElement& username_element,
368f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       const std::string& username,
369f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       bool username_autofilled,
370f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       const WebInputElement& password_element,
371f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                       const std::string& password,
372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                       bool password_autofilled,
373116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                       bool checkSuggestedValue) {
374f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(username,
375f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)              static_cast<std::string>(username_element.value().utf8()));
376f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(username_autofilled, username_element.isAutofilled());
377f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(password,
378a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)              static_cast<std::string>(
379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                  checkSuggestedValue ? password_element.suggestedValue().utf8()
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                      : password_element.value().utf8()))
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        << "checkSuggestedValue == " << checkSuggestedValue;
382f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    EXPECT_EQ(password_autofilled, password_element.isAutofilled());
383f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
384f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Checks the DOM-accessible value of the username element and the
386a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // *suggested* value of the password element.
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckTextFieldsState(const std::string& username,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool username_autofilled,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const std::string& password,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            bool password_autofilled) {
391116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    CheckTextFieldsStateForElements(username_element_,
392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    username,
393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    username_autofilled,
394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    password_element_,
395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    password,
396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    password_autofilled,
397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    true);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
400a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Checks the DOM-accessible value of the username element and the
401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // DOM-accessible value of the password element.
402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void CheckTextFieldsDOMState(const std::string& username,
403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               bool username_autofilled,
404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               const std::string& password,
405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                               bool password_autofilled) {
406a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    CheckTextFieldsStateForElements(username_element_,
407a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    username,
408a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    username_autofilled,
409a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    password_element_,
410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    password,
411a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    password_autofilled,
412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                    false);
413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
414a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckUsernameSelection(int start, int end) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(start, username_element_.selectionStart());
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(end, username_element_.selectionEnd());
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
420116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ExpectOneCredential(const base::string16& username) {
421116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const IPC::Message* message =
422116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        render_thread_->sink().GetFirstMessageMatching(
423116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            AutofillHostMsg_ShowPasswordSuggestions::ID);
424116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(message);
425116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Tuple4<autofill::FormFieldData,
426116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           gfx::RectF,
427116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           std::vector<base::string16>,
428116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           std::vector<base::string16> > args;
429116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AutofillHostMsg_ShowPasswordSuggestions::Read(message, &args);
430116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_EQ(1u, args.c.size());
431116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(args.c[0] == username);
432116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
433116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
434116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void ExpectAllCredentials() {
435116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::set<base::string16> usernames;
436116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    usernames.insert(username1_);
437116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    usernames.insert(username2_);
438116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    usernames.insert(username3_);
439116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    usernames.insert(alternate_username3_);
440116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
441116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const IPC::Message* message =
442116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        render_thread_->sink().GetFirstMessageMatching(
443116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            AutofillHostMsg_ShowPasswordSuggestions::ID);
444116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_TRUE(message);
445116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Tuple4<autofill::FormFieldData,
446116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           gfx::RectF,
447116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           std::vector<base::string16>,
448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch           std::vector<base::string16> > args;
449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    AutofillHostMsg_ShowPasswordSuggestions::Read(message, &args);
450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ASSERT_EQ(4u, args.c.size());
451116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    std::set<base::string16>::iterator it;
452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    for (int i = 0; i < 4; i++) {
454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      it = usernames.find(args.c[i]);
455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      EXPECT_TRUE(it != usernames.end());
456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      if (it != usernames.end())
457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        usernames.erase(it);
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    }
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_TRUE(usernames.empty());
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    render_thread_->sink().ClearMessages();
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void ExpectFormSubmittedWithPasswords(const std::string& password_value,
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                        const std::string& new_password_value) {
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const IPC::Message* message =
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        render_thread_->sink().GetFirstMessageMatching(
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            AutofillHostMsg_PasswordFormSubmitted::ID);
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_TRUE(message);
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Tuple1<autofill::PasswordForm> args;
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    AutofillHostMsg_PasswordFormSubmitted::Read(message, &args);
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(password_value), args.a.password_value);
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16(new_password_value), args.a.new_password_value);
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
477a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 username1_;
478a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 username2_;
479a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 username3_;
480a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 password1_;
481a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 password2_;
482a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 password3_;
483a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 alternate_username3_;
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordFormFillData fill_data_;
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputElement username_element_;
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebInputElement password_element_;
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
490c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PasswordAutofillAgentTest);
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that the password login is autocompleted as expected when the browser
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sends back the password info.
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, InitialAutocomplete) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /*
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Right now we are not sending the message to the browser because we are
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * loading a data URL and the security origin canAccessPasswordManager()
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * returns false.  May be we should mock URL loading to cirmcuvent this?
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   TODO(jcivelli): find a way to make the security origin not deny access to the
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   password manager and then reenable this code.
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The form has been loaded, we should have sent the browser a message about
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the form.
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const IPC::Message* msg = render_thread_.sink().GetFirstMessageMatching(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      AutofillHostMsg_PasswordFormsParsed::ID);
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(msg != NULL);
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tuple1<std::vector<PasswordForm> > forms;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutofillHostMsg_PasswordFormsParsed::Read(msg, &forms);
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, forms.a.size());
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PasswordForm password_form = forms.a[0];
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(PasswordForm::SCHEME_HTML, password_form.scheme);
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(kUsernameName), password_form.username_element);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16(kPasswordName), password_form.password_element);
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  */
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The username and password should have been autocompleted.
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we correctly fill forms having an empty 'action' attribute.
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, InitialAutocompleteForEmptyAction) {
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char kEmptyActionFormHTML[] =
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "<FORM name='LoginTestForm'>"
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <INPUT type='text' id='username'/>"
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <INPUT type='password' id='password'/>"
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "  <INPUT type='submit' value='Login'/>"
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "</FORM>";
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LoadHTML(kEmptyActionFormHTML);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Retrieve the input elements so the test can access them.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebDocument document = GetMainFrame()->document();
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebElement element =
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      document.getElementById(WebString::fromUTF8(kUsernameName));
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_ = element.to<blink::WebInputElement>();
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  element = document.getElementById(WebString::fromUTF8(kPasswordName));
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  password_element_ = element.to<blink::WebInputElement>();
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the expected form origin and action URLs.
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateOriginForHTML(kEmptyActionFormHTML);
5485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fill_data_.basic_data.action = fill_data_.basic_data.origin;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The username and password should have been autocompleted.
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that if a password is marked as readonly, neither field is autofilled
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// on page load.
560f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoInitialAutocompleteForReadOnlyPassword) {
5615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetElementReadOnly(password_element_, true);
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
570f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Can still fill a password field if the username is set to a value that
571f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// matches.
572f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
573f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       AutocompletePasswordForReadonlyUsernameMatched) {
574f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_.setValue(username3_);
5755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetElementReadOnly(username_element_, true);
576f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
577f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Filled even though username is not the preferred match.
578f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
579f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextFieldsState(UTF16ToUTF8(username3_), false,
580f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                       UTF16ToUTF8(password3_), true);
581f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
582f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
583f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// If a username field is empty and readonly, don't autofill.
584f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
585f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)       NoAutocompletePasswordForReadonlyUsernameUnmatched) {
586f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_.setValue(WebString::fromUTF8(""));
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetElementReadOnly(username_element_, true);
588f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
589f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
590f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
591f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
592f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that having a non-matching username precludes the autocomplete.
594f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoAutocompleteForFilledFieldUnmatched) {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue(WebString::fromUTF8("bogus"));
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Neither field should be autocompleted.
602c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("bogus", false, std::string(), false);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Don't try to complete a prefilled value even if it's a partial match
606f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// to a username.
607f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoPartialMatchForPrefilledUsername) {
608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_.setValue(WebString::fromUTF8("ali"));
609f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
610f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
611f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
612f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextFieldsState("ali", false, std::string(), false);
613f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, InputWithNoForms) {
616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const char kNoFormInputs[] =
617f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<input type='text' id='username'/>"
618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<input type='password' id='password'/>";
619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoadHTML(kNoFormInputs);
620f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
623f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Input elements that aren't in a <form> won't autofill.
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
626f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
627868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoAutocompleteForTextFieldPasswords) {
628868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const char kTextFieldPasswordFormHTML[] =
629868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "<FORM name='LoginTestForm' action='http://www.bidule.com'>"
630868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='text' id='username'/>"
631868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='text' id='password'/>"
632868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='submit' value='Login'/>"
633868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "</FORM>";
634868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LoadHTML(kTextFieldPasswordFormHTML);
635868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
636868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Retrieve the input elements so the test can access them.
637868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebDocument document = GetMainFrame()->document();
638868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebElement element =
639868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      document.getElementById(WebString::fromUTF8(kUsernameName));
640868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
641f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_ = element.to<blink::WebInputElement>();
642868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  element = document.getElementById(WebString::fromUTF8(kPasswordName));
643868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
644f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  password_element_ = element.to<blink::WebInputElement>();
645868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
646868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the expected form origin URL.
6475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateOriginForHTML(kTextFieldPasswordFormHTML);
648868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
649868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
650868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
651868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fields should still be empty.
652868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
653868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
654868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
655868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoAutocompleteForPasswordFieldUsernames) {
656868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const char kPasswordFieldUsernameFormHTML[] =
657868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "<FORM name='LoginTestForm' action='http://www.bidule.com'>"
658868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='password' id='username'/>"
659868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='password' id='password'/>"
660868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "  <INPUT type='submit' value='Login'/>"
661868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      "</FORM>";
662868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  LoadHTML(kPasswordFieldUsernameFormHTML);
663868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
664868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Retrieve the input elements so the test can access them.
665868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebDocument document = GetMainFrame()->document();
666868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  WebElement element =
667868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      document.getElementById(WebString::fromUTF8(kUsernameName));
668868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
669f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  username_element_ = element.to<blink::WebInputElement>();
670868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  element = document.getElementById(WebString::fromUTF8(kPasswordName));
671868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  ASSERT_FALSE(element.isNull());
672f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  password_element_ = element.to<blink::WebInputElement>();
673868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
674868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Set the expected form origin URL.
6755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateOriginForHTML(kPasswordFieldUsernameFormHTML);
676868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
677868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
678868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
679868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Fields should still be empty.
680868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
681868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
682868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that having a matching username does not preclude the autocomplete.
684c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, InitialAutocompleteForMatchingFilledField) {
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue(WebString::fromUTF8(kAliceUsername));
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The username and password should have been autocompleted.
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that editing the password clears the autocompleted password field.
696c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, PasswordClearOnEdit) {
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // autocomplete.
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the user changing the username to some unknown username.
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("alicia", true);
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The password should have been cleared.
705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("alicia", false, std::string(), false);
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that we only autocomplete on focus lost and with a full username match
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// when |wait_for_username| is true.
710c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, WaitUsername) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info.
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  fill_data_.wait_for_username = true;
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No auto-fill should have taken place.
716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // No autocomplete should happen when text is entered in the username.
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("a", true);
720c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("a", false, std::string(), false);
7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("al", true);
722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("al", false, std::string(), false);
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange(kAliceUsername, true);
724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState(kAliceUsername, false, std::string(), false);
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Autocomplete should happen only when the username textfield is blurred with
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // a full match.
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue("a");
7291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<blink::WebAutofillClient*>(autofill_agent_)
7301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->textFieldDidEndEditing(username_element_);
731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("a", false, std::string(), false);
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue("al");
7331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<blink::WebAutofillClient*>(autofill_agent_)
7341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->textFieldDidEndEditing(username_element_);
735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("al", false, std::string(), false);
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue("alices");
7371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<blink::WebAutofillClient*>(autofill_agent_)
7381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->textFieldDidEndEditing(username_element_);
739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("alices", false, std::string(), false);
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  username_element_.setValue(ASCIIToUTF16(kAliceUsername));
7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<blink::WebAutofillClient*>(autofill_agent_)
7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->textFieldDidEndEditing(username_element_);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that inline autocompletion works properly.
747c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, InlineAutocomplete) {
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulate the browser sending back the login info.
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClearUsernameAndPasswordFields();
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
753116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate the user typing in the first letter of 'alice', a stored
754116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // username.
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("a", true);
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Both the username and password text fields should reflect selection of the
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stored login.
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And the selection should have been set to 'lice', the last 4 letters.
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(1, 5);
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now the user types the next letter of the same username, 'l'.
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("al", true);
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now the fields should have the same value, but the selection should have a
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // different start value.
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(2, 5);
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test that deleting does not trigger autocomplete.
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyDownEvent(username_element_, ui::VKEY_BACK);
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("alic", true);
772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("alic", false, std::string(), false);
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(4, 4);  // No selection.
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reset the last pressed key to something other than backspace.
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateKeyDownEvent(username_element_, ui::VKEY_A);
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Now lets say the user goes astray from the stored username and types the
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // letter 'f', spelling 'alf'.  We don't know alf (that's just sad), so in
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // practice the username should no longer be 'alice' and the selected range
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be empty.
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("alf", true);
782c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("alf", false, std::string(), false);
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(3, 3);  // No selection.
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ok, so now the user removes all the text and enters the letter 'b'.
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("b", true);
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The username and password fields should match the 'bob' entry.
7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kBobUsername, true, kBobPassword, true);
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(1, 3);
7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then, the user again removes all the text and types an uppercase 'C'.
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("C", true);
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The username and password fields should match the 'Carol' entry.
7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckTextFieldsState(kCarolUsername, true, kCarolPassword, true);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(1, 5);
796868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // The user removes all the text and types a lowercase 'c'.  We only
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want case-sensitive autocompletion, so the username and the selected range
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be empty.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SimulateUsernameChange("c", true);
800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CheckTextFieldsState("c", false, std::string(), false);
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckUsernameSelection(1, 1);
802868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
803868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Check that we complete other_possible_usernames as well.
804868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  SimulateUsernameChange("R", true);
805868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckTextFieldsState(kCarolAlternateUsername, true, kCarolPassword, true);
806868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  CheckUsernameSelection(1, 17);
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, IsWebNodeVisibleTest) {
810f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebVector<blink::WebFormElement> forms1, forms2, forms3;
811f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  blink::WebFrame* frame;
8123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kVisibleFormHTML);
8143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame = GetMainFrame();
8153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame->document().forms(forms1);
8163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(1u, forms1.size());
8173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(IsWebNodeVisible(forms1[0]));
8183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kEmptyFormHTML);
8203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame = GetMainFrame();
8213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame->document().forms(forms2);
8223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(1u, forms2.size());
8233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(IsWebNodeVisible(forms2[0]));
8243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kNonVisibleFormHTML);
8263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame = GetMainFrame();
8273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  frame->document().forms(forms3);
8283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  ASSERT_EQ(1u, forms3.size());
8293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(IsWebNodeVisible(forms3[0]));
8303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, SendPasswordFormsTest) {
8333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  render_thread_->sink().ClearMessages();
8343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kVisibleFormHTML);
8353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const IPC::Message* message = render_thread_->sink()
8363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      .GetFirstMessageMatching(AutofillHostMsg_PasswordFormsRendered::ID);
8373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(message);
838116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Tuple2<std::vector<autofill::PasswordForm>, bool > param;
8393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AutofillHostMsg_PasswordFormsRendered::Read(message, &param);
8403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(param.a.size());
8413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  render_thread_->sink().ClearMessages();
8433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kEmptyFormHTML);
8443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message = render_thread_->sink().GetFirstMessageMatching(
8453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID);
8463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(message);
8473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AutofillHostMsg_PasswordFormsRendered::Read(message, &param);
8483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(param.a.size());
8493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
8503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  render_thread_->sink().ClearMessages();
8513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  LoadHTML(kNonVisibleFormHTML);
8523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  message = render_thread_->sink().GetFirstMessageMatching(
8533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID);
8543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(message);
8553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AutofillHostMsg_PasswordFormsRendered::Read(message, &param);
8563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_FALSE(param.a.size());
8573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
8583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
85958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, SendPasswordFormsTest_Redirection) {
86058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  render_thread_->sink().ClearMessages();
86158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LoadHTML(kEmptyWebpage);
86258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
86358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID));
86458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
86558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  render_thread_->sink().ClearMessages();
86658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LoadHTML(kRedirectionWebpage);
86758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_FALSE(render_thread_->sink().GetFirstMessageMatching(
86858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID));
86958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  render_thread_->sink().ClearMessages();
87158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LoadHTML(kSimpleWebpage);
87258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching(
87358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID));
87458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
87558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  render_thread_->sink().ClearMessages();
87658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  LoadHTML(kWebpageWithDynamicContent);
87758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  EXPECT_TRUE(render_thread_->sink().GetFirstMessageMatching(
87858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      AutofillHostMsg_PasswordFormsRendered::ID));
87958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
88058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
881f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Tests that a password form in an iframe will not be filled in until a user
882f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// interaction with the form.
883f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest, IframeNoFillTest) {
884f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const char kIframeName[] = "iframe";
885f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const char kWebpageWithIframeStart[] =
886f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "<html>"
887f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "   <head>"
888f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "       <meta charset='utf-8' />"
889f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "       <title>Title</title>"
890f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "   </head>"
891f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "   <body>"
892a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      "       <iframe name='iframe' src=\"";
893f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const char kWebpageWithIframeEnd[] =
894f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "\"></iframe>"
895f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "   </body>"
896f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      "</html>";
897f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
898f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string origin("data:text/html;charset=utf-8,");
899f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  origin += kSimpleWebpage;
900f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
901f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  std::string page_html(kWebpageWithIframeStart);
902f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  page_html += origin;
903f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  page_html += kWebpageWithIframeEnd;
904f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
905f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  LoadHTML(page_html.c_str());
906f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
907f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Set the expected form origin and action URLs.
908f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fill_data_.basic_data.origin = GURL(origin);
909f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  fill_data_.basic_data.action = GURL(origin);
910f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
911f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
912f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
913f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Retrieve the input elements from the iframe since that is where we want to
914f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // test the autofill.
915f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebFrame* iframe = GetMainFrame()->findChildByName(kIframeName);
916f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_TRUE(iframe);
917f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebDocument document = iframe->document();
918f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
919f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebElement username_element = document.getElementById(kUsernameName);
920f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebElement password_element = document.getElementById(kPasswordName);
921f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(username_element.isNull());
922f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(password_element.isNull());
923f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
924f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebInputElement username_input = username_element.to<WebInputElement>();
925f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  WebInputElement password_input = password_element.to<WebInputElement>();
926f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ASSERT_FALSE(username_element.isNull());
927f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
928116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckTextFieldsStateForElements(
929116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      username_input, "", false, password_input, "", false, false);
930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
931116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate the user typing in the username in the iframe which should cause
932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // an autofill.
9331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
934116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      kAliceUsername, true, iframe, username_input, true);
935116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
936116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckTextFieldsStateForElements(username_input,
937116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  kAliceUsername,
938116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  true,
939116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  password_input,
940116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  kAlicePassword,
941116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  true,
942116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                  false);
943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Tests that a password will only be filled as a suggested and will not be
946a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// accessible by the DOM until a user gesture has occurred.
947a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, GestureRequiredTest) {
948a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Trigger the initial autocomplete.
949a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
950a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
951a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // The username and password should have been autocompleted.
952a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
953a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
954a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // However, it should only have completed with the suggested value, as tested
955a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // above, and it should not have completed into the DOM accessible value for
956a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // the password field.
9575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, std::string(), true);
958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
959a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Simulate a user click so that the password field's real value is filled.
960a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimulateElementClick(kUsernameName);
961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
962a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
963a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
964a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// Verfies that a DOM-activated UI event will not cause an autofill.
965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, NoDOMActivationTest) {
966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Trigger the initial autocomplete.
967a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  ExecuteJavaScript(kJavaScriptClick);
970a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, "", true);
971a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
972a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
9735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Regression test for http://crbug.com/326679
9745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, SelectUsernameWithUsernameAutofillOff) {
9755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info.
9765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
9775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the username element to autocomplete='off'
9795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  username_element_.setAttribute(WebString::fromUTF8("autocomplete"),
9805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 WebString::fromUTF8("off"));
9815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the user changing the username to some known username.
9835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateUsernameChange(kAliceUsername, true);
9845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExpectNoSuggestionsPopup();
9865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
9875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Regression test for http://crbug.com/326679
9895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
9905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       SelectUnknownUsernameWithUsernameAutofillOff) {
9915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info.
9925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
9935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the username element to autocomplete='off'
9955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  username_element_.setAttribute(WebString::fromUTF8("autocomplete"),
9965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 WebString::fromUTF8("off"));
9975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
9985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the user changing the username to some unknown username.
9995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateUsernameChange("foo", true);
10005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExpectNoSuggestionsPopup();
10025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Regression test for http://crbug.com/326679
10055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, SelectUsernameWithPasswordAutofillOff) {
10065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info.
10075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
10085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the main password element to autocomplete='off'
10105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  password_element_.setAttribute(WebString::fromUTF8("autocomplete"),
10115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 WebString::fromUTF8("off"));
10125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate the user changing the username to some known username.
10145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateUsernameChange(kAliceUsername, true);
10155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExpectNoSuggestionsPopup();
10175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Regression test for http://crbug.com/326679
10205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
10215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       SelectUnknownUsernameWithPasswordAutofillOff) {
10225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info.
10235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
10245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Set the main password element to autocomplete='off'
10265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  password_element_.setAttribute(WebString::fromUTF8("autocomplete"),
10275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 WebString::fromUTF8("off"));
10285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the user changing the username to some unknown username.
10305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateUsernameChange("foo", true);
10315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ExpectNoSuggestionsPopup();
10335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that password autofill triggers onChange events in JavaScript for
10365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// forms that are filled on page load.
10375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
10385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       PasswordAutofillTriggersOnChangeEventsOnLoad) {
10395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html = std::string(kFormHTML) + kOnChangeDetectionScript;
10405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LoadHTML(html.c_str());
10415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateOriginForHTML(html);
10425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateUsernameAndPasswordElements();
10435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
10455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // autocomplete.
10465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The username and password should have been autocompleted...
10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // ... but since there hasn't been a user gesture yet, the autocompleted
10515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // password should only be visible to the user.
10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, std::string(), true);
10535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // A JavaScript onChange event should have been triggered for the username,
10555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // but not yet for the password.
10565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int username_onchange_called = -1;
10575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int password_onchange_called = -1;
10585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavaScriptAndReturnIntValue(
10605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ASCIIToUTF16("usernameOnchangeCalled ? 1 : 0"),
10615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &username_onchange_called));
10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, username_onchange_called);
10635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
10645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavaScriptAndReturnIntValue(
10655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ASCIIToUTF16("passwordOnchangeCalled ? 1 : 0"),
10665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &password_onchange_called));
10675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(isherman): Re-enable this check once http://crbug.com/333144 is fixed.
10685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // EXPECT_EQ(0, password_onchange_called);
10695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate a user click so that the password field's real value is filled.
10715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateElementClick(kUsernameName);
10725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
10735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Now, a JavaScript onChange event should have been triggered for the
10755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // password as well.
10765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
10775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavaScriptAndReturnIntValue(
10785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ASCIIToUTF16("passwordOnchangeCalled ? 1 : 0"),
10795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &password_onchange_called));
10805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, password_onchange_called);
10815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
10825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Verifies that password autofill triggers onChange events in JavaScript for
10845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// forms that are filled after page load.
10855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
10865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)       PasswordAutofillTriggersOnChangeEventsWaitForUsername) {
10875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string html = std::string(kFormHTML) + kOnChangeDetectionScript;
10885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  LoadHTML(html.c_str());
10895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateOriginForHTML(html);
10905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  UpdateUsernameAndPasswordElements();
10915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate the browser sending back the login info, it triggers the
10935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // autocomplete.
10945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  fill_data_.wait_for_username = true;
10955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
10975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The username and password should not yet have been autocompleted.
10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsState(std::string(), false, std::string(), false);
10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Simulate a click just to force a user gesture, since the username value is
11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // set directly.
11025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SimulateElementClick(kUsernameName);
11035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate the user entering her username and selecting the matching autofill
1105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // from the dropdown.
1106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateUsernameChange(kAliceUsername, true, true);
1107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateSuggestionChoice(username_element_);
11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The username and password should now have been autocompleted.
11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // JavaScript onChange events should have been triggered both for the username
11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // and for the password.
11145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int username_onchange_called = -1;
11155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int password_onchange_called = -1;
11165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
11175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavaScriptAndReturnIntValue(
11185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ASCIIToUTF16("usernameOnchangeCalled ? 1 : 0"),
11195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &username_onchange_called));
11205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, username_onchange_called);
11215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ASSERT_TRUE(
11225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ExecuteJavaScriptAndReturnIntValue(
11235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ASCIIToUTF16("passwordOnchangeCalled ? 1 : 0"),
11245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          &password_onchange_called));
11255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(1, password_onchange_called);
11265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
11275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |FillSuggestion| properly fills the username and password.
1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, FillSuggestion) {
11305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Simulate the browser sending the login info, but set |wait_for_username|
11315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // to prevent the form from being immediately filled.
11325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  fill_data_.wait_for_username = true;
11335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SimulateOnFillPasswordForm(fill_data_);
11345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
11355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Neither field should have been autocompleted.
11365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckTextFieldsDOMState(std::string(), false, std::string(), false);
11375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
11385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // If the password field is not autocompletable, it should not be affected.
11395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetElementReadOnly(password_element_, true);
11401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(password_autofill_agent_->FillSuggestion(
11415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      username_element_, kAliceUsername, kAlicePassword));
11425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckTextFieldsDOMState(std::string(), false, std::string(), false);
11435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SetElementReadOnly(password_element_, false);
11445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // After filling with the suggestion, both fields should be autocompleted.
11461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->FillSuggestion(
11475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      username_element_, kAliceUsername, kAlicePassword));
11485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  int username_length = strlen(kAliceUsername);
1150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckUsernameSelection(username_length, username_length);
11515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Try Filling with a suggestion with password different from the one that was
11535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // initially sent to the renderer.
11541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->FillSuggestion(
11555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      username_element_, kBobUsername, kCarolPassword));
11565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  CheckTextFieldsDOMState(kBobUsername, true, kCarolPassword, true);
1157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  username_length = strlen(kBobUsername);
1158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  CheckUsernameSelection(username_length, username_length);
11595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
11605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |PreviewSuggestion| properly previews the username and password.
1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, PreviewSuggestion) {
1163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Neither field should have been autocompleted.
1169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState(std::string(), false, std::string(), false);
1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // If the password field is not autocompletable, it should not be affected.
1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetElementReadOnly(password_element_, true);
11731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_FALSE(password_autofill_agent_->PreviewSuggestion(
1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string(), username_element_.suggestedValue().utf8());
1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(username_element_.isAutofilled());
1177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(std::string(), password_element_.suggestedValue().utf8());
1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(password_element_.isAutofilled());
1179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetElementReadOnly(password_element_, false);
1180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // After selecting the suggestion, both fields should be previewed
1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // with suggested values.
11831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kAliceUsername,
1187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(username_element_.suggestedValue().utf8()));
1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kAlicePassword,
1191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(password_element_.suggestedValue().utf8()));
1192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int username_length = strlen(kAliceUsername);
1194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(0, username_length);
1195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Try previewing with a password different from the one that was initially
1197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // sent to the renderer.
11981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kBobUsername, kCarolPassword));
1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kBobUsername,
1202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(username_element_.suggestedValue().utf8()));
1203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kCarolPassword,
1206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(password_element_.suggestedValue().utf8()));
1207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_length = strlen(kBobUsername);
1209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(0, username_length);
1210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |PreviewSuggestion| properly sets the username selection range.
1213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, PreviewSuggestionSelectionRange) {
1214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setValue(WebString::fromUTF8("ali"));
1215116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  username_element_.setSelectionRange(3, 3);
1216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setAutofilled(true);
1217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState("ali", true, std::string(), false);
1219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kAliceUsername,
1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(username_element_.suggestedValue().utf8()));
1230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      kAlicePassword,
1233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(password_element_.suggestedValue().utf8()));
1234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  int username_length = strlen(kAliceUsername);
1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(3, username_length);
1237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |ClearPreview| properly clears previewed username and password
1240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// with password being previously autofilled.
1241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, ClearPreviewWithPasswordAutofilled) {
1242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_element_.setValue(WebString::fromUTF8("sec"));
1243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_element_.setAutofilled(true);
1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState(std::string(), false, "sec", true);
1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
12561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->DidClearAutofillSelection(username_element_));
1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.value().isEmpty());
1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(username_element_.isAutofilled());
1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("sec"), password_element_.value());
1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(0, 0);
1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |ClearPreview| properly clears previewed username and password
1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// with username being previously autofilled.
1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, ClearPreviewWithUsernameAutofilled) {
1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setValue(WebString::fromUTF8("ali"));
1271116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  username_element_.setSelectionRange(3, 3);
1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setAutofilled(true);
1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState("ali", true, std::string(), false);
1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
12851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->DidClearAutofillSelection(username_element_));
1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("ali"), username_element_.value());
1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.value().isEmpty());
1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(password_element_.isAutofilled());
1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(3, 3);
1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |ClearPreview| properly clears previewed username and password
1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// with username and password being previously autofilled.
1298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
1299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ClearPreviewWithAutofilledUsernameAndPassword) {
1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setValue(WebString::fromUTF8("ali"));
1301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  username_element_.setSelectionRange(3, 3);
1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  username_element_.setAutofilled(true);
1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_element_.setValue(WebString::fromUTF8("sec"));
1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  password_element_.setAutofilled(true);
1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState("ali", true, "sec", true);
1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
13171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->DidClearAutofillSelection(username_element_));
1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("ali"), username_element_.value());
1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(ASCIIToUTF16("sec"), password_element_.value());
1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(3, 3);
1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |ClearPreview| properly clears previewed username and password
1329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// with neither username nor password being previously autofilled.
1330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
1331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ClearPreviewWithNotAutofilledUsernameAndPassword) {
1332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending the login info, but set |wait_for_username|
1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to prevent the form from being immediately filled.
1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  fill_data_.wait_for_username = true;
1335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsDOMState(std::string(), false, std::string(), false);
1338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, kAliceUsername, kAlicePassword));
1341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
13431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->DidClearAutofillSelection(username_element_));
1344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.value().isEmpty());
1346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(username_element_.isAutofilled());
1348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.value().isEmpty());
1349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(password_element_.isAutofilled());
1351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(0, 0);
1352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that |ClearPreview| properly restores the original selection range of
1355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// username field that has initially been filled by inline autocomplete.
1356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, ClearPreviewWithInlineAutocompletedUsername) {
1357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the browser sending back the login info.
1358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateOnFillPasswordForm(fill_data_);
1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Clear the text fields to start fresh.
1361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ClearUsernameAndPasswordFields();
1362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Simulate the user typing in the first letter of 'alice', a stored username.
1364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SimulateUsernameChange("a", true);
1365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Both the username and password text fields should reflect selection of the
1366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // stored login.
1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckTextFieldsState(kAliceUsername, true, kAlicePassword, true);
1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The selection should have been set to 'lice', the last 4 letters.
1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(1, 5);
1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(password_autofill_agent_->PreviewSuggestion(
1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      username_element_, "alicia", "secret"));
1373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "alicia",
1375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(username_element_.suggestedValue().utf8()));
1376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
1378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      "secret",
1379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      static_cast<std::string>(password_element_.suggestedValue().utf8()));
1380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(1, 6);
1382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(
13841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      password_autofill_agent_->DidClearAutofillSelection(username_element_));
1385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kAliceUsername, username_element_.value().utf8());
1387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.suggestedValue().isEmpty());
1388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(username_element_.isAutofilled());
1389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.value().isEmpty());
1390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.suggestedValue().isEmpty());
1391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(password_element_.isAutofilled());
1392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CheckUsernameSelection(1, 5);
1393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
1394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Tests that logging is off by default.
13965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_NoMessage) {
13975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  render_thread_->sink().ClearMessages();
13985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendVisiblePasswordForms();
13995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
14005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AutofillHostMsg_RecordSavePasswordProgress::ID);
14015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(message);
14025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
14035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Test that logging can be turned on by a message.
14055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_Activated) {
14065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Turn the logging on.
14076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AutofillMsg_SetLoggingState msg_activate(0, true);
14085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Up-cast to access OnMessageReceived, which is private in the agent.
14091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(static_cast<IPC::Listener*>(password_autofill_agent_)
14105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                  ->OnMessageReceived(msg_activate));
14115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  render_thread_->sink().ClearMessages();
14135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendVisiblePasswordForms();
14145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
14155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AutofillHostMsg_RecordSavePasswordProgress::ID);
14165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_TRUE(message);
14175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
14185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Test that logging can be turned off by a message.
14205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuTEST_F(PasswordAutofillAgentTest, OnChangeLoggingState_Deactivated) {
14215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Turn the logging on and then off.
14226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AutofillMsg_SetLoggingState msg_activate(0, /*active=*/true);
14235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Up-cast to access OnMessageReceived, which is private in the agent.
14241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(static_cast<IPC::Listener*>(password_autofill_agent_)
14255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                  ->OnMessageReceived(msg_activate));
14266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  AutofillMsg_SetLoggingState msg_deactivate(0, /*active=*/false);
14271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_TRUE(static_cast<IPC::Listener*>(password_autofill_agent_)
14285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                  ->OnMessageReceived(msg_deactivate));
14295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  render_thread_->sink().ClearMessages();
14315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  SendVisiblePasswordForms();
14325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
14335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      AutofillHostMsg_RecordSavePasswordProgress::ID);
14345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_FALSE(message);
14355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
14365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
14376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Test that the agent sends an IPC call to get the current activity state of
14386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// password saving logging soon after construction.
14396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_F(PasswordAutofillAgentTest, SendsLoggingStateUpdatePingOnConstruction) {
14406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  const IPC::Message* message = render_thread_->sink().GetFirstMessageMatching(
14416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      AutofillHostMsg_PasswordAutofillAgentConstructed::ID);
14426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_TRUE(message);
14436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
14446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
14455b892326406927b709cdaf6c384d4ababf456332Ben Murdoch// TODO(gcasto): Re-enabled these tests after crbug.com/423464 has been fixed.
14465b892326406927b709cdaf6c384d4ababf456332Ben Murdoch#if !defined(OS_ANDROID)
14475b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
1448116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests that one user click on a username field is sufficient to bring up a
1449116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// credential suggestion popup, and the user can autocomplete the password by
1450116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// selecting the credential from the popup.
1451116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PasswordAutofillAgentTest, ClickAndSelect) {
1452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // SimulateElementClick() is called so that a user gesture is actually made
1453116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // and the password can be filled. However, SimulateElementClick() does not
1454116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // actually lead to the AutofillAgent's InputElementClicked() method being
1455116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // called, so SimulateSuggestionChoice has to manually call
1456116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // InputElementClicked().
1457116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ClearUsernameAndPasswordFields();
1458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateOnFillPasswordForm(fill_data_);
1459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateElementClick(kUsernameName);
1460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateSuggestionChoice(username_element_);
1461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectAllCredentials();
1462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
1464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Tests the autosuggestions that are given when the element is clicked.
1467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Specifically, tests when the user clicks on the username element after page
1468116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// load and the element is autofilled, when the user clicks on an element that
1469116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// has a non-matching username, and when the user clicks on an element that's
1470116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// already been autofilled and they've already modified.
1471116680a4aac90f2aa7413d9095a592090648e557Ben MurdochTEST_F(PasswordAutofillAgentTest, CredentialsOnClick) {
1472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate the browser sending back the login info.
1473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateOnFillPasswordForm(fill_data_);
1474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Clear the text fields to start fresh.
1476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ClearUsernameAndPasswordFields();
1477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Call SimulateElementClick() to produce a user gesture on the page so
1479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // autofill will actually fill.
1480116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateElementClick(kUsernameName);
1481116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1482116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Simulate a user clicking on the username element. This should produce a
1483116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // message with all the usernames.
1484116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  render_thread_->sink().ClearMessages();
14851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<PageClickListener*>(autofill_agent_)
14861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->FormControlElementClicked(username_element_, false);
1487116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectAllCredentials();
1488116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1489116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Now simulate a user typing in an unrecognized username and then
1490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // clicking on the username element. This should also produce a message with
1491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // all the usernames.
1492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateUsernameChange("baz", true);
1493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  render_thread_->sink().ClearMessages();
14941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<PageClickListener*>(autofill_agent_)
14951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->FormControlElementClicked(username_element_, true);
1496116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectAllCredentials();
1497116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1498116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Now simulate a user typing in the first letter of the username and then
1499116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // clicking on the username element. While the typing of the first letter will
1500116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // inline autocomplete, clicking on the element should still produce a full
1501116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // suggestion list.
1502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  SimulateUsernameChange("a", true);
1503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  render_thread_->sink().ClearMessages();
15041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<PageClickListener*>(autofill_agent_)
15051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ->FormControlElementClicked(username_element_, true);
1506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExpectAllCredentials();
1507116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
1508116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
15095b892326406927b709cdaf6c384d4ababf456332Ben Murdoch#endif  // !defined(OS_ANDROID)
15105b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
15115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The user types in a password, but then just before sending the form off, a
15125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// script clears that password. This test checks that PasswordAutofillAgent can
15135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// still remember the password typed by the user.
15145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
15155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       RememberLastNonEmptyPasswordOnSubmit_ScriptCleared) {
15161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "temp", true, GetMainFrame(), username_element_, true);
15181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "random", true, GetMainFrame(), password_element_, true);
15205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Simulate that the password value was cleared by the site's JavaScript
15225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // before submit.
15235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  password_element_.setValue(WebString());
15241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<content::RenderViewObserver*>(password_autofill_agent_)
15255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ->WillSubmitForm(GetMainFrame(), username_element_.form());
15265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Observe that the PasswordAutofillAgent still remembered the last non-empty
15285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // password and sent that to the browser.
15295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectFormSubmittedWithPasswords("random", "");
15305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but this time
15335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// it's the user who clears the password. This test checks that in that case,
15345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// the last non-empty password is not remembered.
15355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
15365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       RememberLastNonEmptyPasswordOnSubmit_UserCleared) {
15371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "temp", true, GetMainFrame(), username_element_, true);
15391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "random", true, GetMainFrame(), password_element_, true);
15415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Simulate that the user actually cleared the password again.
15431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "", true, GetMainFrame(), password_element_, true);
15451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<content::RenderViewObserver*>(password_autofill_agent_)
15465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ->WillSubmitForm(GetMainFrame(), username_element_.form());
15475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Observe that the PasswordAutofillAgent respects the user having cleared the
15495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // password.
15505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectFormSubmittedWithPasswords("", "");
15515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Similar to RememberLastNonEmptyPasswordOnSubmit_ScriptCleared, but uses the
15545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// new password instead of the current password.
15555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(PasswordAutofillAgentTest,
15565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       RememberLastNonEmptyPasswordOnSubmit_NewPassword) {
15575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const char kNewPasswordFormHTML[] =
15585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "<FORM name='LoginTestForm'>"
15595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  <INPUT type='text' id='username' autocomplete='username'/>"
15605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  <INPUT type='password' id='password' autocomplete='new-password'/>"
15615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "  <INPUT type='submit' value='Login'/>"
15625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "</FORM>";
15635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  LoadHTML(kNewPasswordFormHTML);
15645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  UpdateUsernameAndPasswordElements();
15655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "temp", true, GetMainFrame(), username_element_, true);
15681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(
15695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "random", true, GetMainFrame(), password_element_, true);
15705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Simulate that the password value was cleared by the site's JavaScript
15725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // before submit.
15735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  password_element_.setValue(WebString());
15741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static_cast<content::RenderViewObserver*>(password_autofill_agent_)
15755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ->WillSubmitForm(GetMainFrame(), username_element_.form());
15765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Observe that the PasswordAutofillAgent still remembered the last non-empty
15785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // password and sent that to the browser.
15795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ExpectFormSubmittedWithPasswords("", "random");
15805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
15815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
15821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The user first accepts a suggestion, but then overwrites the password. This
15831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// test checks that the overwritten password is not reverted back if the user
15841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// triggers autofill through focusing (but not changing) the username again.
15851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PasswordAutofillAgentTest,
15861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       NoopEditingDoesNotOverwriteManuallyEditedPassword) {
15871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate having credentials which needed to wait until the user starts
15881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // typing the username to be filled (e.g., PSL-matched credentials). Those are
15891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the ones which can be filled as a result of TextFieldDidEndEditing.
15901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  fill_data_.wait_for_username = true;
15911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateOnFillPasswordForm(fill_data_);
15921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate that the user typed her name to make the autofill work.
15931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(kAliceUsername,
15941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*move_caret_to_end=*/true,
15951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                GetMainFrame(),
15961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                username_element_,
15971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*is_user_input=*/true);
15981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDidEndEditing(GetMainFrame(), username_element_);
15991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string old_username(username_element_.value().utf8());
16001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string old_password(password_element_.value().utf8());
16011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const std::string new_password(old_password + "modify");
16021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The user changes the password.
16041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement(new_password,
16051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*move_caret_to_end=*/true,
16061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                GetMainFrame(),
16071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                password_element_,
16081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*is_user_input=*/true);
16091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The user switches back into the username field, but leaves that without
16111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // changes.
16121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateDidEndEditing(GetMainFrame(), username_element_);
16131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The password should have stayed as the user changed it.
16151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckTextFieldsDOMState(old_username, true, new_password, false);
16161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The password should not have a suggested value.
16171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckTextFieldsState(old_username, true, std::string(), false);
16181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(PasswordAutofillAgentTest,
16211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci       InlineAutocompleteOverwritesManuallyEditedPassword) {
16221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate the browser sending back the login info.
16231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateOnFillPasswordForm(fill_data_);
16241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ClearUsernameAndPasswordFields();
16261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The user enters a password
16281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateInputChangeForElement("someOtherPassword",
16291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*move_caret_to_end=*/true,
16301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                GetMainFrame(),
16311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                password_element_,
16321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                /*is_user_input=*/true);
16331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Simulate the user typing a stored username.
16351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SimulateUsernameChange(kAliceUsername, true);
16361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The autofileld password should replace the typed one.
16371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CheckTextFieldsDOMState(kAliceUsername, true, kAlicePassword, true);
16381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
16391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace autofill
1641