1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
// 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 "components/payments/content/payment_request_display_manager.h"
#include "base/memory/weak_ptr.h"
#include "base/test/metrics/histogram_tester.h"
#include "components/payments/content/mock_content_payment_request_delegate.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace payments {
using PaymentRequestDisplayManagerTest = content::RenderViewHostTestHarness;
TEST_F(PaymentRequestDisplayManagerTest, TryShow_Success) {
base::HistogramTester histogram_tester;
PaymentRequestDisplayManager display_manager;
MockContentPaymentRequestDelegate mock_delegate;
EXPECT_TRUE(display_manager.TryShow(mock_delegate.GetContentWeakPtr()));
histogram_tester.ExpectUniqueSample("PaymentRequest.Show.TryShowOutcome",
PaymentRequestTryShowOutcome::kAbleToShow,
/*expected_bucket_count=*/1);
}
TEST_F(PaymentRequestDisplayManagerTest,
TryShow_ExistingPaymentRequestSameTab) {
PaymentRequestDisplayManager display_manager;
std::unique_ptr<content::WebContents> web_contents(CreateTestWebContents());
MockContentPaymentRequestDelegate mock_delegate;
EXPECT_CALL(mock_delegate, GetRenderFrameHost)
.WillRepeatedly(testing::Return(web_contents->GetPrimaryMainFrame()));
// Set up an ongoing PaymentRequest.
std::unique_ptr<PaymentRequestDisplayManager::DisplayHandle> existing_handle =
display_manager.TryShow(mock_delegate.GetContentWeakPtr());
ASSERT_TRUE(existing_handle);
// Now trigger another PaymentRequest using the same delegate (and thus the
// same tab). This should be rejected and have the corresponding histogram
// sample recorded.
base::HistogramTester histogram_tester;
EXPECT_FALSE(display_manager.TryShow(mock_delegate.GetContentWeakPtr()));
histogram_tester.ExpectUniqueSample(
"PaymentRequest.Show.TryShowOutcome",
PaymentRequestTryShowOutcome::kCannotShowExistingPaymentRequestSameTab,
/*expected_bucket_count=*/1);
}
TEST_F(PaymentRequestDisplayManagerTest,
TryShow_ExistingPaymentRequestDifferentTab) {
PaymentRequestDisplayManager display_manager;
// Set up an ongoing PaymentRequest.
MockContentPaymentRequestDelegate mock_delegate_1;
std::unique_ptr<content::WebContents> web_contents_1(CreateTestWebContents());
EXPECT_CALL(mock_delegate_1, GetRenderFrameHost)
.WillRepeatedly(testing::Return(web_contents_1->GetPrimaryMainFrame()));
std::unique_ptr<PaymentRequestDisplayManager::DisplayHandle> existing_handle =
display_manager.TryShow(mock_delegate_1.GetContentWeakPtr());
ASSERT_TRUE(existing_handle);
// Now trigger another PaymentRequest in a different tab. This should be
// rejected and have the corresponding histogram sample recorded.
base::HistogramTester histogram_tester;
MockContentPaymentRequestDelegate mock_delegate_2;
std::unique_ptr<content::WebContents> web_contents_2(CreateTestWebContents());
EXPECT_CALL(mock_delegate_2, GetRenderFrameHost)
.WillRepeatedly(testing::Return(web_contents_2->GetPrimaryMainFrame()));
EXPECT_FALSE(display_manager.TryShow(mock_delegate_2.GetContentWeakPtr()));
histogram_tester.ExpectUniqueSample(
"PaymentRequest.Show.TryShowOutcome",
PaymentRequestTryShowOutcome::
kCannotShowExistingPaymentRequestDifferentTab,
/*expected_bucket_count=*/1);
}
TEST_F(PaymentRequestDisplayManagerTest, TryShow_NullDelegate) {
PaymentRequestDisplayManager display_manager;
base::HistogramTester histogram_tester;
EXPECT_FALSE(display_manager.TryShow(nullptr));
histogram_tester.ExpectUniqueSample(
"PaymentRequest.Show.TryShowOutcome",
PaymentRequestTryShowOutcome::kCannotShowDelegateWasNull,
/*expected_bucket_count=*/1);
}
TEST_F(PaymentRequestDisplayManagerTest, TryShow_ExistingDelegateBecameNull) {
PaymentRequestDisplayManager display_manager;
// Set up an ongoing PaymentRequest.
auto mock_delegate_1 = std::make_unique<MockContentPaymentRequestDelegate>();
std::unique_ptr<PaymentRequestDisplayManager::DisplayHandle> existing_handle =
display_manager.TryShow(mock_delegate_1->GetContentWeakPtr());
ASSERT_TRUE(existing_handle);
// Reset the first delegate. This isn't expected to happen in the wild, but
// the code should be able to handle it.
mock_delegate_1.reset();
// Now trigger another PaymentRequest using a new delegate. This should be
// rejected as there is an existing show() going on, even though the delegate
// has been cleared. A histogram sample should also be specifically
// recorded for this situation.
base::HistogramTester histogram_tester;
MockContentPaymentRequestDelegate mock_delegate_2;
EXPECT_FALSE(display_manager.TryShow(mock_delegate_2.GetContentWeakPtr()));
histogram_tester.ExpectUniqueSample(
"PaymentRequest.Show.TryShowOutcome",
PaymentRequestTryShowOutcome::kCannotShowUnknownReason,
/*expected_bucket_count=*/1);
}
} // namespace payments
|