blob: 72a123afc5b410a11ba1df29f0513cd3cec419d9 [file] [log] [blame]
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <string>
#include <vector>
#include "base/strings/utf_string_conversions.h"
#include "base/test/metrics/histogram_tester.h"
#include "chrome/test/base/chrome_test_utils.h"
#include "chrome/test/payments/payment_request_platform_browsertest_base.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
namespace payments {
class PaymentRequestCanMakePaymentQueryTest
: public PaymentRequestPlatformBrowserTestBase {
public:
void ExpectCanMakePayment(bool expected, const std::string& method) {
EXPECT_EQ(
expected,
content::EvalJs(GetActiveWebContents(),
content::JsReplace("checkCanMakePayment($1)", method)));
}
void ExpectHasEnrolledInstrument(bool expected, const std::string& method) {
EXPECT_EQ(expected,
content::EvalJs(GetActiveWebContents(),
content::JsReplace(
"checkHasEnrolledInstrument($1)", method)));
}
};
// A user has installed a payment app that responds "false" to the
// "canmakepayment" event. PaymentRequest.canMakePayment() should return true,
// but PaymentRequest.hasEnrolledInstrument() should return false.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
AppRespondsFalseToCanMakePaymentEvent) {
std::string method;
InstallPaymentApp("a.com", "/can_make_payment_false_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
ExpectCanMakePayment(true, method);
ExpectHasEnrolledInstrument(false, method);
}
// A user has installed a payment app that responds "true" to the
// "canmakepayment" event. Both PaymentRequest.canMakePayment() and
// PaymentRequest.hasEnrolledInstrument() should return true."
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
AppRespondsTrueToCanMakePaymentEvent) {
base::HistogramTester histogram_tester;
std::string method;
InstallPaymentApp("a.com", "/can_make_payment_true_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
ExpectCanMakePayment(true, method);
histogram_tester.ExpectUniqueSample(
"PaymentRequest.CanMakePayment.CallAllowedByPref", /*sample=*/1,
/*expected_bucket_count=*/1);
ExpectHasEnrolledInstrument(true, method);
histogram_tester.ExpectUniqueSample(
"PaymentRequest.HasEnrolledInstrument.CallAllowedByPref", /*sample=*/1,
/*expected_bucket_count=*/1);
}
// A user has installed a payment app that responds "true" to the
// "canmakepayment" event and the user is in incognito mode. In this case,
// hasEnrolledInstrument() returns false because the "canmakepayment" event is
// not fired in incognito mode.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
IncognitoModeWithInstalledPaymentHandler) {
std::string method;
InstallPaymentApp("a.com", "/can_make_payment_true_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
test_controller()->SetOffTheRecord(true);
ExpectCanMakePayment(true, method);
ExpectHasEnrolledInstrument(false, method);
}
// Nickpay is requested but not installed, but it supports just-in-time
// installation. In this case canMakePayment() returns true and
// hasEnrolledInstrument() returns false.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
AppIsNotInstalledButCanBeInstalledJustInTime) {
std::string method =
https_server()->GetURL("a.com", "/nickpay.test/pay").spec();
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
ExpectCanMakePayment(true, method);
ExpectHasEnrolledInstrument(false, method);
}
// Nickpay is requested in incognito mode and it supports just-in-time
// installation but is not installed. In this case canMakePayment() returns true
// and hasEnrolledInstrument() returns false as in a normal mode.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
IncognitoModeWithJITInstallableButNotInstalledApp) {
std::string method =
https_server()->GetURL("a.com", "/nickpay.test/pay").spec();
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
test_controller()->SetOffTheRecord(true);
ExpectCanMakePayment(true, method);
ExpectHasEnrolledInstrument(false, method);
}
// Test the case where canMakePayment would return true, but the user has
// disabled the API in settings.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
CanMakePayment_SupportedButDisabled) {
base::HistogramTester histogram_tester;
test_controller()->SetCanMakePaymentEnabledPref(false);
std::string method;
InstallPaymentApp("a.com", "/can_make_payment_true_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
ExpectCanMakePayment(false, method);
histogram_tester.ExpectUniqueSample(
"PaymentRequest.CanMakePayment.CallAllowedByPref", /*sample=*/0,
/*expected_bucket_count=*/1);
}
// Test the case where hasEnrolledInstrument would return true, but the user has
// disabled the API in settings.
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest,
HasEnrolledInstrument_SupportedButDisabled) {
base::HistogramTester histogram_tester;
test_controller()->SetCanMakePaymentEnabledPref(false);
std::string method;
InstallPaymentApp("a.com", "/can_make_payment_true_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
ExpectHasEnrolledInstrument(false, method);
histogram_tester.ExpectUniqueSample(
"PaymentRequest.HasEnrolledInstrument.CallAllowedByPref", /*sample=*/0,
/*expected_bucket_count=*/1);
}
// Pages without a valid SSL certificate always get "false" from
// canMakePayment() and hasEnrolledInstrument() and NotSupported error from
// show().
IN_PROC_BROWSER_TEST_F(PaymentRequestCanMakePaymentQueryTest, InvalidSSL) {
std::string method;
InstallPaymentApp("a.com", "/payment_request_success_responder.js", &method);
NavigateTo("b.com", "/payment_request_can_make_payment_query_test.html");
test_controller()->SetValidSsl(false);
// canMakePayment() will either reject or resolve with "false", depending on
// timing of when the browser completes the SSL check and when the website
// calls canMakePayment().
// TODO(crbug.com/40858197): More consistent canMakePayment() behavior.
EXPECT_THAT(
content::EvalJs(GetActiveWebContents(),
content::JsReplace("checkCanMakePayment($1)", method)),
testing::AnyOf(
content::EvalJsResult::ErrorIs("a JavaScript error: \"false\"\n"),
content::EvalJsResult::IsOkAndHolds(testing::Eq(false))));
// hasEnrolledInstrument() will either reject or resolve with "false",
// depending on timing of when the browser completes the SSL check and when
// the website calls hasEnrolledInstrument().
// TODO(crbug.com/40858197): More consistent hasEnrolledInstrument() behavior.
EXPECT_THAT(
content::EvalJs(
GetActiveWebContents(),
content::JsReplace("checkHasEnrolledInstrument($1)", method)),
testing::AnyOf(
content::EvalJsResult::ErrorIs("a JavaScript error: \"false\"\n"),
content::EvalJsResult::IsOkAndHolds(testing::Eq(false))));
EXPECT_EQ("NotSupportedError: Invalid SSL certificate",
content::EvalJs(GetActiveWebContents(),
content::JsReplace("getShowResponse($1)", method)));
}
} // namespace payments