blob: 44aafe59e7571a9422979f8ae76491e928c54b03 [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/autofill/core/common/password_form_fill_data.h"
#include <map>
#include <memory>
#include <utility>
#include "base/strings/string16.h"
#include "base/strings/utf_string_conversions.h"
#include "components/autofill/core/common/password_form.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::ASCIIToUTF16;
namespace autofill {
// Tests that the when there is a single preferred match, and no extra
// matches, the PasswordFormFillData is filled in correctly.
TEST(PasswordFormFillDataTest, TestSinglePreferredMatch) {
// Create the current form on the page.
PasswordForm form_on_page;
form_on_page.origin = GURL("https://foo.com/");
form_on_page.action = GURL("https://foo.com/login");
form_on_page.username_element = ASCIIToUTF16("username");
form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
form_on_page.password_element = ASCIIToUTF16("password");
form_on_page.password_value = ASCIIToUTF16("test");
form_on_page.submit_element = ASCIIToUTF16("");
form_on_page.signon_realm = "https://foo.com/";
form_on_page.preferred = false;
form_on_page.scheme = PasswordForm::SCHEME_HTML;
// Create an exact match in the database.
PasswordForm preferred_match;
preferred_match.origin = GURL("https://foo.com/");
preferred_match.action = GURL("https://foo.com/login");
preferred_match.username_element = ASCIIToUTF16("username");
preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
preferred_match.password_element = ASCIIToUTF16("password");
preferred_match.password_value = ASCIIToUTF16("test");
preferred_match.submit_element = ASCIIToUTF16("");
preferred_match.signon_realm = "https://foo.com/";
preferred_match.preferred = true;
preferred_match.scheme = PasswordForm::SCHEME_HTML;
std::map<base::string16, const PasswordForm*> matches;
PasswordFormFillData result;
InitPasswordFormFillData(form_on_page,
matches,
&preferred_match,
true,
&result);
// |wait_for_username| should reflect the |wait_for_username_before_autofill|
// argument of InitPasswordFormFillData which in this case is true.
EXPECT_TRUE(result.wait_for_username);
// The preferred realm should be empty since it's the same as the realm of
// the form.
EXPECT_EQ(std::string(), result.preferred_realm);
PasswordFormFillData result2;
InitPasswordFormFillData(form_on_page,
matches,
&preferred_match,
false,
&result2);
// |wait_for_username| should reflect the |wait_for_username_before_autofill|
// argument of InitPasswordFormFillData which in this case is false.
EXPECT_FALSE(result2.wait_for_username);
}
// Tests that the InitPasswordFormFillData behaves correctly when there is a
// preferred match that was found using public suffix matching, an additional
// result that also used public suffix matching, and a third result that was
// found without using public suffix matching.
TEST(PasswordFormFillDataTest, TestPublicSuffixDomainMatching) {
// Create the current form on the page.
PasswordForm form_on_page;
form_on_page.origin = GURL("https://foo.com/");
form_on_page.action = GURL("https://foo.com/login");
form_on_page.username_element = ASCIIToUTF16("username");
form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
form_on_page.password_element = ASCIIToUTF16("password");
form_on_page.password_value = ASCIIToUTF16("test");
form_on_page.submit_element = ASCIIToUTF16("");
form_on_page.signon_realm = "https://foo.com/";
form_on_page.preferred = false;
form_on_page.scheme = PasswordForm::SCHEME_HTML;
// Create a match from the database that matches using public suffix.
PasswordForm preferred_match;
preferred_match.origin = GURL("https://mobile.foo.com/");
preferred_match.action = GURL("https://mobile.foo.com/login");
preferred_match.username_element = ASCIIToUTF16("username");
preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
preferred_match.password_element = ASCIIToUTF16("password");
preferred_match.password_value = ASCIIToUTF16("test");
preferred_match.submit_element = ASCIIToUTF16("");
preferred_match.signon_realm = "https://foo.com/";
preferred_match.is_public_suffix_match = true;
preferred_match.preferred = true;
preferred_match.scheme = PasswordForm::SCHEME_HTML;
// Create a match that matches exactly, so |is_public_suffix_match| has a
// default value false.
PasswordForm exact_match;
exact_match.origin = GURL("https://foo.com/");
exact_match.action = GURL("https://foo.com/login");
exact_match.username_element = ASCIIToUTF16("username");
exact_match.username_value = ASCIIToUTF16("test1@gmail.com");
exact_match.password_element = ASCIIToUTF16("password");
exact_match.password_value = ASCIIToUTF16("test");
exact_match.submit_element = ASCIIToUTF16("");
exact_match.signon_realm = "https://foo.com/";
exact_match.preferred = false;
exact_match.scheme = PasswordForm::SCHEME_HTML;
// Create a match that was matched using public suffix, so
// |is_public_suffix_match| == true.
PasswordForm public_suffix_match;
public_suffix_match.origin = GURL("https://foo.com/");
public_suffix_match.action = GURL("https://foo.com/login");
public_suffix_match.username_element = ASCIIToUTF16("username");
public_suffix_match.username_value = ASCIIToUTF16("test2@gmail.com");
public_suffix_match.password_element = ASCIIToUTF16("password");
public_suffix_match.password_value = ASCIIToUTF16("test");
public_suffix_match.submit_element = ASCIIToUTF16("");
public_suffix_match.is_public_suffix_match = true;
public_suffix_match.signon_realm = "https://foo.com/";
public_suffix_match.preferred = false;
public_suffix_match.scheme = PasswordForm::SCHEME_HTML;
// Add one exact match and one public suffix match.
std::map<base::string16, const PasswordForm*> matches;
matches.insert(std::make_pair(exact_match.username_value, &exact_match));
matches.insert(
std::make_pair(public_suffix_match.username_value, &public_suffix_match));
PasswordFormFillData result;
InitPasswordFormFillData(form_on_page,
matches,
&preferred_match,
true,
&result);
EXPECT_TRUE(result.wait_for_username);
// The preferred realm should match the signon realm from the
// preferred match so the user can see where the result came from.
EXPECT_EQ(preferred_match.signon_realm, result.preferred_realm);
// The realm of the exact match should be empty.
PasswordFormFillData::LoginCollection::const_iterator iter =
result.additional_logins.find(exact_match.username_value);
EXPECT_EQ(std::string(), iter->second.realm);
// The realm of the public suffix match should be set to the original signon
// realm so the user can see where the result came from.
iter = result.additional_logins.find(public_suffix_match.username_value);
EXPECT_EQ(iter->second.realm, public_suffix_match.signon_realm);
}
// Tests that the InitPasswordFormFillData behaves correctly when there is a
// preferred match that was found using affiliation based matching, an
// additional result that also used affiliation based matching, and a third
// result that was found without using affiliation based matching.
TEST(PasswordFormFillDataTest, TestAffiliationMatch) {
// Create the current form on the page.
PasswordForm form_on_page;
form_on_page.origin = GURL("https://foo.com/");
form_on_page.action = GURL("https://foo.com/login");
form_on_page.username_element = ASCIIToUTF16("username");
form_on_page.username_value = ASCIIToUTF16("test@gmail.com");
form_on_page.password_element = ASCIIToUTF16("password");
form_on_page.password_value = ASCIIToUTF16("test");
form_on_page.submit_element = ASCIIToUTF16("");
form_on_page.signon_realm = "https://foo.com/";
form_on_page.preferred = false;
form_on_page.scheme = PasswordForm::SCHEME_HTML;
// Create a match from the database that matches using affiliation.
PasswordForm preferred_match;
preferred_match.origin = GURL("android://hash@foo.com/");
preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
preferred_match.password_value = ASCIIToUTF16("test");
preferred_match.signon_realm = "android://hash@foo.com/";
preferred_match.is_affiliation_based_match = true;
preferred_match.preferred = true;
// Create a match that matches exactly, so |is_affiliation_based_match| has a
// default value false.
PasswordForm exact_match;
exact_match.origin = GURL("https://foo.com/");
exact_match.action = GURL("https://foo.com/login");
exact_match.username_element = ASCIIToUTF16("username");
exact_match.username_value = ASCIIToUTF16("test1@gmail.com");
exact_match.password_element = ASCIIToUTF16("password");
exact_match.password_value = ASCIIToUTF16("test");
exact_match.submit_element = ASCIIToUTF16("");
exact_match.signon_realm = "https://foo.com/";
exact_match.preferred = false;
exact_match.scheme = PasswordForm::SCHEME_HTML;
// Create a match that was matched using public suffix, so
// |is_public_suffix_match| == true.
PasswordForm affiliated_match;
affiliated_match.origin = GURL("android://hash@foo1.com/");
affiliated_match.username_value = ASCIIToUTF16("test2@gmail.com");
affiliated_match.password_value = ASCIIToUTF16("test");
affiliated_match.is_affiliation_based_match = true;
affiliated_match.signon_realm = "https://foo1.com/";
affiliated_match.preferred = false;
affiliated_match.scheme = PasswordForm::SCHEME_HTML;
// Add one exact match and one affiliation based match.
std::map<base::string16, const PasswordForm*> matches;
matches.insert(std::make_pair(exact_match.username_value, &exact_match));
matches.insert(
std::make_pair(affiliated_match.username_value, &affiliated_match));
PasswordFormFillData result;
InitPasswordFormFillData(form_on_page, matches, &preferred_match, false,
&result);
EXPECT_FALSE(result.wait_for_username);
// The preferred realm should match the signon realm from the
// preferred match so the user can see where the result came from.
EXPECT_EQ(preferred_match.signon_realm, result.preferred_realm);
// The realm of the exact match should be empty.
PasswordFormFillData::LoginCollection::const_iterator iter =
result.additional_logins.find(exact_match.username_value);
EXPECT_EQ(std::string(), iter->second.realm);
// The realm of the affiliation based match should be set to the original
// signon realm so the user can see where the result came from.
iter = result.additional_logins.find(affiliated_match.username_value);
EXPECT_EQ(iter->second.realm, affiliated_match.signon_realm);
}
// Tests that renderer ids are passed correctly.
TEST(PasswordFormFillDataTest, RendererIDs) {
// Create the current form on the page.
PasswordForm form_on_page;
form_on_page.origin = GURL("https://foo.com/");
form_on_page.action = GURL("https://foo.com/login");
form_on_page.username_element = ASCIIToUTF16("username");
form_on_page.password_element = ASCIIToUTF16("password");
// Create an exact match in the database.
PasswordForm preferred_match = form_on_page;
preferred_match.username_value = ASCIIToUTF16("test@gmail.com");
preferred_match.password_value = ASCIIToUTF16("test");
preferred_match.preferred = true;
// Set renderer id related fields.
FormData form_data;
form_data.unique_renderer_id = 42;
form_data.is_form_tag = true;
form_on_page.form_data = form_data;
form_on_page.has_renderer_ids = true;
form_on_page.username_element_renderer_id = 123;
form_on_page.password_element_renderer_id = 456;
std::map<base::string16, const PasswordForm*> matches;
PasswordFormFillData result;
InitPasswordFormFillData(form_on_page, matches, &preferred_match, true,
&result);
EXPECT_EQ(form_data.unique_renderer_id, result.form_renderer_id);
EXPECT_EQ(form_on_page.has_renderer_ids, result.has_renderer_ids);
EXPECT_EQ(form_on_page.username_element_renderer_id,
result.username_field.unique_renderer_id);
EXPECT_EQ(form_on_page.password_element_renderer_id,
result.password_field.unique_renderer_id);
}
} // namespace autofill