Commit e4eb0091 authored by Liquan (Max) Gu's avatar Liquan (Max) Gu Committed by Commit Bot

[WebLayer] ComponentPaymentRequestImpl takes over PaymentRequest

Before:
PaymentRequestImpl implements PaymentRequest

After:
ComponentPaymentRequestImpl implements PaymentRequest, and delegate the
implementation to PaymentRequestImpl.

Bug: 1102522

Change-Id: I3e3ea0b6a0abb12f4efa983dc8ee697117f40095
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2285243
Commit-Queue: Liquan (Max) Gu <maxlg@chromium.org>
Reviewed-by: default avatarDanyao Wang <danyao@chromium.org>
Reviewed-by: default avatarMustafa Emre Acer <meacer@chromium.org>
Cr-Commit-Position: refs/heads/master@{#786159}
parent aee06903
...@@ -11,6 +11,7 @@ import org.chromium.chrome.browser.preferences.Pref; ...@@ -11,6 +11,7 @@ import org.chromium.chrome.browser.preferences.Pref;
import org.chromium.chrome.browser.preferences.PrefServiceBridge; import org.chromium.chrome.browser.preferences.PrefServiceBridge;
import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModel;
import org.chromium.chrome.browser.tabmodel.TabModelUtils; import org.chromium.chrome.browser.tabmodel.TabModelUtils;
import org.chromium.components.payments.ComponentPaymentRequestImpl;
import org.chromium.components.payments.ErrorStrings; import org.chromium.components.payments.ErrorStrings;
import org.chromium.components.payments.OriginSecurityChecker; import org.chromium.components.payments.OriginSecurityChecker;
import org.chromium.components.payments.PaymentFeatureList; import org.chromium.components.payments.PaymentFeatureList;
...@@ -144,7 +145,7 @@ public class PaymentRequestFactory implements InterfaceFactory<PaymentRequest> { ...@@ -144,7 +145,7 @@ public class PaymentRequestFactory implements InterfaceFactory<PaymentRequest> {
/** /**
* Builds a factory for PaymentRequest. * Builds a factory for PaymentRequest.
* *
* @param webContents The web contents that may invoke the PaymentRequest API. * @param renderFrameHost The host of the frame that has invoked the PaymentRequest API.
*/ */
public PaymentRequestFactory(RenderFrameHost renderFrameHost) { public PaymentRequestFactory(RenderFrameHost renderFrameHost) {
mRenderFrameHost = renderFrameHost; mRenderFrameHost = renderFrameHost;
...@@ -170,6 +171,8 @@ public class PaymentRequestFactory implements InterfaceFactory<PaymentRequest> { ...@@ -170,6 +171,8 @@ public class PaymentRequestFactory implements InterfaceFactory<PaymentRequest> {
} else { } else {
delegate = new PaymentRequestDelegateImpl(); delegate = new PaymentRequestDelegateImpl();
} }
return new PaymentRequestImpl(mRenderFrameHost, delegate, sNativeObserverForTest);
return new ComponentPaymentRequestImpl(
new PaymentRequestImpl(mRenderFrameHost, delegate, sNativeObserverForTest));
} }
} }
...@@ -53,6 +53,8 @@ import org.chromium.components.autofill.EditableOption; ...@@ -53,6 +53,8 @@ import org.chromium.components.autofill.EditableOption;
import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.page_info.CertificateChainHelper; import org.chromium.components.page_info.CertificateChainHelper;
import org.chromium.components.payments.AbortReason; import org.chromium.components.payments.AbortReason;
import org.chromium.components.payments.ComponentPaymentRequestImpl;
import org.chromium.components.payments.ComponentPaymentRequestImpl.ComponentPaymentRequestDelegate;
import org.chromium.components.payments.CurrencyFormatter; import org.chromium.components.payments.CurrencyFormatter;
import org.chromium.components.payments.ErrorMessageUtil; import org.chromium.components.payments.ErrorMessageUtil;
import org.chromium.components.payments.ErrorStrings; import org.chromium.components.payments.ErrorStrings;
...@@ -103,6 +105,7 @@ import org.chromium.payments.mojom.PaymentValidationErrors; ...@@ -103,6 +105,7 @@ import org.chromium.payments.mojom.PaymentValidationErrors;
import org.chromium.url.GURL; import org.chromium.url.GURL;
import org.chromium.url.Origin; import org.chromium.url.Origin;
import java.lang.ref.WeakReference;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
...@@ -117,13 +120,14 @@ import java.util.Queue; ...@@ -117,13 +120,14 @@ import java.util.Queue;
import java.util.Set; import java.util.Set;
/** /**
* Android implementation of the PaymentRequest service defined in * This is the Clank specific parts of {@link PaymentRequest}, with the parts shared with WebLayer
* third_party/blink/public/mojom/payments/payment_request.mojom. * living in {@link ComponentPaymentRequestImpl}.
*/ */
public class PaymentRequestImpl public class PaymentRequestImpl
implements PaymentRequest, PaymentRequestUI.Client, PaymentAppFactoryDelegate, implements ComponentPaymentRequestDelegate, PaymentRequestUI.Client,
PaymentAppFactoryParams, PaymentRequestUpdateEventListener, PaymentAppFactoryDelegate, PaymentAppFactoryParams,
PaymentApp.AbortCallback, PaymentApp.InstrumentDetailsCallback, PaymentRequestUpdateEventListener, PaymentApp.AbortCallback,
PaymentApp.InstrumentDetailsCallback,
PaymentResponseHelper.PaymentResponseRequesterDelegate, FocusChangedObserver, PaymentResponseHelper.PaymentResponseRequesterDelegate, FocusChangedObserver,
NormalizedAddressRequestDelegate, SettingsAutofillAndPaymentsObserver.Observer, NormalizedAddressRequestDelegate, SettingsAutofillAndPaymentsObserver.Observer,
PaymentDetailsConverter.MethodChecker, PaymentHandlerUiObserver { PaymentDetailsConverter.MethodChecker, PaymentHandlerUiObserver {
...@@ -312,6 +316,8 @@ public class PaymentRequestImpl ...@@ -312,6 +316,8 @@ public class PaymentRequestImpl
private static final Comparator<Completable> COMPLETENESS_COMPARATOR = private static final Comparator<Completable> COMPLETENESS_COMPARATOR =
(a, b) -> (compareCompletablesByCompleteness(b, a)); (a, b) -> (compareCompletablesByCompleteness(b, a));
private WeakReference<ComponentPaymentRequestImpl> mComponentPaymentRequestImpl;
private PaymentOptions mPaymentOptions; private PaymentOptions mPaymentOptions;
private boolean mRequestShipping; private boolean mRequestShipping;
private boolean mRequestPayerName; private boolean mRequestPayerName;
...@@ -621,6 +627,13 @@ public class PaymentRequestImpl ...@@ -621,6 +627,13 @@ public class PaymentRequestImpl
mPaymentUisShowStateReconciler = new PaymentUisShowStateReconciler(); mPaymentUisShowStateReconciler = new PaymentUisShowStateReconciler();
} }
@Override
public void setComponentPaymentRequestImpl(
WeakReference<ComponentPaymentRequestImpl> componentPaymentRequestImpl) {
assert mComponentPaymentRequestImpl == null;
mComponentPaymentRequestImpl = componentPaymentRequestImpl;
}
/** /**
* Called by the merchant website to initialize the payment request data. * Called by the merchant website to initialize the payment request data.
*/ */
......
...@@ -68,6 +68,7 @@ android_library("java") { ...@@ -68,6 +68,7 @@ android_library("java") {
annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ]
sources = [ sources = [
"java/src/org/chromium/components/payments/Address.java", "java/src/org/chromium/components/payments/Address.java",
"java/src/org/chromium/components/payments/ComponentPaymentRequestImpl.java",
"java/src/org/chromium/components/payments/CurrencyFormatter.java", "java/src/org/chromium/components/payments/CurrencyFormatter.java",
"java/src/org/chromium/components/payments/ErrorMessageUtil.java", "java/src/org/chromium/components/payments/ErrorMessageUtil.java",
"java/src/org/chromium/components/payments/JniPaymentApp.java", "java/src/org/chromium/components/payments/JniPaymentApp.java",
......
// 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.components.payments;
import org.chromium.mojo.system.MojoException;
import org.chromium.payments.mojom.PaymentDetails;
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.payments.mojom.PaymentValidationErrors;
import java.lang.ref.WeakReference;
/**
* Android implementation of the PaymentRequest service defined in
* third_party/blink/public/mojom/payments/payment_request.mojom. This component provides the parts
* shareable between Clank and WebLayer. The Clank specific logic lives in
* org.chromium.chrome.browser.payments.PaymentRequestImpl.
*/
public class ComponentPaymentRequestImpl implements PaymentRequest {
private final ComponentPaymentRequestDelegate mDelegate;
/**
* The delegate of {@link ComponentPaymentRequestImpl}.
*/
public interface ComponentPaymentRequestDelegate {
// The implementation of the same methods in {@link PaymentRequest).
void init(PaymentRequestClient client, PaymentMethodData[] methodData,
PaymentDetails details, PaymentOptions options, boolean googlePayBridgeEligible);
void show(boolean isUserGesture, boolean waitForUpdatedDetails);
void updateWith(PaymentDetails details);
void onPaymentDetailsNotUpdated();
void abort();
void complete(int result);
void retry(PaymentValidationErrors errors);
void hasEnrolledInstrument(boolean perMethodQuota);
void canMakePayment();
void close();
void onConnectionError(MojoException e);
/**
* Set a weak reference to the client of this delegate.
* @param componentsPaymentRequestImpl A weak reference to the client of this delegate.
*/
void setComponentPaymentRequestImpl(
WeakReference<ComponentPaymentRequestImpl> componentsPaymentRequestImpl);
}
/**
* Build an instance of the PaymentRequest implementation.
* @param delegate A delegate of the instance.
*/
public ComponentPaymentRequestImpl(ComponentPaymentRequestDelegate delegate) {
mDelegate = delegate;
mDelegate.setComponentPaymentRequestImpl(new WeakReference<>(this));
}
@Override
public void init(PaymentRequestClient client, PaymentMethodData[] methodData,
PaymentDetails details, PaymentOptions options, boolean googlePayBridgeEligible) {
mDelegate.init(client, methodData, details, options, googlePayBridgeEligible);
}
@Override
public void show(boolean isUserGesture, boolean waitForUpdatedDetails) {
mDelegate.show(isUserGesture, waitForUpdatedDetails);
}
@Override
public void updateWith(PaymentDetails details) {
mDelegate.updateWith(details);
}
@Override
public void onPaymentDetailsNotUpdated() {
mDelegate.onPaymentDetailsNotUpdated();
}
@Override
public void abort() {
mDelegate.abort();
}
@Override
public void complete(int result) {
mDelegate.complete(result);
}
@Override
public void retry(PaymentValidationErrors errors) {
mDelegate.retry(errors);
}
@Override
public void canMakePayment() {
mDelegate.canMakePayment();
}
@Override
public void hasEnrolledInstrument(boolean perMethodQuota) {
mDelegate.hasEnrolledInstrument(perMethodQuota);
}
@Override
public void close() {
mDelegate.close();
}
@Override
public void onConnectionError(MojoException e) {
mDelegate.onConnectionError(e);
}
}
...@@ -201,8 +201,8 @@ enum PaymentComplete { ...@@ -201,8 +201,8 @@ enum PaymentComplete {
// Implemented in the browser process. Not sandboxed. Deals with trusted data. // Implemented in the browser process. Not sandboxed. Deals with trusted data.
// Android implementation: // Android implementation (Clank, WebLayer):
// chrome/android/java/src/org/chromium/chrome/browser/payments/PaymentRequestImpl.java // components/payments/content/android/java/src/org/chromium/components/payments/ComponentPaymentRequestImpl.java
// Desktop (Windows, ChromeOS, Linux, MacOS) implementation: // Desktop (Windows, ChromeOS, Linux, MacOS) implementation:
// components/payments/content/payment_request.h // components/payments/content/payment_request.h
interface PaymentRequest { interface PaymentRequest {
......
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