blob: 8d9ddb4eb0b1d157f73d0900858c7989c38c458c [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webauthn/context_menu_helper.h"
#include <cstdint>
#include "base/test/task_environment.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "components/autofill/content/browser/content_autofill_driver.h"
#include "components/autofill/content/browser/test_autofill_client_injector.h"
#include "components/autofill/content/browser/test_autofill_driver_injector.h"
#include "components/autofill/content/browser/test_autofill_manager_injector.h"
#include "components/autofill/content/browser/test_content_autofill_client.h"
#include "components/autofill/content/browser/test_content_autofill_driver.h"
#include "components/autofill/core/browser/form_structure.h"
#include "components/autofill/core/browser/foundations/autofill_driver.h"
#include "components/autofill/core/browser/foundations/autofill_manager.h"
#include "components/autofill/core/browser/foundations/browser_autofill_manager.h"
#include "components/autofill/core/browser/foundations/test_autofill_manager_waiter.h"
#include "components/autofill/core/browser/foundations/test_browser_autofill_manager.h"
#include "components/autofill/core/common/autofill_test_utils.h"
#include "components/autofill/core/common/form_data.h"
#include "components/autofill/core/common/form_field_data.h"
#include "components/autofill/core/common/unique_ids.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
using webauthn::IsPasskeyFromAnotherDeviceContextMenuEnabled;
constexpr uint64_t kFormRendererId = 1;
constexpr uint64_t kFieldRendererId = 1;
class MockBrowserAutofillManager : public autofill::TestBrowserAutofillManager {
public:
using autofill::TestBrowserAutofillManager::TestBrowserAutofillManager;
MOCK_METHOD(autofill::FormStructure*,
FindCachedFormById,
(autofill::FormGlobalId),
(const override));
};
class MockAutofillDriver : public autofill::ContentAutofillDriver {
public:
using ContentAutofillDriver::ContentAutofillDriver;
MOCK_METHOD(autofill::AutofillManager&, GetAutofillManager, (), (override));
};
class ContextMenuHelperBaseTest : public ChromeRenderViewHostTestHarness {
public:
ContextMenuHelperBaseTest()
: ChromeRenderViewHostTestHarness(
base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
void SetUp() override { ChromeRenderViewHostTestHarness::SetUp(); }
};
TEST_F(ContextMenuHelperBaseTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_NoDriver) {
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), kFormRendererId, kFieldRendererId));
}
class ContextMenuHelperWithAfTest : public ContextMenuHelperBaseTest {
public:
ContextMenuHelperWithAfTest() = default;
void SetUp() override {
ContextMenuHelperBaseTest::SetUp();
NavigateAndCommit(GURL("about:blank"));
}
autofill::FormData CreateFormWithSingleField(bool is_webauthn = false) {
autofill::FormFieldData field = autofill::test::CreateTestFormField(
/*label=*/"label", /*name=*/"name",
/*value=*/"", autofill::FormControlType::kInputText,
/*autocomplete=*/is_webauthn ? "webauthn" : "");
field.set_host_frame(autofill_driver()->GetFrameToken());
autofill::FormData form;
form.set_renderer_id(autofill::test::MakeFormRendererId());
form.set_url(GURL("https://uzgunKartal1903.com"));
form.set_fields({field});
return form;
}
void NotifyFormManagerAndWait(autofill::FormData form) {
autofill::TestAutofillManagerWaiter waiter(
autofill_manager(), {autofill::AutofillManagerEvent::kFormsSeen});
autofill_manager().OnFormsSeen({form}, {});
ASSERT_TRUE(waiter.Wait());
}
autofill::TestContentAutofillDriver* autofill_driver() {
return af_driver_injector_[main_rfh()];
}
autofill::AutofillManager& autofill_manager() {
return autofill_driver()->GetAutofillManager();
}
private:
autofill::test::AutofillUnitTestEnvironment test_environment_;
autofill::TestAutofillClientInjector<autofill::TestContentAutofillClient>
af_client_injector;
autofill::TestAutofillDriverInjector<autofill::TestContentAutofillDriver>
af_driver_injector_;
autofill::TestAutofillManagerInjector<MockBrowserAutofillManager>
af_manager_injector_;
};
TEST_F(ContextMenuHelperWithAfTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_NoCachedForm) {
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), kFormRendererId, kFieldRendererId));
}
TEST_F(ContextMenuHelperWithAfTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_WrongFormId) {
auto form = CreateFormWithSingleField();
NotifyFormManagerAndWait(form);
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), form.renderer_id().value() + 1, kFieldRendererId));
}
TEST_F(ContextMenuHelperWithAfTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_WrongFieldId) {
auto form = CreateFormWithSingleField();
NotifyFormManagerAndWait(form);
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), form.renderer_id().value(),
form.fields().at(0).renderer_id().value() + 1));
}
TEST_F(ContextMenuHelperWithAfTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_NonWebauthnField) {
auto form = CreateFormWithSingleField();
NotifyFormManagerAndWait(form);
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), form.renderer_id().value(),
form.fields().at(0).renderer_id().value()));
}
TEST_F(
ContextMenuHelperWithAfTest,
IsPasskeyFromAnotherDeviceContextMenuEnabled_WebauthnFieldButNoConditionalRequest) {
auto form = CreateFormWithSingleField(/*is_webauthn=*/true);
NotifyFormManagerAndWait(form);
EXPECT_FALSE(IsPasskeyFromAnotherDeviceContextMenuEnabled(
main_rfh(), form.renderer_id().value(),
form.fields().at(0).renderer_id().value()));
}
// TODO(crbug.com/41496601): Add more test cases after making
// ChromeWebAuthnCredentialsDelegateFactory testable.
} // namespace