Commit 7366f7ef authored by danakj's avatar danakj Committed by Commit Bot

Make PaymentRequestCanMakePayment browser tests run on Android.

This moves them out of ui/views/ since they aren't related, breaks
their dependency on the ui/views/ test base class, copying over the
bits needed for these tests, and adding OS_ANDROID support for anything
platform specific to use the Java PaymentRequest implementation on
Android.

This puts common test code in helpers under the :test_support target
in chrome/test/payments/, with both _desktop.cc and _android.cc
implementations of the helper class. Non-payment helpers go in
chrome/test/base/ and currently just depend on #ifdefs to separate
desktop and Android code since the differences are small. The
chrome_test_utils:: namespace is used for helpers that support Android
and desktop, as opposed to the ui_test_utils:: namespace designed for
desktop only.

JNI bridges go under chrome/test/payments/android/ and are also part of
the :test_support target so they may be used by the above helpers.

And Java helper classes go under chrome/test/android/test_support/ in
the org.chromium.chrome.test_support name space. They are in a
:test_support_java target, which should be depended on alongside
:test_support for including the Java classes into the target so that
the JNI bridges can find the Java implementations.

The JNI header generation for the Java classes are in the
:test_support_jni_headers target, which is depended on by :test_support
in order for the JNI bridges to include and use them.

The test harness subclass inherits from PlatformBrowserTest to give an
Android vs desktop outcome, but otherwise depends on the helper objects
to provide Android vs desktop behaviour.

R=rouslan@chromium.org

Bug: 961849
Change-Id: Ie5ffda4d0206ae2a1f28ef3156cef183e56ee163
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1682764
Commit-Queue: danakj <danakj@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Cr-Commit-Position: refs/heads/master@{#675730}
parent a1dd95e4
...@@ -73,6 +73,22 @@ group("policy_testserver_pyproto") { ...@@ -73,6 +73,22 @@ group("policy_testserver_pyproto") {
} }
} }
if (is_android) {
android_library("test_support_java") {
testonly = true
deps = [
"//chrome/android:chrome_all_java",
]
java_files = [ "android/test_support/src/org/chromium/chrome/test_support/PaymentRequestTestBridge.java" ]
}
generate_jni("test_support_jni_headers") {
sources = [
"android/test_support/src/org/chromium/chrome/test_support/PaymentRequestTestBridge.java",
]
}
}
# Use a static library here because many test binaries depend on this but don't # Use a static library here because many test binaries depend on this but don't
# require many files from it. This makes linking more efficient. # require many files from it. This makes linking more efficient.
static_library("test_support") { static_library("test_support") {
...@@ -88,10 +104,10 @@ static_library("test_support") { ...@@ -88,10 +104,10 @@ static_library("test_support") {
"base/chrome_test_launcher.h", "base/chrome_test_launcher.h",
"base/chrome_test_suite.cc", "base/chrome_test_suite.cc",
"base/chrome_test_suite.h", "base/chrome_test_suite.h",
"base/chrome_test_utils.cc",
"base/chrome_test_utils.h",
"base/chrome_unit_test_suite.cc", "base/chrome_unit_test_suite.cc",
"base/chrome_unit_test_suite.h", "base/chrome_unit_test_suite.h",
"base/dialog_test_browser_window.cc",
"base/dialog_test_browser_window.h",
"base/find_in_page_observer.cc", "base/find_in_page_observer.cc",
"base/find_in_page_observer.h", "base/find_in_page_observer.h",
"base/process_inspector_win.cc", "base/process_inspector_win.cc",
...@@ -106,8 +122,6 @@ static_library("test_support") { ...@@ -106,8 +122,6 @@ static_library("test_support") {
"base/scoped_testing_local_state.h", "base/scoped_testing_local_state.h",
"base/search_test_utils.cc", "base/search_test_utils.cc",
"base/search_test_utils.h", "base/search_test_utils.h",
"base/test_browser_window.cc",
"base/test_browser_window.h",
"base/test_launcher_utils.cc", "base/test_launcher_utils.cc",
"base/test_launcher_utils.h", "base/test_launcher_utils.h",
"base/test_service_manager_listener.cc", "base/test_service_manager_listener.cc",
...@@ -134,10 +148,13 @@ static_library("test_support") { ...@@ -134,10 +148,13 @@ static_library("test_support") {
"logging/win/mof_data_parser.h", "logging/win/mof_data_parser.h",
"logging/win/test_log_collector.cc", "logging/win/test_log_collector.cc",
"logging/win/test_log_collector.h", "logging/win/test_log_collector.h",
"payments/payment_request_test_controller.h",
] ]
configs += [ "//build/config:precompiled_headers" ] configs += [ "//build/config:precompiled_headers" ]
deps = []
# New deps should go in the non-iOS section below. # New deps should go in the non-iOS section below.
public_deps = [ public_deps = [
"//base/test:test_support", "//base/test:test_support",
...@@ -210,12 +227,12 @@ static_library("test_support") { ...@@ -210,12 +227,12 @@ static_library("test_support") {
] ]
if (is_android) { if (is_android) {
sources -= [ sources += [
"base/dialog_test_browser_window.cc", "payments/android/payment_request_test_bridge.cc",
"base/dialog_test_browser_window.h", "payments/android/payment_request_test_bridge.h",
"base/test_browser_window.cc", "payments/payment_request_test_controller_android.cc",
"base/test_browser_window.h",
] ]
deps += [ ":test_support_jni_headers" ]
if (enable_vr) { if (enable_vr) {
public_deps += [ "//chrome/browser/android/vr:test_support" ] public_deps += [ "//chrome/browser/android/vr:test_support" ]
...@@ -233,6 +250,11 @@ static_library("test_support") { ...@@ -233,6 +250,11 @@ static_library("test_support") {
sources += [ sources += [
"../browser/ui/tabs/pinned_tab_test_utils.cc", "../browser/ui/tabs/pinned_tab_test_utils.cc",
"../browser/ui/tabs/pinned_tab_test_utils.h", "../browser/ui/tabs/pinned_tab_test_utils.h",
"base/dialog_test_browser_window.cc",
"base/dialog_test_browser_window.h",
"base/test_browser_window.cc",
"base/test_browser_window.h",
"payments/payment_request_test_controller_desktop.cc",
] ]
} }
...@@ -468,6 +490,7 @@ if (is_android) { ...@@ -468,6 +490,7 @@ if (is_android) {
":android_browsertests_java", ":android_browsertests_java",
":browser_tests_runner", ":browser_tests_runner",
":test_support", ":test_support",
":test_support_java",
":test_support_ui_android", ":test_support_ui_android",
"//chrome:chrome_android_core", "//chrome:chrome_android_core",
"//chrome/android:app_hooks_java", "//chrome/android:app_hooks_java",
...@@ -483,6 +506,7 @@ if (is_android) { ...@@ -483,6 +506,7 @@ if (is_android) {
] ]
sources = [ sources = [
"../browser/payments/payment_request_can_make_payment_browsertest.cc",
"android/browsertests_apk/android_browsertests_jni_onload.cc", "android/browsertests_apk/android_browsertests_jni_onload.cc",
"base/android/android_browser_test_browsertest_android.cc", "base/android/android_browser_test_browsertest_android.cc",
] ]
...@@ -493,6 +517,7 @@ if (is_android) { ...@@ -493,6 +517,7 @@ if (is_android) {
"$root_gen_dir/chrome/android/chrome_apk_paks/resources.pak", "$root_gen_dir/chrome/android/chrome_apk_paks/resources.pak",
"$root_gen_dir/components/components_resources.pak", "$root_gen_dir/components/components_resources.pak",
"$root_out_dir/browser_tests.pak", "$root_out_dir/browser_tests.pak",
"//components/test/data/payments",
] ]
} }
...@@ -503,14 +528,11 @@ if (is_android) { ...@@ -503,14 +528,11 @@ if (is_android) {
sources = [ sources = [
"base/android/android_browser_test.cc", "base/android/android_browser_test.cc",
"base/android/android_browser_test.h", "base/android/android_browser_test.h",
"base/android/payment_request_test_bridge.cc",
"base/android/payment_request_test_bridge.h",
] ]
public_deps = [ public_deps = [
"//content/test:test_support", "//content/test:test_support",
] ]
deps = [ deps = [
":android_browsertests_jni_headers",
"//chrome/browser", "//chrome/browser",
"//content/public/browser", "//content/public/browser",
] ]
...@@ -561,13 +583,6 @@ if (is_android) { ...@@ -561,13 +583,6 @@ if (is_android) {
java_files = [ java_files = [
"android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java", "android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java",
"android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java", "android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsApplication.java",
"android/browsertests_apk/src/org/chromium/android_browsertests_apk/PaymentRequestTestBridge.java",
]
}
generate_jni("android_browsertests_jni_headers") {
sources = [
"android/browsertests_apk/src/org/chromium/android_browsertests_apk/PaymentRequestTestBridge.java",
] ]
} }
...@@ -1748,6 +1763,7 @@ if (!is_android) { ...@@ -1748,6 +1763,7 @@ if (!is_android) {
sources += [ sources += [
"../browser/payments/manifest_verifier_browsertest.cc", "../browser/payments/manifest_verifier_browsertest.cc",
"../browser/payments/payment_manifest_parser_browsertest.cc", "../browser/payments/payment_manifest_parser_browsertest.cc",
"../browser/payments/payment_request_can_make_payment_browsertest.cc",
"../browser/payments/service_worker_payment_app_factory_browsertest.cc", "../browser/payments/service_worker_payment_app_factory_browsertest.cc",
"../browser/payments/site_per_process_payments_browsertest.cc", "../browser/payments/site_per_process_payments_browsertest.cc",
"../browser/ui/global_error/global_error_browsertest.cc", "../browser/ui/global_error/global_error_browsertest.cc",
...@@ -1811,7 +1827,6 @@ if (!is_android) { ...@@ -1811,7 +1827,6 @@ if (!is_android) {
"../browser/ui/views/payments/payment_request_browsertest.cc", "../browser/ui/views/payments/payment_request_browsertest.cc",
"../browser/ui/views/payments/payment_request_browsertest_base.cc", "../browser/ui/views/payments/payment_request_browsertest_base.cc",
"../browser/ui/views/payments/payment_request_browsertest_base.h", "../browser/ui/views/payments/payment_request_browsertest_base.h",
"../browser/ui/views/payments/payment_request_can_make_payment_browsertest.cc",
"../browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc", "../browser/ui/views/payments/payment_request_can_make_payment_metrics_browsertest.cc",
"../browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc", "../browser/ui/views/payments/payment_request_completion_status_metrics_browsertest.cc",
"../browser/ui/views/payments/payment_request_data_url_browsertest.cc", "../browser/ui/views/payments/payment_request_data_url_browsertest.cc",
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
package org.chromium.android_browsertests_apk; package org.chromium.chrome.test_support;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
......
...@@ -35,4 +35,8 @@ class AndroidBrowserTest : public content::BrowserTestBase { ...@@ -35,4 +35,8 @@ class AndroidBrowserTest : public content::BrowserTestBase {
DISALLOW_COPY_AND_ASSIGN(AndroidBrowserTest); DISALLOW_COPY_AND_ASSIGN(AndroidBrowserTest);
}; };
// When including either android_browser_test.h or in_process_browser_test.h
// depending on the platform, use this type alias as the test base class.
using PlatformBrowserTest = AndroidBrowserTest;
#endif // CHROME_TEST_BASE_ANDROID_ANDROID_BROWSER_TEST_H_ #endif // CHROME_TEST_BASE_ANDROID_ANDROID_BROWSER_TEST_H_
// Copyright 2019 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 "chrome/test/base/chrome_test_utils.h"
#include "build/build_config.h"
#if defined(OS_ANDROID)
#include "chrome/browser/ui/android/tab_model/tab_model.h"
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
#else
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#endif
namespace chrome_test_utils {
content::WebContents* GetActiveWebContents(PlatformBrowserTest* browser_test) {
#if defined(OS_ANDROID)
for (size_t i = 0; i < TabModelList::size(); ++i) {
if (TabModelList::get(i)->IsCurrentModel())
return TabModelList::get(i)->GetActiveWebContents();
}
NOTREACHED() << "No active TabModel??";
return nullptr;
#else
return browser_test->browser()->tab_strip_model()->GetActiveWebContents();
#endif
}
} // namespace chrome_test_utils
// Copyright 2019 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.
#ifndef CHROME_TEST_BASE_CHROME_TEST_UTILS_H_
#define CHROME_TEST_BASE_CHROME_TEST_UTILS_H_
#include "base/compiler_specific.h"
#include "build/build_config.h"
#include "url/gurl.h"
namespace content {
class WebContents;
}
#if defined(OS_ANDROID)
#include "chrome/test/base/android/android_browser_test.h"
#else
#include "chrome/test/base/in_process_browser_test.h"
#endif
// This namespace contains test utilities that function for both Android and
// desktop browser tests.
namespace chrome_test_utils {
// Returns the active WebContents. On desktop this is in the first browser
// window created by tests, more specific behaviour requires other means.
content::WebContents* GetActiveWebContents(PlatformBrowserTest* browser_test);
} // namespace chrome_test_utils
#endif // CHROME_TEST_BASE_CHROME_TEST_UTILS_H_
...@@ -146,10 +146,10 @@ class InProcessBrowserTest : public content::BrowserTestBase { ...@@ -146,10 +146,10 @@ class InProcessBrowserTest : public content::BrowserTestBase {
global_browser_set_up_function_ = set_up_function; global_browser_set_up_function_ = set_up_function;
} }
protected:
// Returns the browser created by BrowserMain(). // Returns the browser created by BrowserMain().
Browser* browser() const { return browser_; } Browser* browser() const { return browser_; }
protected:
// Closes the given browser and waits for it to release all its resources. // Closes the given browser and waits for it to release all its resources.
void CloseBrowserSynchronously(Browser* browser); void CloseBrowserSynchronously(Browser* browser);
...@@ -312,4 +312,8 @@ class InProcessBrowserTest : public content::BrowserTestBase { ...@@ -312,4 +312,8 @@ class InProcessBrowserTest : public content::BrowserTestBase {
DISALLOW_COPY_AND_ASSIGN(InProcessBrowserTest); DISALLOW_COPY_AND_ASSIGN(InProcessBrowserTest);
}; };
// When including either in_process_browser_test.h or android_browser_test.h
// depending on the platform, use this type alias as the test base class.
using PlatformBrowserTest = InProcessBrowserTest;
#endif // CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_ #endif // CHROME_TEST_BASE_IN_PROCESS_BROWSER_TEST_H_
include_rules = [
"+components/payments",
]
file://components/payments/OWNERS
# COMPONENT: UI>Browser>Payments
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "chrome/test/base/android/payment_request_test_bridge.h" #include "chrome/test/payments/android/payment_request_test_bridge.h"
#include "base/no_destructor.h" #include "base/no_destructor.h"
#include "chrome/test/android_browsertests_jni_headers/PaymentRequestTestBridge_jni.h" #include "chrome/test/test_support_jni_headers/PaymentRequestTestBridge_jni.h"
namespace payments { namespace payments {
......
...@@ -2,8 +2,8 @@ ...@@ -2,8 +2,8 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#ifndef CHROME_TEST_BASE_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_ #ifndef CHROME_TEST_PAYMENTS_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_
#define CHROME_TEST_BASE_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_ #define CHROME_TEST_PAYMENTS_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_
#include "base/callback.h" #include "base/callback.h"
...@@ -32,4 +32,4 @@ void SetUseNativeObserverOnPaymentRequestForTesting( ...@@ -32,4 +32,4 @@ void SetUseNativeObserverOnPaymentRequestForTesting(
} // namespace payments } // namespace payments
#endif // CHROME_TEST_BASE_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_ #endif // CHROME_TEST_PAYMENTS_ANDROID_PAYMENT_REQUEST_TEST_BRIDGE_H_
// Copyright 2019 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.
#ifndef CHROME_TEST_PAYMENTS_PAYMENT_REQUEST_TEST_CONTROLLER_H_
#define CHROME_TEST_PAYMENTS_PAYMENT_REQUEST_TEST_CONTROLLER_H_
#include <memory>
#include "build/build_config.h"
#if !defined(OS_ANDROID)
namespace sync_preferences {
class TestingPrefServiceSyncable;
}
#endif
namespace payments {
// Observe states or actions taken by the PaymentRequest in tests, supporting
// both Android and desktop.
class PaymentRequestTestObserver {
public:
virtual void OnCanMakePaymentCalled() = 0;
virtual void OnCanMakePaymentReturned() = 0;
virtual void OnHasEnrolledInstrumentCalled() = 0;
virtual void OnHasEnrolledInstrumentReturned() = 0;
virtual void OnNotSupportedError() = 0;
virtual void OnConnectionTerminated() = 0;
virtual void OnAbortCalled() = 0;
protected:
virtual ~PaymentRequestTestObserver() {}
};
// A class to control creation and behaviour of PaymentRequests in a
// cross-platform way for testing both Android and desktop.
class PaymentRequestTestController {
public:
explicit PaymentRequestTestController(PaymentRequestTestObserver* observer);
~PaymentRequestTestController();
// To be called from an override of BrowserTestBase::SetUpOnMainThread().
void SetUpOnMainThread();
// Sets values that will change the behaviour of PaymentRequests created in
// the future.
void SetIncognito(bool is_incognito);
void SetValidSsl(bool valid_ssl);
void SetCanMakePaymentEnabledPref(bool can_make_payment_enabled);
private:
// Observers that forward through to the PaymentRequestTestObserver.
void OnCanMakePaymentCalled();
void OnCanMakePaymentReturned();
void OnHasEnrolledInstrumentCalled();
void OnHasEnrolledInstrumentReturned();
void OnNotSupportedError();
void OnConnectionTerminated();
void OnAbortCalled();
PaymentRequestTestObserver* const observer_;
bool is_incognito_ = false;
bool valid_ssl_ = true;
bool can_make_payment_pref_ = true;
#if !defined(OS_ANDROID)
void UpdateDelegateFactory();
std::unique_ptr<sync_preferences::TestingPrefServiceSyncable> prefs_;
class ObserverConverter;
std::unique_ptr<ObserverConverter> observer_converter_;
#endif
};
} // namespace payments
#endif // CHROME_TEST_PAYMENTS_PAYMENT_REQUEST_TEST_CONTROLLER_H_
// Copyright 2019 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 "chrome/test/payments/payment_request_test_controller.h"
#include "base/bind.h"
#include "chrome/test/payments/android/payment_request_test_bridge.h"
namespace payments {
PaymentRequestTestController::PaymentRequestTestController(
PaymentRequestTestObserver* observer)
: observer_(observer) {}
PaymentRequestTestController::~PaymentRequestTestController() = default;
void PaymentRequestTestController::SetUpOnMainThread() {
// Register |this| as the observer for future PaymentRequests created in
// Java.
SetUseNativeObserverOnPaymentRequestForTesting(
base::BindRepeating(&PaymentRequestTestController::OnCanMakePaymentCalled,
base::Unretained(this)),
base::BindRepeating(
&PaymentRequestTestController::OnCanMakePaymentReturned,
base::Unretained(this)),
base::BindRepeating(
&PaymentRequestTestController::OnHasEnrolledInstrumentCalled,
base::Unretained(this)),
base::BindRepeating(
&PaymentRequestTestController::OnHasEnrolledInstrumentReturned,
base::Unretained(this)),
base::BindRepeating(&PaymentRequestTestController::OnNotSupportedError,
base::Unretained(this)),
base::BindRepeating(&PaymentRequestTestController::OnConnectionTerminated,
base::Unretained(this)),
base::BindRepeating(&PaymentRequestTestController::OnAbortCalled,
base::Unretained(this)));
SetUseDelegateOnPaymentRequestForTesting(
/*use_delegate_for_test=*/true, is_incognito_, valid_ssl_,
/*is_browser_window_active=*/true, can_make_payment_pref_,
/*skip_ui_for_basic_card=*/false);
}
void PaymentRequestTestController::SetIncognito(bool is_incognito) {
is_incognito_ = is_incognito;
SetUseDelegateOnPaymentRequestForTesting(
/*use_delegate_for_test=*/true, is_incognito_, valid_ssl_,
/*is_browser_window_active=*/true, can_make_payment_pref_,
/*skip_ui_for_basic_card=*/false);
}
void PaymentRequestTestController::SetValidSsl(bool valid_ssl) {
valid_ssl_ = valid_ssl;
SetUseDelegateOnPaymentRequestForTesting(
/*use_delegate_for_test=*/true, is_incognito_, valid_ssl_,
/*is_browser_window_active=*/true, can_make_payment_pref_,
/*skip_ui_for_basic_card=*/false);
}
void PaymentRequestTestController::SetCanMakePaymentEnabledPref(
bool can_make_payment_enabled) {
can_make_payment_pref_ = can_make_payment_enabled;
SetUseDelegateOnPaymentRequestForTesting(
/*use_delegate_for_test=*/true, is_incognito_, valid_ssl_,
/*is_browser_window_active=*/true, can_make_payment_pref_,
/*skip_ui_for_basic_card=*/false);
}
void PaymentRequestTestController::OnCanMakePaymentCalled() {
observer_->OnCanMakePaymentCalled();
}
void PaymentRequestTestController::OnCanMakePaymentReturned() {
observer_->OnCanMakePaymentReturned();
}
void PaymentRequestTestController::OnHasEnrolledInstrumentCalled() {
observer_->OnHasEnrolledInstrumentCalled();
}
void PaymentRequestTestController::OnHasEnrolledInstrumentReturned() {
observer_->OnHasEnrolledInstrumentReturned();
}
void PaymentRequestTestController::OnNotSupportedError() {
observer_->OnNotSupportedError();
}
void PaymentRequestTestController::OnConnectionTerminated() {
observer_->OnConnectionTerminated();
}
void PaymentRequestTestController::OnAbortCalled() {
observer_->OnAbortCalled();
}
} // namespace payments
// Copyright 2019 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 "chrome/test/payments/payment_request_test_controller.h"
#include "chrome/browser/payments/chrome_payment_request_delegate.h"
#include "chrome/browser/payments/payment_request_factory.h"
#include "components/payments/content/payment_request.h"
#include "components/payments/content/payment_request_web_contents_manager.h"
#include "components/payments/core/payment_prefs.h"
#include "components/sync_preferences/testing_pref_service_syncable.h"
namespace payments {
class CanMakePaymentTestChromePaymentRequestDelegate
: public ChromePaymentRequestDelegate {
public:
CanMakePaymentTestChromePaymentRequestDelegate(
content::WebContents* web_contents,
bool is_incognito,
bool valid_ssl,
PrefService* prefs)
: ChromePaymentRequestDelegate(web_contents),
is_incognito_(is_incognito),
valid_ssl_(valid_ssl),
prefs_(prefs) {}
bool IsIncognito() const override { return is_incognito_; }
std::string GetInvalidSslCertificateErrorMessage() override {
return valid_ssl_ ? "" : "Invalid SSL certificate";
}
PrefService* GetPrefService() override { return prefs_; }
private:
const bool is_incognito_;
const bool valid_ssl_;
PrefService* const prefs_;
};
class PaymentRequestTestController::ObserverConverter
: public PaymentRequest::ObserverForTest {
public:
explicit ObserverConverter(PaymentRequestTestController* controller)
: controller_(controller) {}
void OnCanMakePaymentCalled() override {
controller_->OnCanMakePaymentCalled();
}
void OnCanMakePaymentReturned() override {
controller_->OnCanMakePaymentReturned();
}
void OnHasEnrolledInstrumentCalled() override {
controller_->OnHasEnrolledInstrumentCalled();
}
void OnHasEnrolledInstrumentReturned() override {
controller_->OnHasEnrolledInstrumentReturned();
}
void OnNotSupportedError() override { controller_->OnNotSupportedError(); }
void OnConnectionTerminated() override {
controller_->OnConnectionTerminated();
}
void OnAbortCalled() override { controller_->OnAbortCalled(); }
private:
PaymentRequestTestController* const controller_;
};
PaymentRequestTestController::PaymentRequestTestController(
PaymentRequestTestObserver* observer)
: observer_(observer),
prefs_(std::make_unique<sync_preferences::TestingPrefServiceSyncable>()),
observer_converter_(std::make_unique<ObserverConverter>(this)) {}
PaymentRequestTestController::~PaymentRequestTestController() = default;
void PaymentRequestTestController::SetUpOnMainThread() {
// Register all prefs with our pref testing service, since we're not using the
// one chrome sets up.
payments::RegisterProfilePrefs(prefs_->registry());
UpdateDelegateFactory();
}
void PaymentRequestTestController::SetIncognito(bool is_incognito) {
is_incognito_ = is_incognito;
UpdateDelegateFactory();
}
void PaymentRequestTestController::SetValidSsl(bool valid_ssl) {
valid_ssl_ = valid_ssl;
UpdateDelegateFactory();
}
void PaymentRequestTestController::SetCanMakePaymentEnabledPref(
bool can_make_payment_enabled) {
can_make_payment_pref_ = can_make_payment_enabled;
prefs_->SetBoolean(kCanMakePaymentEnabled, can_make_payment_pref_);
UpdateDelegateFactory();
}
void PaymentRequestTestController::UpdateDelegateFactory() {
SetPaymentRequestFactoryForTesting(base::BindRepeating(
[](PaymentRequest::ObserverForTest* observer_for_test, bool is_incognito,
bool valid_ssl, PrefService* prefs,
payments::mojom::PaymentRequestRequest request,
content::RenderFrameHost* render_frame_host) {
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
DCHECK(web_contents);
auto delegate =
std::make_unique<CanMakePaymentTestChromePaymentRequestDelegate>(
web_contents, is_incognito, valid_ssl, prefs);
PaymentRequestWebContentsManager* manager =
PaymentRequestWebContentsManager::GetOrCreateForWebContents(
web_contents);
manager->CreatePaymentRequest(web_contents->GetMainFrame(),
web_contents, std::move(delegate),
std::move(request), observer_for_test);
},
observer_converter_.get(), is_incognito_, valid_ssl_, prefs_.get()));
}
void PaymentRequestTestController::OnCanMakePaymentCalled() {
observer_->OnCanMakePaymentCalled();
}
void PaymentRequestTestController::OnCanMakePaymentReturned() {
observer_->OnCanMakePaymentReturned();
}
void PaymentRequestTestController::OnHasEnrolledInstrumentCalled() {
observer_->OnHasEnrolledInstrumentCalled();
}
void PaymentRequestTestController::OnHasEnrolledInstrumentReturned() {
observer_->OnHasEnrolledInstrumentReturned();
}
void PaymentRequestTestController::OnNotSupportedError() {
observer_->OnNotSupportedError();
}
void PaymentRequestTestController::OnConnectionTerminated() {
observer_->OnConnectionTerminated();
}
void PaymentRequestTestController::OnAbortCalled() {
observer_->OnAbortCalled();
}
} // namespace payments
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment