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, ¶m); 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, ¶m); 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, ¶m); 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