blob: a0a87f707ef80e6434b605e6c6da8eb13cd808df [file] [log] [blame]
// Copyright 2020 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.
package org.chromium.chrome.browser.payments;
import android.app.Activity;
import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.Nullable;
import org.mockito.Mockito;
import org.chromium.chrome.browser.compositor.layouts.OverviewModeBehavior;
import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher;
import org.chromium.chrome.browser.payments.ui.PaymentUiService;
import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelSelector;
import org.chromium.components.payments.BrowserPaymentRequest;
import org.chromium.components.payments.JourneyLogger;
import org.chromium.components.payments.MojoPaymentRequestGateKeeper;
import org.chromium.components.payments.PaymentAppFactoryInterface;
import org.chromium.components.payments.PaymentHandlerHost;
import org.chromium.components.payments.PaymentRequestParams;
import org.chromium.components.payments.PaymentRequestService;
import org.chromium.components.payments.PaymentRequestSpec;
import org.chromium.components.payments.PaymentRequestUpdateEventListener;
import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.WebContents;
import org.chromium.payments.mojom.PaymentCurrencyAmount;
import org.chromium.payments.mojom.PaymentDetails;
import org.chromium.payments.mojom.PaymentItem;
import org.chromium.payments.mojom.PaymentMethodData;
import org.chromium.payments.mojom.PaymentOptions;
import org.chromium.payments.mojom.PaymentRequest;
import org.chromium.payments.mojom.PaymentRequestClient;
import org.chromium.ui.base.WindowAndroid;
import org.chromium.url.Origin;
import java.lang.ref.WeakReference;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/** The builder of the PaymentRequest parameters. */
public class PaymentRequestParamsBuilder implements ChromePaymentRequestService.Delegate {
private final PaymentRequestClient mClient;
private final ChromePaymentRequestService.Delegate mDelegate;
private final RenderFrameHost mRenderFrameHost;
private final PaymentMethodData[] mMethodData;
private final PaymentDetails mDetails;
private final WebContents mWebContents;
private final JourneyLogger mJourneyLogger;
private final PaymentRequestSpec mSpec;
private final PaymentUiService mPaymentUiService;
private final boolean mGoogleBridgeEligible;
private final PaymentOptions mOptions;
/* package */ static PaymentRequestParamsBuilder defaultBuilder(
PaymentRequestClient client, PaymentUiService paymentUiService) {
return new PaymentRequestParamsBuilder(client, paymentUiService);
}
/* package */ PaymentRequestParamsBuilder(
PaymentRequestClient client, PaymentUiService paymentUiService) {
mClient = client;
mDelegate = this;
mPaymentUiService = paymentUiService;
mJourneyLogger = Mockito.mock(JourneyLogger.class);
mWebContents = Mockito.mock(WebContents.class);
Mockito.doReturn("https://top.level.origin").when(mWebContents).getLastCommittedUrl();
mRenderFrameHost = Mockito.mock(RenderFrameHost.class);
Mockito.doReturn("https://frame.origin").when(mRenderFrameHost).getLastCommittedURL();
Origin origin = Mockito.mock(Origin.class);
Mockito.doReturn(origin).when(mRenderFrameHost).getLastCommittedOrigin();
mMethodData = new PaymentMethodData[1];
mMethodData[0] = new PaymentMethodData();
mMethodData[0].supportedMethod = "https://www.chromium.org";
mDetails = new PaymentDetails();
mDetails.id = "testId";
mDetails.total = new PaymentItem();
mOptions = new PaymentOptions();
mOptions.requestShipping = true;
mSpec = Mockito.mock(PaymentRequestSpec.class);
PaymentCurrencyAmount amount = new PaymentCurrencyAmount();
amount.currency = "CNY";
amount.value = "123";
PaymentItem total = new PaymentItem();
total.amount = amount;
Mockito.doReturn(total).when(mSpec).getRawTotal();
Map<String, PaymentMethodData> methodDataMap = new HashMap<>();
methodDataMap.put(mMethodData[0].supportedMethod, mMethodData[0]);
Mockito.doReturn(methodDataMap).when(mSpec).getMethodData();
Mockito.doReturn(mOptions).when(mSpec).getPaymentOptions();
mGoogleBridgeEligible = false;
}
/* package */ PaymentRequest buildAndInit() {
PaymentRequest request = new MojoPaymentRequestGateKeeper(
(client, onClosed)
-> new PaymentRequestService(mRenderFrameHost, client, onClosed, this));
request.init(mClient, mMethodData, mDetails, mOptions, mGoogleBridgeEligible);
return request;
}
@Override
public boolean skipUiForBasicCard() {
return false;
}
@Override
public BrowserPaymentRequest createBrowserPaymentRequest(
PaymentRequestService paymentRequestService) {
return new ChromePaymentRequestService(paymentRequestService, mDelegate);
}
@Override
public boolean isOffTheRecord() {
return false;
}
@Override
public String getInvalidSslCertificateErrorMessage() {
return null;
}
@Override
public boolean prefsCanMakePayment() {
return false;
}
@Nullable
@Override
public String getTwaPackageName() {
return null;
}
@Nullable
@Override
public WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
return mWebContents;
}
@Override
public boolean isOriginSecure(String url) {
return true;
}
@Override
public JourneyLogger createJourneyLogger(boolean isIncognito, WebContents webContents) {
return mJourneyLogger;
}
@Override
public String formatUrlForSecurityDisplay(String uri) {
return uri;
}
@Override
public byte[][] getCertificateChain(WebContents webContents) {
return new byte[0][];
}
@Override
public boolean isOriginAllowedToUseWebPaymentApis(String url) {
return true;
}
@Override
public boolean validatePaymentDetails(PaymentDetails details) {
return true;
}
@Override
public PaymentRequestSpec createPaymentRequestSpec(PaymentOptions options,
PaymentDetails details, Collection<PaymentMethodData> methodData, String appLocale) {
return mSpec;
}
@Override
public PaymentUiService createPaymentUiService(PaymentUiService.Delegate delegate,
PaymentRequestParams params, WebContents webContents, boolean isOffTheRecord,
JourneyLogger journeyLogger, String topLevelOrigin) {
return mPaymentUiService;
}
@Override
public Activity getActivity(WebContents webContents) {
Activity activity = Mockito.mock(Activity.class);
Resources resources = Mockito.mock(Resources.class);
Mockito.doReturn(resources).when(activity).getResources();
return activity;
}
@Nullable
@Override
public TabModelSelector getTabModelSelector(WebContents webContents) {
return Mockito.mock(TabModelSelector.class);
}
@Nullable
@Override
public TabModel getTabModel(WebContents webContents) {
return Mockito.mock(TabModel.class);
}
@Nullable
@Override
public OverviewModeBehavior getOverviewModeBehavior(WebContents webContents) {
return Mockito.mock(OverviewModeBehavior.class);
}
@Nullable
@Override
public ActivityLifecycleDispatcher getActivityLifecycleDispatcher(WebContents webContents) {
return Mockito.mock(ActivityLifecycleDispatcher.class);
}
@Override
public PaymentAppFactoryInterface createAndroidPaymentAppFactory() {
return null;
}
@Override
public PaymentAppFactoryInterface createServiceWorkerPaymentAppFactory() {
return null;
}
@Override
public PaymentAppFactoryInterface createAutofillPaymentAppFactory() {
return null;
}
@Override
public boolean canMakeAutofillPayment(Map<String, PaymentMethodData> methodData) {
return false;
}
@Override
public boolean isWebContentsActive(RenderFrameHost renderFrameHost) {
return true;
}
@Override
public WindowAndroid getWindowAndroid(RenderFrameHost renderFrameHost) {
WindowAndroid window = Mockito.mock(WindowAndroid.class);
Context context = Mockito.mock(Context.class);
WeakReference<Context> weakContext = Mockito.mock(WeakReference.class);
Mockito.doReturn(context).when(weakContext).get();
Mockito.doReturn(weakContext).when(window).getContext();
return window;
}
@Override
public PaymentHandlerHost createPaymentHandlerHost(
WebContents webContents, PaymentRequestUpdateEventListener listener) {
return Mockito.mock(PaymentHandlerHost.class);
}
}