1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved. 2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file. 4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "components/autofill/core/common/password_form_fill_data.h" 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/utf_string_conversions.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "components/autofill/core/common/password_form.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gmock/include/gmock/gmock.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace autofill { 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the when there is a single preferred match, and no extra 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// matches, the PasswordFormFillData is filled in correctly. 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(PasswordFormFillDataTest, TestSinglePreferredMatch) { 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the current form on the page. 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm form_on_page; 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.origin = GURL("https://foo.com/"); 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.action = GURL("https://foo.com/login"); 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.username_element = ASCIIToUTF16("username"); 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.username_value = ASCIIToUTF16("test@gmail.com"); 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.password_element = ASCIIToUTF16("password"); 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.password_value = ASCIIToUTF16("test"); 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.submit_element = ASCIIToUTF16(""); 28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.signon_realm = "https://foo.com/"; 29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.ssl_valid = true; 30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.preferred = false; 31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.scheme = PasswordForm::SCHEME_HTML; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create an exact match in the database. 34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm preferred_match; 35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.origin = GURL("https://foo.com/"); 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.action = GURL("https://foo.com/login"); 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.username_element = ASCIIToUTF16("username"); 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.username_value = ASCIIToUTF16("test@gmail.com"); 39eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.password_element = ASCIIToUTF16("password"); 40eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.password_value = ASCIIToUTF16("test"); 41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.submit_element = ASCIIToUTF16(""); 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.signon_realm = "https://foo.com/"; 43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.ssl_valid = true; 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.preferred = true; 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.scheme = PasswordForm::SCHEME_HTML; 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormMap matches; 48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormFillData result; 50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitPasswordFormFillData(form_on_page, 51eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch matches, 52eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &preferred_match, 53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch true, 54eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 55eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &result); 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |wait_for_username| should reflect the |wait_for_username_before_autofill| 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // argument of InitPasswordFormFillData which in this case is true. 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(result.wait_for_username); 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The preferred realm should be empty since it's the same as the realm of 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // the form. 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(result.preferred_realm, ""); 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormFillData result2; 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitPasswordFormFillData(form_on_page, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch matches, 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &preferred_match, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &result2); 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |wait_for_username| should reflect the |wait_for_username_before_autofill| 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // argument of InitPasswordFormFillData which in this case is false. 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_FALSE(result2.wait_for_username); 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Tests that the InitPasswordFormFillData behaves correctly when there is a 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// preferred match that was found using public suffix matching, an additional 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// result that also used public suffix matching, and a third result that was 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found without using public suffix matching. 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(PasswordFormFillDataTest, TestPublicSuffixDomainMatching) { 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create the current form on the page. 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm form_on_page; 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.origin = GURL("https://foo.com/"); 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.action = GURL("https://foo.com/login"); 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.username_element = ASCIIToUTF16("username"); 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.username_value = ASCIIToUTF16("test@gmail.com"); 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.password_element = ASCIIToUTF16("password"); 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.password_value = ASCIIToUTF16("test"); 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.submit_element = ASCIIToUTF16(""); 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.signon_realm = "https://foo.com/"; 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.ssl_valid = true; 93eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.preferred = false; 94eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch form_on_page.scheme = PasswordForm::SCHEME_HTML; 95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a match from the database that matches using public suffix. 97eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm preferred_match; 98eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.origin = GURL("https://mobile.foo.com/"); 99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.action = GURL("https://mobile.foo.com/login"); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.username_element = ASCIIToUTF16("username"); 101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.username_value = ASCIIToUTF16("test@gmail.com"); 102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.password_element = ASCIIToUTF16("password"); 103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.password_value = ASCIIToUTF16("test"); 104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.submit_element = ASCIIToUTF16(""); 105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.signon_realm = "https://mobile.foo.com/"; 106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.original_signon_realm = "https://foo.com/"; 107eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.ssl_valid = true; 108eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.preferred = true; 109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.scheme = PasswordForm::SCHEME_HTML; 110eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a match that matches exactly, so |original_signon_realm| is not set. 112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm exact_match; 113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.origin = GURL("https://foo.com/"); 114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.action = GURL("https://foo.com/login"); 115eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.username_element = ASCIIToUTF16("username"); 116eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.username_value = ASCIIToUTF16("test1@gmail.com"); 117eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.password_element = ASCIIToUTF16("password"); 118eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.password_value = ASCIIToUTF16("test"); 119eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.submit_element = ASCIIToUTF16(""); 120eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.signon_realm = "https://foo.com/"; 121eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.ssl_valid = true; 122eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.preferred = false; 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch exact_match.scheme = PasswordForm::SCHEME_HTML; 124eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 125eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Create a match that was matched using public suffix, so 126eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // |original_signon_realm| is set to where the result came from. 127eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordForm public_suffix_match; 128eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.origin = GURL("https://foo.com/"); 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.action = GURL("https://foo.com/login"); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.username_element = ASCIIToUTF16("username"); 131eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.username_value = ASCIIToUTF16("test2@gmail.com"); 132eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.password_element = ASCIIToUTF16("password"); 133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.password_value = ASCIIToUTF16("test"); 134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.submit_element = ASCIIToUTF16(""); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public_suffix_match.original_signon_realm = "https://subdomain.foo.com/"; 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.signon_realm = "https://foo.com/"; 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.ssl_valid = true; 138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.preferred = false; 139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public_suffix_match.scheme = PasswordForm::SCHEME_HTML; 140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 141eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Add one exact match and one public suffix match. 142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormMap matches; 143eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch matches[exact_match.username_value] = &exact_match; 144eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch matches[public_suffix_match.username_value] = &public_suffix_match; 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormFillData result; 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch InitPasswordFormFillData(form_on_page, 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch matches, 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &preferred_match, 150eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch true, 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch false, 152eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch &result); 153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_TRUE(result.wait_for_username); 154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The preferred realm should match the original signon realm from the 155eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // preferred match so the user can see where the result came from. 156eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EXPECT_EQ(result.preferred_realm, 157eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch preferred_match.original_signon_realm); 158eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // The realm of the exact match should be empty. 160eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PasswordFormFillData::LoginCollection::const_iterator iter = 161eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch result.additional_logins.find(exact_match.username_value); 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(iter->second.realm, ""); 163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // The realm of the public suffix match should be set to the original signon 165eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // realm so the user can see where the result came from. 166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch iter = result.additional_logins.find(public_suffix_match.username_value); 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(iter->second.realm, public_suffix_match.original_signon_realm); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace autofill 171