Add @NullMarked to //components/payments
Patch 1 contains the automated changes made by the annotator.
Patch 2 and 4 and 5 contains the manual changes made by me.
Bug: 389129271
Change-Id: I172b42479e35ae6ee4c38a80c6bf6243492fcc38
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6299969
Reviewed-by: Peter Wen <wnwen@chromium.org>
Reviewed-by: Andrew Grieve <agrieve@chromium.org>
Commit-Queue: Peter Wen <wnwen@chromium.org>
Commit-Queue: Martin Kong <martinkong@google.com>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1424750}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
index 380a59a..12c5756 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentApp.java
@@ -9,13 +9,14 @@
import android.os.Handler;
import android.text.TextUtils;
-import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.ContextUtils;
import org.chromium.base.ThreadUtils;
import org.chromium.base.task.PostTask;
import org.chromium.base.task.TaskTraits;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.payments.intent.IsReadyToPayServiceHelper;
import org.chromium.components.payments.intent.WebPaymentIntentHelper;
import org.chromium.components.payments.intent.WebPaymentIntentHelperType;
@@ -40,31 +41,32 @@
* The point of interaction with a locally installed 3rd party native Android payment app.
* https://web.dev/articles/android-payment-apps-developers-guide
*/
+@NullMarked
public class AndroidPaymentApp extends PaymentApp
implements IsReadyToPayServiceHelper.ResultHandler, WindowAndroid.IntentCallback {
private final Handler mHandler;
private final AndroidIntentLauncher mLauncher;
- @Nullable private final DialogController mDialogController;
+ private final @Nullable DialogController mDialogController;
private final Set<String> mMethodNames;
private final boolean mIsIncognito;
private final String mPackageName;
private final String mPayActivityName;
- @Nullable private final String mIsReadyToPayServiceName;
- @Nullable private final String mPaymentDetailsUpdateServiceName;
+ private final @Nullable String mIsReadyToPayServiceName;
+ private final @Nullable String mPaymentDetailsUpdateServiceName;
private final SupportedDelegations mSupportedDelegations;
private final boolean mShowReadyToPayDebugInfo;
private final boolean mRemoveDeprecatedFields;
- private IsReadyToPayCallback mIsReadyToPayCallback;
- private InstrumentDetailsCallback mInstrumentDetailsCallback;
- private IsReadyToPayServiceHelper mIsReadyToPayServiceHelper;
- private PaymentDetailsUpdateConnection mPaymentDetailsUpdateConnection;
- @Nullable private String mApplicationIdentifierToHide;
+ private @Nullable IsReadyToPayCallback mIsReadyToPayCallback;
+ private @Nullable InstrumentDetailsCallback mInstrumentDetailsCallback;
+ private @Nullable IsReadyToPayServiceHelper mIsReadyToPayServiceHelper;
+ private @Nullable PaymentDetailsUpdateConnection mPaymentDetailsUpdateConnection;
+ private @Nullable String mApplicationIdentifierToHide;
private boolean mBypassIsReadyToPayServiceInTest;
private boolean mIsPreferred;
// Set inside launchPaymentApp and used to validate the received response.
- @Nullable private WebPaymentIntentHelperType.PaymentOptions mPaymentOptions;
+ private WebPaymentIntentHelperType.@Nullable PaymentOptions mPaymentOptions;
/**
* Builds the point of interaction with a locally installed 3rd party native Android payment
@@ -179,7 +181,7 @@
Map<String, PaymentMethodData> methodDataMap,
String origin,
String iframeOrigin,
- @Nullable byte[][] certificateChain,
+ byte @Nullable [][] certificateChain,
Map<String, PaymentDetailsModifier> modifiers,
IsReadyToPayCallback callback) {
ThreadUtils.assertOnUiThread();
@@ -243,8 +245,7 @@
}
@Override
- @Nullable
- public String getApplicationIdentifierToHide() {
+ public @Nullable String getApplicationIdentifierToHide() {
return mApplicationIdentifierToHide;
}
@@ -259,7 +260,7 @@
final String merchantName,
String origin,
String iframeOrigin,
- final byte[][] certificateChain,
+ final byte @Nullable [][] certificateChain,
final Map<String, PaymentMethodData> methodDataMap,
final PaymentItem total,
final List<PaymentItem> displayItems,
@@ -348,7 +349,7 @@
String merchantName,
String origin,
String iframeOrigin,
- byte[][] certificateChain,
+ byte @Nullable [][] certificateChain,
Map<String, PaymentMethodData> methodDataMap,
PaymentItem total,
List<PaymentItem> displayItems,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
index a50483c..8476e1c 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFactory.java
@@ -10,6 +10,7 @@
import android.text.TextUtils;
import android.util.Pair;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.components.payments.intent.WebPaymentIntentHelper;
import java.util.HashMap;
@@ -17,6 +18,7 @@
import java.util.Map;
/** Looks up installed third party Android payment apps. */
+@NullMarked
public class AndroidPaymentAppFactory implements PaymentAppFactoryInterface {
// PaymentAppFactoryInterface implementation.
@Override
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
index 7be1534..47466e6 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/AndroidPaymentAppFinder.java
@@ -4,17 +4,21 @@
package org.chromium.components.payments;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.text.TextUtils;
-import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import org.chromium.base.Log;
import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.Contract;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.payments.PaymentManifestVerifier.ManifestVerifyCallback;
import org.chromium.components.payments.intent.WebPaymentIntentHelper;
import org.chromium.payments.mojom.PaymentDetailsModifier;
@@ -35,6 +39,7 @@
* payment method names are exceptions: these are common payment method names that do not have a
* manifest and can be used by any payment app.
*/
+@NullMarked
public class AndroidPaymentAppFinder implements ManifestVerifyCallback {
private static final String TAG = "PaymentAppFinder";
@@ -67,10 +72,10 @@
public static final String META_DATA_NAME_OF_SUPPORTED_DELEGATIONS =
"org.chromium.payment_supported_delegations";
- private static PackageManagerDelegate sPackageManagerDelegateForTest;
- private static PaymentManifestDownloader sDownloaderForTest;
+ private static @Nullable PackageManagerDelegate sPackageManagerDelegateForTest;
+ private static @Nullable PaymentManifestDownloader sDownloaderForTest;
private static boolean sBypassIsReadyToPayServiceInTest;
- private static AndroidIntentLauncher sAndroidIntentLauncherForTest;
+ private static @Nullable AndroidIntentLauncher sAndroidIntentLauncherForTest;
private final Set<GURL> mUrlPaymentMethods = new HashSet<>();
private final PaymentManifestDownloader mDownloader;
@@ -285,7 +290,8 @@
|| urlMethod.equals(defaultUrlMethod);
}
- private ResolveInfo findAppWithPackageName(List<ResolveInfo> apps, String packageName) {
+ private @Nullable ResolveInfo findAppWithPackageName(
+ List<ResolveInfo> apps, String packageName) {
assert packageName != null;
for (int i = 0; i < apps.size(); i++) {
ResolveInfo app = apps.get(i);
@@ -555,8 +561,8 @@
* @param metaDataName The name of the string array meta data to be retrieved.
* @return The string array.
*/
- @Nullable
- private String[] getStringArrayMetaData(ActivityInfo activityInfo, String metaDataName) {
+ private String @Nullable [] getStringArrayMetaData(
+ ActivityInfo activityInfo, String metaDataName) {
if (activityInfo.metaData == null) return null;
int resId = activityInfo.metaData.getInt(metaDataName);
@@ -694,7 +700,8 @@
* @param resolveInfo The payment app that's allowed to use the method name.
* @param methodName The method name that can be used by the app.
*/
- private void onValidPaymentAppForPaymentMethodName(ResolveInfo resolveInfo, String methodName) {
+ private void onValidPaymentAppForPaymentMethodName(
+ ResolveInfo resolveInfo, String methodName) {
if (mFactoryDelegate.getParams().hasClosed()) return;
String packageName = resolveInfo.activityInfo.packageName;
@@ -729,7 +736,7 @@
app =
new AndroidPaymentApp(
sAndroidIntentLauncherForTest == null
- ? mFactoryDelegate.getAndroidIntentLauncher()
+ ? assumeNonNull(mFactoryDelegate.getAndroidIntentLauncher())
: sAndroidIntentLauncherForTest,
mFactoryDelegate.getDialogController(),
packageName,
@@ -779,14 +786,14 @@
* @param url The URL to stringify.
* @return The URL string without a trailing slash, or null if the input parameter is null.
*/
- @Nullable
- private static String urlToStringWithoutTrailingSlash(@Nullable GURL url) {
+ @Contract("!null -> !null")
+ private static @Nullable String urlToStringWithoutTrailingSlash(@Nullable GURL url) {
if (url == null) return null;
return removeTrailingSlash(url.getSpec());
}
- @Nullable
- private static String removeTrailingSlash(@Nullable String string) {
+ @Contract("!null -> !null")
+ private static @Nullable String removeTrailingSlash(@Nullable String string) {
if (string == null) return null;
return string.endsWith("/") ? string.substring(0, string.length() - 1) : string;
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java b/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
index 2cb1cf6c..040aa8b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/BrowserPaymentRequest.java
@@ -4,8 +4,8 @@
package org.chromium.components.payments;
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.content_public.browser.WebContents;
import org.chromium.payments.mojom.PaymentComplete;
import org.chromium.payments.mojom.PaymentDetails;
@@ -24,6 +24,7 @@
* The browser part of the PaymentRequest implementation. The browser here can be either the
* Android Chrome browser or the WebLayer "browser".
*/
+@NullMarked
public interface BrowserPaymentRequest {
/**
* The client of the interface calls this when it has received the payment details update
@@ -98,10 +99,9 @@
* implementer may consider other factors before deciding whether to show or skip.
* @return The error of the showing if any; null if success.
*/
- @Nullable
- String showOrSkipAppSelector(
+ @Nullable String showOrSkipAppSelector(
boolean isShowWaitingForUpdatedDetails,
- PaymentItem total,
+ @Nullable PaymentItem total,
boolean shouldSkipAppSelector);
/**
@@ -128,8 +128,7 @@
*
* @return The error if it fails; null otherwise.
*/
- @Nullable
- default String onShowCalledAndAppsQueriedAndDetailsFinalized() {
+ default @Nullable String onShowCalledAndAppsQueriedAndDetailsFinalized() {
return null;
}
@@ -166,7 +165,7 @@
* @param ukmSourceId The ukm source id assigned to the payment app.
* @return The created WebContents.
*/
- default WebContents openPaymentHandlerWindow(GURL url, long ukmSourceId) {
+ default @Nullable WebContents openPaymentHandlerWindow(GURL url, long ukmSourceId) {
return null;
}
@@ -178,8 +177,7 @@
* their payment apps.
* @return The error if it fails; null otherwise.
*/
- @Nullable
- default String continueShowWithUpdatedDetails(
+ default @Nullable String continueShowWithUpdatedDetails(
PaymentDetails details, boolean isFinishedQueryingPaymentApps) {
return null;
}
@@ -225,8 +223,7 @@
* Can return null when ANDROID_PAYMENT_INTENTS_OMIT_DEPRECATED_PARAMETERS is enabled or
* when the page is localhost or is a file.
*/
- @Nullable
- byte[][] getCertificateChain();
+ byte @Nullable [][] getCertificateChain();
/**
* @return The launcher for Android intent-based payment app.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java b/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
index 02e5a7d..8e27fc3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/CSPCheckerBridge.java
@@ -4,12 +4,11 @@
package org.chromium.components.payments;
-import androidx.annotation.NonNull;
-
import org.jni_zero.CalledByNative;
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.url.GURL;
/**
@@ -24,6 +23,7 @@
* bridge.destroy();
*/
@JNINamespace("payments")
+@NullMarked
public class CSPCheckerBridge {
// Performs the CSP checks.
private final CSPChecker mImpl;
@@ -35,7 +35,7 @@
* Initializes the CSP checker bridge.
* @param cspChecker The object that will perform the CSP checks.
*/
- public CSPCheckerBridge(@NonNull CSPChecker cspChecker) {
+ public CSPCheckerBridge(CSPChecker cspChecker) {
mImpl = cspChecker;
mNativeBridge = CSPCheckerBridgeJni.get().createNativeCSPChecker(this);
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
index 96a0fb9..f9ac553 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/ErrorMessageUtil.java
@@ -9,10 +9,13 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
+
import java.util.Set;
/** Error messages for web payment. */
@JNINamespace("payments::android")
+@NullMarked
public class ErrorMessageUtil {
/**
* Returns the "payment method not supported" message.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java b/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
index 219966c..11fc002 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/HasEnrolledInstrumentQuery.java
@@ -9,6 +9,7 @@
import org.jni_zero.JniType;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
import org.chromium.payments.mojom.PaymentMethodData;
@@ -17,6 +18,7 @@
/** Checks whether hasEnrolledInstrument() can be queried. */
@JNINamespace("payments")
+@NullMarked
public class HasEnrolledInstrumentQuery {
/**
* Checks whether the given hasEnrolledInstrument() query is allowed.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java b/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
index b13c456f..39f01ef3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/InvalidPaymentRequest.java
@@ -4,6 +4,8 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.mojo.system.MojoException;
import org.chromium.payments.mojom.CanMakePaymentQueryResult;
import org.chromium.payments.mojom.HasEnrolledInstrumentQueryResult;
@@ -19,8 +21,9 @@
* An implementation of PaymentRequest that immediately rejects all connections.
* Necessary because Mojo does not handle null returned from createImpl().
*/
+@NullMarked
public final class InvalidPaymentRequest implements PaymentRequest {
- private PaymentRequestClient mClient;
+ private @Nullable PaymentRequestClient mClient;
@Override
public void init(
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
index 176e0bd5..1c30452 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/JniPaymentApp.java
@@ -8,12 +8,12 @@
import android.graphics.drawable.BitmapDrawable;
import android.os.Handler;
-import androidx.annotation.Nullable;
-
import org.jni_zero.CalledByNative;
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.payments.mojom.PaymentDetailsModifier;
import org.chromium.payments.mojom.PaymentItem;
import org.chromium.payments.mojom.PaymentMethodData;
@@ -31,6 +31,7 @@
/** Wrapper around a C++ payment app. */
@JNINamespace("payments")
+@NullMarked
public class JniPaymentApp extends PaymentApp {
private final Handler mHandler = new Handler();
private final @PaymentAppType int mPaymentAppType;
@@ -38,8 +39,8 @@
// The Java object owns the C++ payment app and frees it in dismissInstrument().
private long mNativeObject;
- private AbortCallback mAbortCallback;
- private InstrumentDetailsCallback mInvokeCallback;
+ private @Nullable AbortCallback mAbortCallback;
+ private @Nullable InstrumentDetailsCallback mInvokeCallback;
@CalledByNative
private JniPaymentApp(
@@ -170,7 +171,7 @@
String merchantName,
String origin,
String iframeOrigin,
- @Nullable byte[][] certificateChain,
+ byte @Nullable [][] certificateChain,
Map<String, PaymentMethodData> methodDataMap,
PaymentItem total,
List<PaymentItem> displayItems,
@@ -204,14 +205,12 @@
}
@Override
- @Nullable
- public String getApplicationIdentifierToHide() {
+ public @Nullable String getApplicationIdentifierToHide() {
return JniPaymentAppJni.get().getApplicationIdentifierToHide(mNativeObject);
}
@Override
- @Nullable
- public Set<String> getApplicationIdentifiersThatHideThisApp() {
+ public @Nullable Set<String> getApplicationIdentifiersThatHideThisApp() {
return new HashSet<>(
Arrays.asList(
JniPaymentAppJni.get()
@@ -261,7 +260,7 @@
String[] getInstrumentMethodNames(long nativeJniPaymentApp);
boolean isValidForPaymentMethodData(
- long nativeJniPaymentApp, String method, ByteBuffer dataByteBuffer);
+ long nativeJniPaymentApp, String method, @Nullable ByteBuffer dataByteBuffer);
boolean handlesShippingAddress(long nativeJniPaymentApp);
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java b/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
index 71e38f4..438ed3b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/JourneyLogger.java
@@ -7,12 +7,14 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
import java.util.List;
/** A class used to record journey metrics for the Payment Request feature. */
@JNINamespace("payments")
+@NullMarked
public class JourneyLogger {
/** Pointer to the native implementation. */
private long mJourneyLoggerAndroid;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java b/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
index 23a0fc5f..13ff9f8b 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
@@ -4,6 +4,8 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.mojo.system.MojoException;
import org.chromium.payments.mojom.PaymentDetails;
import org.chromium.payments.mojom.PaymentMethodData;
@@ -16,9 +18,10 @@
* Guards against invalid mojo parameters and enforces correct call sequence from mojo IPC in the
* untrusted renderer, so PaymentRequestService does not have to.
*/
+@NullMarked
public class MojoPaymentRequestGateKeeper implements PaymentRequest {
private final Delegate mDelegate;
- private PaymentRequestService mPaymentRequestService;
+ private @Nullable PaymentRequestService mPaymentRequestService;
/** The delegate of the class. */
public interface Delegate {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
index 3c53083..e68aadc 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/OriginSecurityChecker.java
@@ -7,10 +7,12 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.url.GURL;
/** Helper for origin security. */
@JNINamespace("payments")
+@NullMarked
public class OriginSecurityChecker {
/**
* Returns true for a valid URL from a secure origin, e.g., http://localhost,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
index dee642b..bcfdc59 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAddressTypeConverter.java
@@ -21,7 +21,9 @@
* @param address The org.chromium.payments.mojom.PaymentAddress to be converted.
* @return The converted address with type org.chromium.components.payments.Address.
*/
- public static @Nullable Address convertPaymentAddressFromMojo(PaymentAddress address) {
+ @Contract("!null -> !null")
+ public static @Nullable Address convertPaymentAddressFromMojo(
+ @Nullable PaymentAddress address) {
if (address == null) return null;
return new Address(
address.country,
@@ -41,7 +43,8 @@
* @return The converted address with type org.chromium.payments.mojom.PaymentAddress.
*/
@Contract("!null -> !null")
- public static @Nullable PaymentAddress convertAddressToMojoPaymentAddress(Address address) {
+ public static @Nullable PaymentAddress convertAddressToMojoPaymentAddress(
+ @Nullable Address address) {
if (address == null) return null;
PaymentAddress result = new PaymentAddress();
result.country = address.country;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
index 2eb44239..93b7da8e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentApp.java
@@ -59,7 +59,7 @@
void onInstrumentAbortResult(boolean abortSucceeded);
}
- protected PaymentApp(String id, String label, String sublabel, Drawable icon) {
+ protected PaymentApp(String id, String label, @Nullable String sublabel, Drawable icon) {
super(id, maybeElide(removeLineTerminators(label)), sublabel, icon);
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
index 3bfa9757d..7ee76c82 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppFactoryParams.java
@@ -28,16 +28,16 @@
* @return The scheme, host, and port of the last committed URL of the top-level context as
* formatted by UrlFormatter.formatUrlForSecurityDisplay().
*/
- default @Nullable String getTopLevelOrigin() {
- return null;
+ default String getTopLevelOrigin() {
+ throw new UnsupportedOperationException();
}
/**
* @return The scheme, host, and port of the last committed URL of the iframe that invoked the
* PaymentRequest API as formatted by UrlFormatter.formatUrlForSecurityDisplay().
*/
- default @Nullable String getPaymentRequestOrigin() {
- return null;
+ default String getPaymentRequestOrigin() {
+ throw new UnsupportedOperationException();
}
/**
@@ -45,8 +45,8 @@
* security features like 'Sec-Fetch-Site' and 'Cross-Origin-Resource-Policy'. Should not be
* null.
*/
- default @Nullable Origin getPaymentRequestSecurityOrigin() {
- return null;
+ default Origin getPaymentRequestSecurityOrigin() {
+ throw new UnsupportedOperationException();
}
/**
@@ -64,14 +64,18 @@
return false;
}
- /** @return The listener for payment method, shipping address, and shipping option change events. */
+ /**
+ * @return The listener for payment method, shipping address, and shipping option change events.
+ */
default @Nullable PaymentRequestUpdateEventListener getPaymentRequestUpdateEventListener() {
return null;
}
- /** @return The Payment Request information received from the merchant. */
- default @Nullable PaymentRequestSpec getSpec() {
- return null;
+ /**
+ * @return The Payment Request information received from the merchant.
+ */
+ default PaymentRequestSpec getSpec() {
+ throw new UnsupportedOperationException();
}
/**
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
index 3ac45a38..cbaac43 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentAppServiceBridge.java
@@ -9,11 +9,14 @@
import org.chromium.base.ResettersForTesting;
import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.url_formatter.SchemeDisplay;
import org.chromium.components.url_formatter.UrlFormatter;
import org.chromium.content_public.browser.RenderFrameHost;
/** Native bridge for finding payment apps. */
+@NullMarked
public class PaymentAppServiceBridge implements PaymentAppFactoryInterface {
private static boolean sCanMakePaymentForTesting;
@@ -152,7 +155,7 @@
RenderFrameHost initiatorRenderFrameHost,
String topOrigin,
PaymentRequestSpec spec,
- String twaPackageName,
+ @Nullable String twaPackageName,
boolean mayCrawlForInstallablePaymentApps,
boolean isOffTheRecord,
long nativeCSPCheckerAndroid,
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
index 83284c4..102ce77 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentDetailsConverter.java
@@ -4,6 +4,7 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.payments.mojom.PaymentDetails;
import org.chromium.payments.mojom.PaymentHandlerMethodData;
import org.chromium.payments.mojom.PaymentHandlerModifier;
@@ -16,6 +17,7 @@
* Redacts and converts the payment details update from the merchant into a data structure to be
* sent to the invoked payment handler.
*/
+@NullMarked
public class PaymentDetailsConverter {
/**
* To be implemented by the object that can check whether the invoked payment instrument is
@@ -47,7 +49,9 @@
* @return The data structure that can be sent to the invoked payment handler.
*/
public static PaymentRequestDetailsUpdate convertToPaymentRequestDetailsUpdate(
- PaymentDetails details, MethodChecker methodChecker, PaymentApp invokedPaymentApp) {
+ PaymentDetails details,
+ MethodChecker methodChecker,
+ PaymentApp invokedPaymentApp) {
// Keep in sync with components/payments/content/payment_details_converter.cc.
assert details != null;
assert methodChecker != null;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
index f747bcfc..6745229 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentHandlerNavigationThrottle.java
@@ -7,10 +7,12 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
/** The navigation throttle of the payment handler pages. */
@JNINamespace("payments::android")
+@NullMarked
public class PaymentHandlerNavigationThrottle {
/**
* Marks the given WebContents as a payment handler WebContents. This will allow the callers of
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
index 565ca70e..9786134 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestDownloader.java
@@ -9,6 +9,8 @@
import org.jni_zero.NativeMethods;
import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.content_public.browser.WebContents;
import org.chromium.url.GURL;
import org.chromium.url.Origin;
@@ -18,6 +20,7 @@
* components/payments/core/payment_manifest_downloader.h
*/
@JNINamespace("payments")
+@NullMarked
public class PaymentManifestDownloader {
/** Interface for the callback to invoke when finished downloading. */
public interface ManifestDownloadCallback {
@@ -54,7 +57,7 @@
}
private long mNativeObject;
- private CSPCheckerBridge mCSPCheckerBridge;
+ private @Nullable CSPCheckerBridge mCSPCheckerBridge;
/**
* Initializes the native downloader.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
index 9d3a7bdd..25f665e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestParser.java
@@ -9,11 +9,13 @@
import org.jni_zero.NativeMethods;
import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
import org.chromium.url.GURL;
/** Parses payment manifests in a utility process. */
@JNINamespace("payments")
+@NullMarked
public class PaymentManifestParser {
/** Interface for the callback to invoke when finished parsing. */
public interface ManifestParseCallback {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
index 7a338b8..5a46fd9 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestVerifier.java
@@ -4,13 +4,15 @@
package org.chromium.components.payments;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
import android.content.pm.PackageInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.Signature;
-import androidx.annotation.Nullable;
-
import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.payments.PaymentManifestDownloader.ManifestDownloadCallback;
import org.chromium.components.payments.PaymentManifestParser.ManifestParseCallback;
import org.chromium.url.GURL;
@@ -35,6 +37,7 @@
* Spec:
* https://docs.google.com/document/d/1izV4uC-tiRJG3JLooqY3YRLU22tYOsLTNq0P_InPJeE/edit#heading=h.cjp3jlnl47h5
*/
+@NullMarked
public class PaymentManifestVerifier
implements ManifestDownloadCallback,
ManifestParseCallback,
@@ -84,6 +87,7 @@
/** Identifying information about an installed native Android payment app. */
private static class AppInfo {
/** Identifies a native Android payment app. */
+ @SuppressWarnings("NullAway.Init") // This is set to a non-null value immediately after init
public ResolveInfo resolveInfo;
/** The version code for the native Android payment app, e.g., 123. */
@@ -93,7 +97,7 @@
* The SHA256 certificate fingerprints for the native Android payment app, .e.g,
* ["308201dd30820146020101300d06092a864886f70d010105050030"].
*/
- public Set<String> sha256CertFingerprints;
+ public @Nullable Set<String> sha256CertFingerprints;
}
private static final String TAG = "PaymentManifest";
@@ -130,10 +134,10 @@
private final PaymentManifestParser mParser;
private final PackageManagerDelegate mPackageManagerDelegate;
private final ManifestVerifyCallback mCallback;
- private final MessageDigest mMessageDigest;
+ private final @Nullable MessageDigest mMessageDigest;
/** The origin of the payment method manifest after all redirects have been followed. */
- private Origin mPaymentMethodManifestOrigin;
+ private @Nullable Origin mPaymentMethodManifestOrigin;
/**
* The number of web app manifests that have not yet been retrieved from cache or downloaded
@@ -237,6 +241,8 @@
appInfo.version = packageInfo.versionCode;
appInfo.sha256CertFingerprints = new HashSet<>();
Signature[] signatures = packageInfo.signatures;
+ assumeNonNull(signatures);
+ assumeNonNull(mMessageDigest);
for (int i = 0; i < signatures.length; i++) {
mMessageDigest.update(signatures[i].toByteArray());
@@ -263,8 +269,6 @@
* @return A string representation of the input bytes, e.g., "0123456789abcdef".
*/
private static String byteArrayToString(byte[] input) {
- if (input == null) return null;
-
StringBuilder builder = new StringBuilder(input.length * 2);
Formatter formatter = new Formatter(builder);
for (byte b : input) {
@@ -344,7 +348,8 @@
Set<String> validAppPackageNames = verifyAppWithWebAppManifest(manifest);
for (String validAppPackageName : validAppPackageNames) {
mCallback.onValidDefaultPaymentApp(
- mMethodName, mDefaultApplications.get(validAppPackageName).resolveInfo);
+ mMethodName,
+ assumeNonNull(mDefaultApplications.get(validAppPackageName)).resolveInfo);
}
mPendingWebAppManifestsCount--;
@@ -400,6 +405,7 @@
for (int i = 0; i < webAppManifestUris.length; i++) {
if (mAtLeastOneManifestFailedToDownloadOrParse) return;
assert webAppManifestUris[i] != null;
+ assumeNonNull(mPaymentMethodManifestOrigin);
mDownloader.downloadWebAppManifest(
mPaymentMethodManifestOrigin, webAppManifestUris[i], this);
}
@@ -428,7 +434,8 @@
Set<String> validAppPackageNames = verifyAppWithWebAppManifest(manifest);
for (String validAppPackageName : validAppPackageNames) {
mCallback.onValidDefaultPaymentApp(
- mMethodName, mDefaultApplications.get(validAppPackageName).resolveInfo);
+ mMethodName,
+ assumeNonNull(mDefaultApplications.get(validAppPackageName)).resolveInfo);
}
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
index 05b06da..74d63940 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentManifestWebDataService.java
@@ -8,10 +8,12 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
/** Java wrapper of the payment manifest web data service. */
@JNINamespace("payments")
+@NullMarked
public class PaymentManifestWebDataService {
/** Interface for the callback to invoke when getting data from the web data service. */
public interface PaymentManifestWebDataServiceCallback {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
index 84970eeca..661b4ee19 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentNotShownError.java
@@ -4,9 +4,11 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.payments.mojom.PaymentErrorReason;
/** The error of payment UIs not being shown. */
+@NullMarked
public class PaymentNotShownError {
private final String mErrorMessage;
private final int mReason;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
index 3510fdc..1f1181f 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentOptionsUtils.java
@@ -4,11 +4,12 @@
package org.chromium.components.payments;
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.payments.mojom.PaymentOptions;
/** A collection of utility methods for PaymentOptions. */
+@NullMarked
public class PaymentOptionsUtils {
/**
* @param options Any PaymentOption, can be null.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
index 8bd6c677..e35c0be 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestParams.java
@@ -6,6 +6,7 @@
import org.chromium.build.annotations.MockedInTests;
import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.payments.mojom.PaymentDetailsModifier;
import org.chromium.payments.mojom.PaymentItem;
import org.chromium.payments.mojom.PaymentMethodData;
@@ -43,5 +44,5 @@
* @return The raw total amount being charged - the total property of the PaymentDetails of
* payment request.
*/
- PaymentItem getRawTotal();
+ @Nullable PaymentItem getRawTotal();
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
index c29d54db..da89e4a9 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestService.java
@@ -4,10 +4,11 @@
package org.chromium.components.payments;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
import android.content.Context;
import android.text.TextUtils;
-import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.collection.ArrayMap;
@@ -17,6 +18,8 @@
import org.chromium.base.ResettersForTesting;
import org.chromium.base.metrics.RecordHistogram;
import org.chromium.base.supplier.Supplier;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.components.url_formatter.SchemeDisplay;
import org.chromium.components.url_formatter.UrlFormatter;
@@ -65,6 +68,7 @@
* class need to close them with {@link PaymentRequestService#close()}, after which no usage is
* allowed.
*/
+@NullMarked
public class PaymentRequestService
implements PaymentAppFactoryDelegate,
PaymentAppFactoryParams,
@@ -80,29 +84,37 @@
* Hold the currently showing PaymentRequest. Used to prevent showing more than one
* PaymentRequest UI per browser process.
*/
- private static PaymentRequestService sShowingPaymentRequest;
+ private static @Nullable PaymentRequestService sShowingPaymentRequest;
- private static PaymentRequestServiceObserverForTest sObserverForTest;
- private static NativeObserverForTest sNativeObserverForTest;
+ private static @Nullable PaymentRequestServiceObserverForTest sObserverForTest;
+ private static @Nullable NativeObserverForTest sNativeObserverForTest;
private static boolean sIsLocalHasEnrolledInstrumentQueryQuotaEnforcedForTest;
private final Runnable mOnClosedListener;
private final RenderFrameHost mRenderFrameHost;
private final Delegate mDelegate;
private final List<PaymentApp> mPendingApps = new ArrayList<>();
- @Nullable private final Supplier<PaymentAppServiceBridge> mPaymentAppServiceBridgeSupplier;
+ private final @Nullable Supplier<PaymentAppServiceBridge> mPaymentAppServiceBridgeSupplier;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private WebContents mWebContents;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private JourneyLogger mJourneyLogger;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private String mTopLevelOrigin;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private String mPaymentRequestOrigin;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private Origin mPaymentRequestSecurityOrigin;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private String mMerchantName;
private boolean mIsOffTheRecord;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private PaymentOptions mPaymentOptions;
private boolean mRequestShipping;
private boolean mRequestPayerName;
private boolean mRequestPayerPhone;
private boolean mRequestPayerEmail;
private int mShippingType;
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private PaymentRequestSpec mSpec;
private boolean mHasClosed;
private boolean mIsFinishedQueryingPaymentApps;
@@ -110,21 +122,22 @@
private boolean mIsShowWaitingForUpdatedDetails;
/** If not empty, use this error message for rejecting PaymentRequest.show(). */
- private String mRejectShowErrorMessage;
+ private @Nullable String mRejectShowErrorMessage;
/** Internal reason for why PaymentRequest.show() should be rejected. */
private @AppCreationFailureReason int mRejectShowErrorReason = AppCreationFailureReason.UNKNOWN;
// mClient is null only when it has closed.
- @Nullable private PaymentRequestClient mClient;
+ private @Nullable PaymentRequestClient mClient;
// mBrowserPaymentRequest is null when it has closed or is uninitiated.
- @Nullable private BrowserPaymentRequest mBrowserPaymentRequest;
+ private @Nullable BrowserPaymentRequest mBrowserPaymentRequest;
/** The helper to create and fill the response to send to the merchant. */
- @Nullable private PaymentResponseHelperInterface mPaymentResponseHelper;
+ private @Nullable PaymentResponseHelperInterface mPaymentResponseHelper;
/** A mapping of the payment method names to the corresponding payment method specific data. */
+ @SuppressWarnings("NullAway.Init") // When init() fails this can have null value
private HashMap<String, PaymentMethodData> mQueryForQuota;
/**
@@ -142,7 +155,7 @@
private boolean mIsCanMakePaymentResponsePending;
private boolean mIsHasEnrolledInstrumentResponsePending;
- @Nullable private PaymentApp mInvokedPaymentApp;
+ private @Nullable PaymentApp mInvokedPaymentApp;
/** True if a show() call is rejected for lack of a user activation. */
private boolean mRejectShowForUserActivation;
@@ -162,7 +175,7 @@
void onHasEnrolledInstrumentReturned();
- void onAppListReady(@Nullable List<PaymentApp> paymentApps, PaymentItem total);
+ void onAppListReady(@Nullable List<PaymentApp> paymentApps, @Nullable PaymentItem total);
void onShippingSectionVisibilityChange(boolean isShippingSectionVisible);
@@ -223,8 +236,7 @@
* returns the package name for Trusted Web Activity. Otherwise returns an empty string
* or null.
*/
- @Nullable
- String getTwaPackageName();
+ @Nullable String getTwaPackageName();
/**
* Gets the WebContents from a RenderFrameHost if the WebContents has not been destroyed;
@@ -234,8 +246,7 @@
* WebContents contains.
* @return The WebContents.
*/
- @Nullable
- default WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
+ default @Nullable WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
return PaymentRequestServiceUtil.getLiveWebContents(renderFrameHost);
}
@@ -318,8 +329,7 @@
*
* @return The instance, can be null for testing.
*/
- @Nullable
- default PaymentAppFactoryInterface createAndroidPaymentAppFactory() {
+ default @Nullable PaymentAppFactoryInterface createAndroidPaymentAppFactory() {
return new AndroidPaymentAppFactory();
}
@@ -327,8 +337,7 @@
* @return The context of the current activity, can be null when WebContents has been
* destroyed, the activity is gone, the window is closed, etc.
*/
- @Nullable
- default Context getContext(RenderFrameHost renderFrameHost) {
+ default @Nullable Context getContext(RenderFrameHost renderFrameHost) {
WindowAndroid window = getWindowAndroid(renderFrameHost);
if (window == null) return null;
return window.getContext().get();
@@ -338,8 +347,7 @@
* @return The WindowAndroid of the current activity, can be null when WebContents has been
* destroyed, the activity is gone, etc.
*/
- @Nullable
- default WindowAndroid getWindowAndroid(RenderFrameHost renderFrameHost) {
+ default @Nullable WindowAndroid getWindowAndroid(RenderFrameHost renderFrameHost) {
WebContents webContents = PaymentRequestServiceUtil.getLiveWebContents(renderFrameHost);
if (webContents == null) return null;
return webContents.getTopLevelNativeWindow();
@@ -435,7 +443,7 @@
* @return Whether the initialization is successful.
*/
public boolean init(
- @Nullable PaymentMethodData[] rawMethodData,
+ PaymentMethodData @Nullable [] rawMethodData,
@Nullable PaymentDetails details,
@Nullable PaymentOptions options) {
if (mRenderFrameHost.getLastCommittedOrigin() == null
@@ -448,11 +456,12 @@
mPaymentRequestOrigin =
mDelegate.formatUrlForSecurityDisplay(mRenderFrameHost.getLastCommittedURL());
- mWebContents = mDelegate.getLiveWebContents(mRenderFrameHost);
- if (mWebContents == null || mWebContents.isDestroyed()) {
+ WebContents webContents = mDelegate.getLiveWebContents(mRenderFrameHost);
+ if (webContents == null || webContents.isDestroyed()) {
abortForInvalidDataFromRenderer(ErrorStrings.NO_WEB_CONTENTS);
return false;
}
+ mWebContents = webContents;
// TODO(crbug.com/41475385): replace UrlFormatter with GURL operations.
mTopLevelOrigin = mDelegate.formatUrlForSecurityDisplay(mWebContents.getLastCommittedUrl());
@@ -585,6 +594,7 @@
return false;
}
PaymentMethodData spcMethodData = methodData.get(MethodStrings.SECURE_PAYMENT_CONFIRMATION);
+ assumeNonNull(spcMethodData);
if (spcMethodData.securePaymentConfirmation == null) return false;
// TODO(crbug.com/40231121): Update checks to match desktop browser-side logic.
@@ -637,12 +647,12 @@
* @return The WebContents of the payment handler that's just opened when the opening is
* successful; null if failed.
*/
- @Nullable
- public static WebContents openPaymentHandlerWindow(GURL url) {
+ public static @Nullable WebContents openPaymentHandlerWindow(GURL url) {
if (sShowingPaymentRequest == null) return null;
PaymentApp invokedPaymentApp = sShowingPaymentRequest.mInvokedPaymentApp;
assert invokedPaymentApp != null;
assert invokedPaymentApp.getPaymentAppType() == PaymentAppType.SERVICE_WORKER_APP;
+ assumeNonNull(sShowingPaymentRequest.mBrowserPaymentRequest);
return sShowingPaymentRequest.mBrowserPaymentRequest.openPaymentHandlerWindow(
url, invokedPaymentApp.getUkmSourceId());
}
@@ -698,8 +708,7 @@
/**
* @return Get the native=side observer, for testing purpose only.
*/
- @Nullable
- public static NativeObserverForTest getNativeObserverForTest() {
+ public static @Nullable NativeObserverForTest getNativeObserverForTest() {
return sNativeObserverForTest;
}
@@ -739,12 +748,14 @@
// Implements PaymentResponseHelper.PaymentResponseResultCallback:
@Override
public void onPaymentResponseReady(PaymentResponse response) {
+ assumeNonNull(mBrowserPaymentRequest);
if (!mBrowserPaymentRequest.patchPaymentResponseIfNeeded(response)) {
disconnectFromClientWithDebugMessage(
ErrorStrings.PAYMENT_APP_INVALID_RESPONSE, PaymentErrorReason.NOT_SUPPORTED);
// Intentionally do not early-return.
}
if (response.methodName.equals(MethodStrings.SECURE_PAYMENT_CONFIRMATION)) {
+ assumeNonNull(mInvokedPaymentApp);
assert mInvokedPaymentApp.getInstrumentMethodNames().contains(response.methodName);
response = mInvokedPaymentApp.setAppSpecificResponseFields(response);
}
@@ -825,13 +836,13 @@
? mSpec.getRawShippingOptions()
: Collections.unmodifiableList(new ArrayList<>());
paymentApp.invokePaymentApp(
- mSpec.getId(),
+ assumeNonNull(mSpec.getId()),
mMerchantName,
mTopLevelOrigin,
mPaymentRequestOrigin,
getCertificateChain(),
Collections.unmodifiableMap(methodData),
- mSpec.getRawTotal(),
+ assumeNonNull(mSpec.getRawTotal()),
mSpec.getRawLineItems(),
Collections.unmodifiableMap(modifiers),
paymentOptions,
@@ -912,8 +923,7 @@
}
}
- @Nullable
- private PaymentNotShownError onShowCalledAndAppsQueried() {
+ private @Nullable PaymentNotShownError onShowCalledAndAppsQueried() {
assert mIsShowCalled;
assert mIsFinishedQueryingPaymentApps;
assert mBrowserPaymentRequest != null;
@@ -989,10 +999,10 @@
*
* @return The error if the payment cannot be made; null otherwise.
*/
- @Nullable
- private PaymentNotShownError ensureHasSupportedPaymentMethods() {
+ private @Nullable PaymentNotShownError ensureHasSupportedPaymentMethods() {
assert mIsShowCalled;
assert mIsFinishedQueryingPaymentApps;
+ assumeNonNull(mBrowserPaymentRequest);
if (!mCanMakePayment || !mBrowserPaymentRequest.hasAvailableApps()) {
// All factories have responded, but none of them have apps. It's possible to add credit
// cards, but the merchant does not support them either. The payment request must be
@@ -1166,12 +1176,14 @@
// Implements PaymentAppFactoryDelegate:
@Override
public DialogController getDialogController() {
+ assumeNonNull(mBrowserPaymentRequest);
return mBrowserPaymentRequest.getDialogController();
}
// Implements PaymentAppFactoryDelegate:
@Override
public AndroidIntentLauncher getAndroidIntentLauncher() {
+ assumeNonNull(mBrowserPaymentRequest);
return mBrowserPaymentRequest.getAndroidIntentLauncher();
}
@@ -1180,8 +1192,7 @@
* @return The validated method data, a mapping of method names to its PaymentMethodData(s);
* when the given method data is invalid, returns null.
*/
- @Nullable
- private static Map<String, PaymentMethodData> getValidatedMethodData(
+ private static @Nullable Map<String, PaymentMethodData> getValidatedMethodData(
PaymentMethodData[] methodDataList) {
// Payment methodData are required.
assert methodDataList != null;
@@ -1228,6 +1239,7 @@
if (!hadUserActivation) {
PaymentRequestWebContentsData paymentRequestWebContentsData =
PaymentRequestWebContentsData.from(mWebContents);
+ assumeNonNull(paymentRequestWebContentsData);
if (paymentRequestWebContentsData.hadActivationlessShow()) {
// Reject the call to show(), because only one activationless show is allowed per
// page.
@@ -1326,13 +1338,14 @@
}
private boolean isPaymentDetailsUpdateValid(PaymentDetails details) {
+ assumeNonNull(mBrowserPaymentRequest);
// ID cannot be updated. Updating the total is optional.
return details.id == null
&& mDelegate.validatePaymentDetails(details)
&& mBrowserPaymentRequest.parseAndValidateDetailsFurtherIfNeeded(details);
}
- private String continueShowWithUpdatedDetails(@Nullable PaymentDetails details) {
+ private @Nullable String continueShowWithUpdatedDetails(@Nullable PaymentDetails details) {
assert mIsShowWaitingForUpdatedDetails;
assert mBrowserPaymentRequest != null;
// mSpec.updateWith() can be used only when mSpec has not been destroyed.
@@ -1406,6 +1419,7 @@
// After a payment app has been invoked, all of the merchant's calls to update the price
// via updateWith() should be forwarded to the invoked app, so it can reflect the
// updated price in its UI.
+ assumeNonNull(mInvokedPaymentApp);
mInvokedPaymentApp.updateWith(
PaymentDetailsConverter.convertToPaymentRequestDetailsUpdate(
details, /* methodChecker= */ this, mInvokedPaymentApp));
@@ -1601,8 +1615,7 @@
/**
* @return An observer for the payment request service, if any; otherwise, null.
*/
- @Nullable
- public static PaymentRequestServiceObserverForTest getObserverForTest() {
+ public static @Nullable PaymentRequestServiceObserverForTest getObserverForTest() {
return sObserverForTest;
}
@@ -1685,7 +1698,7 @@
// PaymentAppFactoryParams implementation.
@Override
- public String getId() {
+ public @Nullable String getId() {
assert !mHasClosed;
assert !mSpec.isDestroyed();
return mSpec.getId();
@@ -1711,8 +1724,8 @@
// PaymentAppFactoryParams implementation.
@Override
- @Nullable
- public byte[][] getCertificateChain() {
+ public byte @Nullable [][] getCertificateChain() {
+ assumeNonNull(mBrowserPaymentRequest);
return mBrowserPaymentRequest.getCertificateChain();
}
@@ -1726,7 +1739,7 @@
// PaymentAppFactoryParams implementation.
@Override
- public PaymentItem getRawTotal() {
+ public @Nullable PaymentItem getRawTotal() {
assert !mHasClosed;
assert !mSpec.isDestroyed();
return mSpec.getRawTotal();
@@ -1758,8 +1771,7 @@
// PaymentAppFactoryParams implementation.
@Override
- @Nullable
- public String getTwaPackageName() {
+ public @Nullable String getTwaPackageName() {
return mDelegate.getTwaPackageName();
}
@@ -1881,8 +1893,7 @@
}
@VisibleForTesting
- @Nullable
- public static BrowserPaymentRequest getBrowserPaymentRequestForTesting() {
+ public static @Nullable BrowserPaymentRequest getBrowserPaymentRequestForTesting() {
return sShowingPaymentRequest != null
? sShowingPaymentRequest.mBrowserPaymentRequest
: null;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
index 4c6ca770..2d96b7a 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestServiceUtil.java
@@ -4,14 +4,15 @@
package org.chromium.components.payments;
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.content_public.browser.RenderFrameHost;
import org.chromium.content_public.browser.Visibility;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.WebContentsStatics;
/** The utility class for PaymentRequestFactory and WebLayerPaymentRequestFactory. */
+@NullMarked
public final class PaymentRequestServiceUtil {
/**
* Gets the WebContents from a RenderFrameHost if the WebContents has not been destroyed;
@@ -20,8 +21,7 @@
* WebContents contains.
* @return The WebContents.
*/
- @Nullable
- public static WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
+ public static @Nullable WebContents getLiveWebContents(RenderFrameHost renderFrameHost) {
WebContents webContents = WebContentsStatics.fromRenderFrameHost(renderFrameHost);
return webContents != null && !webContents.isDestroyed() ? webContents : null;
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
index 9e10b03..f4baeb0 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentRequestWebContentsData.java
@@ -10,6 +10,8 @@
import org.jni_zero.NativeMethods;
import org.chromium.base.UserData;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.content.browser.webcontents.WebContentsImpl;
import org.chromium.content.browser.webcontents.WebContentsImpl.UserDataFactory;
import org.chromium.content_public.browser.WebContents;
@@ -21,8 +23,9 @@
* user activation, which is recorded and tracked by the native PaymentRequestWebContentsManager.
*/
@JNINamespace("payments::android")
+@NullMarked
public class PaymentRequestWebContentsData extends WebContentsObserver implements UserData {
- private static PaymentRequestWebContentsData sInstanceForTesting;
+ private static @Nullable PaymentRequestWebContentsData sInstanceForTesting;
private static final class UserDataFactoryLazyHolder {
private static final UserDataFactory<PaymentRequestWebContentsData> INSTANCE =
@@ -40,7 +43,7 @@
* @param webContents The web contents of the current PaymentRequest.
* @return the PaymentRequestWebContentsData instance.
*/
- public static PaymentRequestWebContentsData from(WebContents webContents) {
+ public static @Nullable PaymentRequestWebContentsData from(WebContents webContents) {
return sInstanceForTesting != null
? sInstanceForTesting
: ((WebContentsImpl) webContents)
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
index 8f0e8f4..d52c00f3 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelper.java
@@ -4,6 +4,7 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.payments.mojom.PayerDetail;
import org.chromium.payments.mojom.PaymentOptions;
import org.chromium.payments.mojom.PaymentResponse;
@@ -13,6 +14,7 @@
* Compared to ChromePaymentResponseHelper, this helper does not handle the Autofill data, and so
* can be used for WebLayerPaymentRequestService.
*/
+@NullMarked
public class PaymentResponseHelper implements PaymentResponseHelperInterface {
private final PaymentResponse mPaymentResponse;
private final PaymentOptions mPaymentOptions;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
index 9159deb..77e38c5 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentResponseHelperInterface.java
@@ -4,12 +4,14 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.payments.mojom.PaymentResponse;
/**
* The interface of a helper class that generates a {@link PaymentResponse} with the input of
* payment details.
*/
+@NullMarked
public interface PaymentResponseHelperInterface {
/**
* Generates a {@link PaymentResponse} with the given payment details.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
index 8d79d62..ff997f72 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentUiServiceTestInterface.java
@@ -4,9 +4,11 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
/** The interface of PaymentUiService that provides testing methods. */
+@NullMarked
public interface PaymentUiServiceTestInterface {
/**
* Get the WebContents of the Payment Handler; return null if nonexistent.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
index 3c720c5..7c917b66 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/PaymentValidator.java
@@ -7,6 +7,7 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.payments.mojom.PaymentDetails;
import org.chromium.payments.mojom.PaymentValidationErrors;
@@ -14,6 +15,7 @@
/** Static class to represent a JNI interface to a C++ validation library. */
@JNINamespace("payments")
+@NullMarked
public class PaymentValidator {
public static boolean validatePaymentDetails(PaymentDetails details) {
if (details == null) {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java b/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
index 770ec639..547198c6 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/SslValidityChecker.java
@@ -7,10 +7,12 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.content_public.browser.WebContents;
/** SSL validity checker. */
@JNINamespace("payments")
+@NullMarked
public class SslValidityChecker {
/**
* Returns a developer-facing error message for invalid SSL certificate state or an empty
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java b/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
index e1c50b6f..68181d1 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/SupportedDelegations.java
@@ -4,11 +4,12 @@
package org.chromium.components.payments;
-import androidx.annotation.Nullable;
-
import org.chromium.base.Log;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
/** This class represents the supported delegations of a service worker based payment app. */
+@NullMarked
public class SupportedDelegations {
private static final String TAG = "SupportedDelegations";
private final boolean mShippingAddress;
@@ -57,7 +58,7 @@
}
public static SupportedDelegations createFromStringArray(
- @Nullable String[] supportedDelegationsNames) throws IllegalArgumentException {
+ String @Nullable [] supportedDelegationsNames) throws IllegalArgumentException {
if (supportedDelegationsNames == null || supportedDelegationsNames.length == 0) {
return new SupportedDelegations();
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java b/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
index d7080ba..9a6a759 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/UrlUtil.java
@@ -7,11 +7,13 @@
import org.jni_zero.JNINamespace;
import org.jni_zero.NativeMethods;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.components.embedder_support.util.UrlConstants;
import org.chromium.url.GURL;
/** URL validity checker for web payment APIs. */
@JNINamespace("payments::android")
+@NullMarked
public class UrlUtil {
/**
* Returns false for invalid URL format or a relative URI.
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java b/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
index 6d44573..e14a584 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/WebAppManifestSection.java
@@ -4,7 +4,10 @@
package org.chromium.components.payments;
+import org.chromium.build.annotations.NullMarked;
+
/** Java equivalent of components/payments/content/web_app_manifest.h:WebAppManifestSection */
+@NullMarked
public final class WebAppManifestSection {
/**
* Constructor that does not set the fingerprints. They have to be set after the object is
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
index 8ed8add..841250e 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/IsReadyToPayServiceHelper.java
@@ -17,9 +17,12 @@
import org.chromium.IsReadyToPayService;
import org.chromium.IsReadyToPayServiceCallback;
import org.chromium.base.metrics.RecordHistogram;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.payments.PrePurchaseQuery;
/** A helper to query the payment app's IsReadyToPay service. */
+@NullMarked
public class IsReadyToPayServiceHelper extends IsReadyToPayServiceCallback.Stub
implements ServiceConnection {
/** The maximum number of milliseconds to wait for a response from a READY_TO_PAY service. */
@@ -31,7 +34,7 @@
private final Context mContext;
// This callback can be used only once, set to null after that.
- private ResultHandler mResultHandler;
+ private @Nullable ResultHandler mResultHandler;
private boolean mIsServiceBindingInitiated;
private boolean mIsServiceConnected;
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
index c9c0885..90c9a710 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelper.java
@@ -122,7 +122,7 @@
public static void parsePaymentResponse(
int resultCode,
Intent data,
- PaymentOptions requestedPaymentOptions,
+ @Nullable PaymentOptions requestedPaymentOptions,
PaymentErrorCallback errorCallback,
PaymentSuccessCallback successCallback) {
if (data == null) {
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
index b884e20..8317376 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperType.java
@@ -115,10 +115,10 @@
/** The class that corresponds mojom.PaymentDetailsModifier, with minimally required fields. */
public static final class PaymentDetailsModifier {
- public final PaymentItem total;
+ public final @Nullable PaymentItem total;
public final PaymentMethodData methodData;
- public PaymentDetailsModifier(PaymentItem total, PaymentMethodData methodData) {
+ public PaymentDetailsModifier(@Nullable PaymentItem total, PaymentMethodData methodData) {
this.total = total;
this.methodData = methodData;
}
diff --git a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
index 877228a..4d531cd 100644
--- a/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
+++ b/components/payments/content/android/java/src/org/chromium/components/payments/intent/WebPaymentIntentHelperTypeConverter.java
@@ -7,8 +7,9 @@
import android.os.Bundle;
import android.text.TextUtils;
-import androidx.annotation.Nullable;
-
+import org.chromium.build.annotations.Contract;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.payments.mojom.AddressErrors;
import org.chromium.payments.mojom.PaymentCurrencyAmount;
import org.chromium.payments.mojom.PaymentDetailsModifier;
@@ -29,34 +30,36 @@
* This class defines the utility functions that convert the payment info types in
* org.chromium.payments.mojom to their counterparts in WebPaymentIntentHelperType.
*/
+@NullMarked
public final class WebPaymentIntentHelperTypeConverter {
- @Nullable
- public static WebPaymentIntentHelperType.PaymentCurrencyAmount fromMojoPaymentCurrencyAmount(
- @Nullable PaymentCurrencyAmount currencyAmount) {
+
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentCurrencyAmount
+ fromMojoPaymentCurrencyAmount(@Nullable PaymentCurrencyAmount currencyAmount) {
if (currencyAmount == null) return null;
return new WebPaymentIntentHelperType.PaymentCurrencyAmount(
/* currency= */ currencyAmount.currency, /* value= */ currencyAmount.value);
}
- @Nullable
- public static WebPaymentIntentHelperType.PaymentItem fromMojoPaymentItem(
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentItem fromMojoPaymentItem(
@Nullable PaymentItem item) {
if (item == null) return null;
return new WebPaymentIntentHelperType.PaymentItem(
fromMojoPaymentCurrencyAmount(item.amount));
}
- @Nullable
- public static WebPaymentIntentHelperType.PaymentDetailsModifier fromMojoPaymentDetailsModifier(
- @Nullable PaymentDetailsModifier detailsModifier) {
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentDetailsModifier
+ fromMojoPaymentDetailsModifier(@Nullable PaymentDetailsModifier detailsModifier) {
if (detailsModifier == null) return null;
return new WebPaymentIntentHelperType.PaymentDetailsModifier(
fromMojoPaymentItem(detailsModifier.total),
fromMojoPaymentMethodData(detailsModifier.methodData));
}
- @Nullable
- public static WebPaymentIntentHelperType.PaymentMethodData fromMojoPaymentMethodData(
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentMethodData fromMojoPaymentMethodData(
@Nullable PaymentMethodData methodData) {
if (methodData == null) return null;
return new WebPaymentIntentHelperType.PaymentMethodData(
@@ -64,9 +67,10 @@
/* stringifiedData= */ methodData.stringifiedData);
}
- @Nullable
- public static Map<String, WebPaymentIntentHelperType.PaymentMethodData>
- fromMojoPaymentMethodDataMap(@Nullable Map<String, PaymentMethodData> methodDataMap) {
+ @Contract("!null -> !null")
+ public static @Nullable
+ Map<String, WebPaymentIntentHelperType.PaymentMethodData> fromMojoPaymentMethodDataMap(
+ @Nullable Map<String, PaymentMethodData> methodDataMap) {
if (methodDataMap == null) return null;
Map<String, WebPaymentIntentHelperType.PaymentMethodData> compatibleMethodDataMap =
new HashMap<>();
@@ -79,10 +83,11 @@
return compatibleMethodDataMap;
}
- @Nullable
- public static Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier>
- fromMojoPaymentDetailsModifierMap(
- @Nullable Map<String, PaymentDetailsModifier> modifiers) {
+ @Contract("!null -> !null")
+ public static @Nullable
+ Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier>
+ fromMojoPaymentDetailsModifierMap(
+ @Nullable Map<String, PaymentDetailsModifier> modifiers) {
if (modifiers == null) return null;
Map<String, WebPaymentIntentHelperType.PaymentDetailsModifier> compatibleModifiers =
new HashMap<>();
@@ -95,8 +100,8 @@
return compatibleModifiers;
}
- @Nullable
- public static List<WebPaymentIntentHelperType.PaymentItem> fromMojoPaymentItems(
+ @Contract("!null -> !null")
+ public static @Nullable List<WebPaymentIntentHelperType.PaymentItem> fromMojoPaymentItems(
@Nullable List<PaymentItem> paymentItems) {
if (paymentItems == null) return null;
List<WebPaymentIntentHelperType.PaymentItem> compatiblePaymentItems = new ArrayList<>();
@@ -107,9 +112,9 @@
return compatiblePaymentItems;
}
- @Nullable
- public static WebPaymentIntentHelperType.PaymentShippingOption fromMojoPaymentShippingOption(
- @Nullable PaymentShippingOption shippingOption) {
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentShippingOption
+ fromMojoPaymentShippingOption(@Nullable PaymentShippingOption shippingOption) {
if (shippingOption == null) return null;
return new WebPaymentIntentHelperType.PaymentShippingOption(
shippingOption.id,
@@ -118,9 +123,10 @@
shippingOption.selected);
}
- @Nullable
- public static List<WebPaymentIntentHelperType.PaymentShippingOption> fromMojoShippingOptionList(
- @Nullable List<PaymentShippingOption> shippingOptions) {
+ @Contract("!null -> !null")
+ public static @Nullable
+ List<WebPaymentIntentHelperType.PaymentShippingOption> fromMojoShippingOptionList(
+ @Nullable List<PaymentShippingOption> shippingOptions) {
if (shippingOptions == null) return null;
List<WebPaymentIntentHelperType.PaymentShippingOption> shippingOptionList =
new ArrayList<>();
@@ -131,8 +137,8 @@
return shippingOptionList;
}
- @Nullable
- public static WebPaymentIntentHelperType.PaymentOptions fromMojoPaymentOptions(
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentOptions fromMojoPaymentOptions(
@Nullable PaymentOptions paymentOptions) {
if (paymentOptions == null) return null;
String shippingType = null;
@@ -157,8 +163,9 @@
shippingType);
}
- @Nullable
- private static Bundle fromMojoShippingAddressErrors(@Nullable AddressErrors addressErrors) {
+ @Contract("!null -> !null")
+ private static @Nullable Bundle fromMojoShippingAddressErrors(
+ @Nullable AddressErrors addressErrors) {
if (addressErrors == null) return null;
Bundle bundle = new Bundle();
putIfNonEmpty("addressLine", addressErrors.addressLine, bundle);
@@ -184,8 +191,8 @@
* @param update The mojo PaymentRequestDetailsUpdate to be converted.
* @return The converted update.
*/
- @Nullable
- public static WebPaymentIntentHelperType.PaymentRequestDetailsUpdate
+ @Contract("!null -> !null")
+ public static WebPaymentIntentHelperType.@Nullable PaymentRequestDetailsUpdate
fromMojoPaymentRequestDetailsUpdate(@Nullable PaymentRequestDetailsUpdate update) {
if (update == null) return null;
return new WebPaymentIntentHelperType.PaymentRequestDetailsUpdate(
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
index 75cf570..4061918 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnController.java
@@ -4,18 +4,21 @@
package org.chromium.components.payments.secure_payment_confirmation;
+import static org.chromium.build.NullUtil.assertNonNull;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
import android.content.Context;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.Pair;
import android.view.View;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.res.ResourcesCompat;
import org.chromium.base.Callback;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
@@ -41,12 +44,16 @@
* component from other components and acts as the point of contact between them. Any code in this
* component that needs to interact with another component does that through this controller.
*/
+@NullMarked
public class SecurePaymentConfirmationAuthnController {
private final WebContents mWebContents;
- private Runnable mHider;
- private Callback<Boolean> mResponseCallback;
- private Runnable mOptOutCallback;
- private SecurePaymentConfirmationAuthnView mView;
+ private @Nullable Runnable mHider;
+
+ private @Nullable Callback<Boolean> mResponseCallback;
+
+ private @Nullable Runnable mOptOutCallback;
+
+ private @Nullable SecurePaymentConfirmationAuthnView mView;
private InputProtector mInputProtector = new InputProtector();
@@ -66,11 +73,12 @@
new BottomSheetContent() {
@Override
public View getContentView() {
+ assumeNonNull(mView);
return mView.getContentView();
}
@Override
- public View getToolbarView() {
+ public @Nullable View getToolbarView() {
return null;
}
@@ -112,7 +120,7 @@
}
@Override
- public @NonNull String getSheetContentDescription(Context context) {
+ public String getSheetContentDescription(Context context) {
return context.getString(
R.string.secure_payment_confirmation_authentication_sheet_description);
}
@@ -139,7 +147,8 @@
*
* @param webContents The WebContents of the merchant.
*/
- public static SecurePaymentConfirmationAuthnController create(WebContents webContents) {
+ public static @Nullable SecurePaymentConfirmationAuthnController create(
+ WebContents webContents) {
return webContents != null
? new SecurePaymentConfirmationAuthnController(webContents)
: null;
@@ -263,7 +272,7 @@
}
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
- public SecurePaymentConfirmationAuthnView getView() {
+ public @Nullable SecurePaymentConfirmationAuthnView getView() {
return mView;
}
@@ -272,12 +281,13 @@
return mHider == null;
}
- private String getStoreLabel(@Nullable String payeeName, @Nullable Origin payeeOrigin) {
+ private String getStoreLabel(
+ @Nullable String payeeName, @Nullable Origin payeeOrigin) {
// At least one of the payeeName and payeeOrigin must be non-null in SPC; this should be
// enforced by PaymentRequestService.isValidSecurePaymentConfirmationRequest.
assert payeeName != null || payeeOrigin != null;
- if (payeeOrigin == null) return payeeName;
+ if (payeeOrigin == null) return assertNonNull(payeeName);
String origin =
UrlFormatter.formatOriginForSecurityDisplay(
@@ -295,6 +305,7 @@
private void onConfirm() {
hide();
+ assumeNonNull(mResponseCallback);
mResponseCallback.onResult(true);
}
@@ -304,6 +315,7 @@
private void onCancel() {
hide();
+ assumeNonNull(mResponseCallback);
mResponseCallback.onResult(false);
}
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
index 80229220..837f5c13 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnProperties.java
@@ -7,6 +7,7 @@
import android.graphics.drawable.Drawable;
import android.util.Pair;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.ui.modelutil.PropertyKey;
import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey;
@@ -14,6 +15,7 @@
* The properties of the SecurePaymentConfirmation Authn UI, which fully describe the state of the
* UI.
*/
+@NullMarked
/* package */ class SecurePaymentConfirmationAuthnProperties {
/** The store value of the UI. */
/* package */ static final ReadableObjectPropertyKey<String> STORE_LABEL =
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
index a1ed0a0..65ba44b9 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnView.java
@@ -14,6 +14,7 @@
import android.widget.ScrollView;
import android.widget.TextView;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.components.payments.R;
import org.chromium.ui.widget.TextViewWithClickableSpans;
@@ -22,6 +23,7 @@
* state. It has a fixed height, which is the height of the visible content area. It shows the
* payment details and provides the option to continue with the payment or to cancel.
*/
+@NullMarked
/* package */ class SecurePaymentConfirmationAuthnView {
/**
* Bundles the information necessary to show the opt out UX, if requested by the caller.
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
index 8e784ea..97d96bd 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnViewBinder.java
@@ -11,6 +11,7 @@
import android.view.View;
import android.view.ViewGroup.LayoutParams;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.components.payments.R;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.modelutil.PropertyKey;
@@ -23,6 +24,7 @@
* The view binder of the SecurePaymentConfirmation Authn UI, which is stateless. It is called to
* bind a given model to a given view. Should contain as little business logic as possible.
*/
+@NullMarked
/* package */ class SecurePaymentConfirmationAuthnViewBinder {
/* package */ static void bind(
PropertyModel model, SecurePaymentConfirmationAuthnView view, PropertyKey propertyKey) {
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
index 615ef1a..7cbd013 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredController.java
@@ -3,12 +3,15 @@
// found in the LICENSE file.
package org.chromium.components.payments.secure_payment_confirmation;
+import static org.chromium.build.NullUtil.assumeNonNull;
+
import android.content.Context;
import android.view.View;
-import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
import org.chromium.components.browser_ui.bottomsheet.BottomSheetControllerProvider;
@@ -28,12 +31,13 @@
* between them. Any code in this component that needs to interact with another component does that
* through this controller.
*/
+@NullMarked
public class SecurePaymentConfirmationNoMatchingCredController {
private final WebContents mWebContents;
- private Runnable mHider;
- private Runnable mResponseCallback;
- private Runnable mOptOutCallback;
- private SecurePaymentConfirmationNoMatchingCredView mView;
+ private @Nullable Runnable mHider;
+ private @Nullable Runnable mResponseCallback;
+ private @Nullable Runnable mOptOutCallback;
+ private @Nullable SecurePaymentConfirmationNoMatchingCredView mView;
private InputProtector mInputProtector = new InputProtector();
@@ -53,11 +57,12 @@
new BottomSheetContent() {
@Override
public View getContentView() {
+ assumeNonNull(mView);
return mView.getContentView();
}
@Override
- public View getToolbarView() {
+ public @Nullable View getToolbarView() {
return null;
}
@@ -99,7 +104,7 @@
}
@Override
- public @NonNull String getSheetContentDescription(Context context) {
+ public String getSheetContentDescription(Context context) {
return context.getString(
R.string
.secure_payment_confirmation_no_matching_credential_sheet_description);
@@ -127,7 +132,7 @@
*
* @param webContents The WebContents of the merchant.
*/
- public static SecurePaymentConfirmationNoMatchingCredController create(
+ public static @Nullable SecurePaymentConfirmationNoMatchingCredController create(
WebContents webContents) {
return webContents != null
? new SecurePaymentConfirmationNoMatchingCredController(webContents)
@@ -223,7 +228,7 @@
}
@VisibleForTesting(otherwise = VisibleForTesting.NONE)
- public SecurePaymentConfirmationNoMatchingCredView getView() {
+ public @Nullable SecurePaymentConfirmationNoMatchingCredView getView() {
return mView;
}
diff --git a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
index ee9f34c..903903a8 100644
--- a/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
+++ b/components/payments/content/android/spc/java/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationNoMatchingCredView.java
@@ -15,6 +15,7 @@
import android.widget.ScrollView;
import android.widget.TextView;
+import org.chromium.build.annotations.NullMarked;
import org.chromium.components.payments.R;
import org.chromium.ui.base.DeviceFormFactor;
import org.chromium.ui.text.ChromeClickableSpan;
@@ -27,6 +28,7 @@
* peeked or half-open state. It has a fixed height, which is the height of the visible content
* area. It informs the user that additional steps are needed to verify the payment.
*/
+@NullMarked
public class SecurePaymentConfirmationNoMatchingCredView {
private final RelativeLayout mContentView;
private final ScrollView mScrollView;
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java
index bd3819bf..e418c786 100644
--- a/url/android/java/src/org/chromium/url/GURL.java
+++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -287,7 +287,7 @@
}
@Override
- public final boolean equals(Object other) {
+ public final boolean equals(@Nullable Object other) {
if (other == this) return true;
if (!(other instanceof GURL)) return false;
return mSpec.equals(((GURL) other).mSpec);