UnownedUserDataKey - A couple simplifications

* Do not loop over attached hosts when given the desired host.
* Rely on unchecked casts rather than storing Class objects.

Change-Id: I705a081e2a4172d3fecc99eca585e4c5f64a57c1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7092879
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
Commit-Queue: Andrew Grieve <agrieve@chromium.org>
Owners-Override: Andrew Grieve <agrieve@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1538327}
diff --git a/base/android/java/src/org/chromium/base/UnownedUserDataHost.java b/base/android/java/src/org/chromium/base/UnownedUserDataHost.java
index dfad009..9fd35f6 100644
--- a/base/android/java/src/org/chromium/base/UnownedUserDataHost.java
+++ b/base/android/java/src/org/chromium/base/UnownedUserDataHost.java
@@ -71,7 +71,7 @@
  * public class Foo {
  *     // Keeping KEY private enforces acquisition by calling #from(), therefore Foo is in control
  *     // of getting the instance.
- *     private static final UnownedUserDataKey<Foo> KEY = new UnownedUserDataKey<>(Foo.class);
+ *     private static final UnownedUserDataKey<Foo> KEY = new UnownedUserDataKey<>();
  *
  *     // The UnownedUserData framework enables this method in particular.
  *     public static Foo from(HolderClass holder) {
@@ -163,7 +163,7 @@
     private @Nullable Handler mHandler;
 
     /** The core data structure within this host. */
-    private @Nullable HashMap<UnownedUserDataKey<?>, WeakReference<?>> mUnownedUserDataMap =
+    private @Nullable HashMap<UnownedUserDataKey<?>, WeakReference<Object>> mUnownedUserDataMap =
             new HashMap<>();
 
     public UnownedUserDataHost() {
@@ -202,19 +202,24 @@
      * @param key the key to use for the object.
      * @return the stored version or {@code null} if it is not stored or has been garbage collected.
      */
-
+    @SuppressWarnings("Unchecked")
     /* package */ <T> @Nullable T get(UnownedUserDataKey<T> key) {
+        if (mUnownedUserDataMap == null) {
+            // After being destroyed, many things still query for their value, so just return null
+            // in this case.
+            return null;
+        }
         checkState();
 
         WeakReference<?> valueWeakRef = mUnownedUserDataMap.get(key);
         if (valueWeakRef == null) return null;
-        T value = key.getValueClass().cast(valueWeakRef.get());
+        Object value = valueWeakRef.get();
         if (value == null) {
             // The object the entry referenced has now been GCed, so remove the entry.
             key.detachFromHost(this);
             return null;
         }
-        return value;
+        return (T) value;
     }
 
     /**
@@ -222,17 +227,22 @@
      *
      * @param key the key to use for the object.
      */
+    @SuppressWarnings("Unchecked")
     /* package */ <T> void remove(UnownedUserDataKey<T> key) {
+        if (mUnownedUserDataMap == null) {
+            // Ensure it is safe for detach listeners to call remove() after onDestroy().
+            return;
+        }
         checkState();
 
-        WeakReference<?> valueWeakRef = mUnownedUserDataMap.remove(key);
+        WeakReference<Object> valueWeakRef = mUnownedUserDataMap.remove(key);
         if (valueWeakRef == null) return;
-        T value = key.getValueClass().cast(valueWeakRef.get());
+        Object value = valueWeakRef.get();
 
         if (value != null) {
             UnownedUserDataListener<T> listener = key.getListener();
             if (listener != null) {
-                mHandler.post(() -> listener.onDetachedFromHost(value, this));
+                mHandler.post(() -> listener.onDetachedFromHost((T) value, this));
             }
         }
     }
diff --git a/base/android/java/src/org/chromium/base/UnownedUserDataKey.java b/base/android/java/src/org/chromium/base/UnownedUserDataKey.java
index c9c26ee..7d47bee 100644
--- a/base/android/java/src/org/chromium/base/UnownedUserDataKey.java
+++ b/base/android/java/src/org/chromium/base/UnownedUserDataKey.java
@@ -30,7 +30,7 @@
  *
  * <pre>{@code
  * public class Foo {
- *     private static final UnownedUserDataKey<Foo> KEY = new UnownedUserDataKey<>(Foo.class);
+ *     private static final UnownedUserDataKey<Foo> KEY = new UnownedUserDataKey<>();
  *     ...
  * }
  * }</pre>
@@ -62,29 +62,19 @@
  */
 @NullMarked
 public final class UnownedUserDataKey<T> {
-    private final Class<T> mClazz;
     private final @Nullable UnownedUserDataListener<T> mListener;
     private final Set<UnownedUserDataHost> mWeakHostAttachments =
             Collections.newSetFromMap(new WeakHashMap<>());
 
-    /**
-     * Constructs a key to use for attaching to a particular {@link UnownedUserDataHost}.
-     *
-     * @param clazz The particular class.
-     */
-    public UnownedUserDataKey(Class<T> clazz) {
-        this(clazz, /* listener= */ null);
+    /** Constructs a key to use for attaching to a particular {@link UnownedUserDataHost}. */
+    public UnownedUserDataKey() {
+        this(null);
     }
 
-    public UnownedUserDataKey(Class<T> clazz, @Nullable UnownedUserDataListener<T> listener) {
-        mClazz = clazz;
+    public UnownedUserDataKey(@Nullable UnownedUserDataListener<T> listener) {
         mListener = listener;
     }
 
-    /* package */ Class<T> getValueClass() {
-        return mClazz;
-    }
-
     /* package */ @Nullable UnownedUserDataListener<T> getListener() {
         return mListener;
     }
@@ -113,13 +103,12 @@
      * @return The current stored in the {@code host}, or {@code null}.
      */
     public @Nullable T retrieveDataFromHost(UnownedUserDataHost host) {
-        assertNoDestroyedAttachments();
-        for (UnownedUserDataHost attachedHost : mWeakHostAttachments) {
-            if (host == attachedHost) {
-                return host.get(this);
-            }
+        if (BuildConfig.IS_FOR_TEST && host == null) {
+            // Happens when tests use "@Mock WebContents".
+            return null;
         }
-        return null;
+        assertNoDestroyedAttachments();
+        return host.get(this);
     }
 
     /**
@@ -130,11 +119,8 @@
      */
     public void detachFromHost(UnownedUserDataHost host) {
         assertNoDestroyedAttachments();
-        for (UnownedUserDataHost attachedHost : new ArrayList<>(mWeakHostAttachments)) {
-            if (host == attachedHost) {
-                removeHostAttachment(attachedHost);
-            }
-        }
+        host.remove(this);
+        mWeakHostAttachments.remove(host);
     }
 
     /**
@@ -145,9 +131,9 @@
      */
     public void detachFromAllHosts(T object) {
         assertNoDestroyedAttachments();
-        for (UnownedUserDataHost attachedHost : new ArrayList<>(mWeakHostAttachments)) {
-            if (object.equals(attachedHost.get(this))) {
-                removeHostAttachment(attachedHost);
+        for (UnownedUserDataHost host : new ArrayList<>(mWeakHostAttachments)) {
+            if (object.equals(host.get(this))) {
+                detachFromHost(host);
             }
         }
     }
@@ -182,11 +168,6 @@
         return ret;
     }
 
-    private void removeHostAttachment(UnownedUserDataHost host) {
-        host.remove(this);
-        mWeakHostAttachments.remove(host);
-    }
-
     private void assertNoDestroyedAttachments() {
         if (BuildConfig.ENABLE_ASSERTS) {
             for (UnownedUserDataHost attachedHost : mWeakHostAttachments) {
diff --git a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
index ec3c8e6..3a007b5 100644
--- a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
+++ b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
@@ -80,12 +80,10 @@
     }
 
     private static final UnownedUserDataKey<TestUnownedUserData> KEY1 =
-            new UnownedUserDataKey<>(
-                    TestUnownedUserData.class, TestUnownedUserData::onDetachedFromHost);
+            new UnownedUserDataKey<>(TestUnownedUserData::onDetachedFromHost);
 
     private static final UnownedUserDataKey<TestUnownedUserData> KEY2 =
-            new UnownedUserDataKey<>(
-                    TestUnownedUserData.class, TestUnownedUserData::onDetachedFromHost);
+            new UnownedUserDataKey<>(TestUnownedUserData::onDetachedFromHost);
 
     private final TestUnownedUserData mFoo = new TestUnownedUserData();
     private final TestUnownedUserData mBar = new TestUnownedUserData();
@@ -175,11 +173,9 @@
     @Test
     public void testSingleItemSingleHost_differentKeys() {
         UnownedUserDataKey<TestUnownedUserData> extraKey =
-                new UnownedUserDataKey<>(
-                        TestUnownedUserData.class, TestUnownedUserData::onDetachedFromHost);
+                new UnownedUserDataKey<>(TestUnownedUserData::onDetachedFromHost);
         UnownedUserDataKey<TestUnownedUserData> anotherExtraKey =
-                new UnownedUserDataKey<>(
-                        TestUnownedUserData.class, TestUnownedUserData::onDetachedFromHost);
+                new UnownedUserDataKey<>(TestUnownedUserData::onDetachedFromHost);
 
         KEY1.attachToHost(mHost1, mFoo);
         extraKey.attachToHost(mHost1, mFoo);
diff --git a/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java b/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java
index 0472029..c53e567a 100644
--- a/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java
+++ b/base/android/junit/src/org/chromium/base/supplier/UnownedUserDataSupplierTest.java
@@ -24,8 +24,7 @@
     /** Serves as an example concrete class for {@link UnownedUserDataSupplier}. */
     static class TestUnownedUserDataSupplier extends UnownedUserDataSupplier<String> {
         private static final UnownedUserDataKey<TestUnownedUserDataSupplier> KEY =
-                new UnownedUserDataKey<TestUnownedUserDataSupplier>(
-                        TestUnownedUserDataSupplier.class);
+                new UnownedUserDataKey<TestUnownedUserDataSupplier>();
 
         /** Use this pattern to mock the {@link UnownedUserDataSupplier} for testing. */
         private static TestUnownedUserDataSupplier sInstanceForTesting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerSupplier.java
index c32cd81..dcce2c33 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerSupplier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerSupplier.java
@@ -19,7 +19,7 @@
 public class ContextualSearchManagerSupplier
         extends UnownedUserDataSupplier<ContextualSearchManager> {
     private static final UnownedUserDataKey<ContextualSearchManagerSupplier> KEY =
-            new UnownedUserDataKey<>(ContextualSearchManagerSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Return {@link ContextualSearchManager} supplier associated with the given {@link
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/ActivityDisplayCutoutModeSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/ActivityDisplayCutoutModeSupplier.java
index 4042937..22459ee 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/ActivityDisplayCutoutModeSupplier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/ActivityDisplayCutoutModeSupplier.java
@@ -22,7 +22,7 @@
 public class ActivityDisplayCutoutModeSupplier extends UnownedUserDataSupplier<Integer> {
     /** The key for accessing this object on an {@link org.chromium.base.UnownedUserDataHost}. */
     private static final UnownedUserDataKey<ActivityDisplayCutoutModeSupplier> KEY =
-            new UnownedUserDataKey<>(ActivityDisplayCutoutModeSupplier.class);
+            new UnownedUserDataKey<>();
 
     private static @Nullable ObservableSupplierImpl<Integer> sInstanceForTesting;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier.java
index 9526591..ea04147c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerSupplier.java
@@ -19,7 +19,7 @@
 public class BrowserControlsManagerSupplier
         extends UnownedUserDataSupplier<BrowserControlsManager> {
     private static final UnownedUserDataKey<BrowserControlsManagerSupplier> KEY =
-            new UnownedUserDataKey<>(BrowserControlsManagerSupplier.class);
+            new UnownedUserDataKey<>();
 
     /** Return {@link TabModelSelector} supplier associated with the given {@link WindowAndroid}. */
     public static @Nullable ObservableSupplier<BrowserControlsManager> from(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier.java
index 8d8dc58..23d9f253 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreviewHelperSupplier.java
@@ -19,7 +19,7 @@
 public class StartupPaintPreviewHelperSupplier
         extends UnownedUserDataSupplier<StartupPaintPreviewHelper> {
     private static final UnownedUserDataKey<StartupPaintPreviewHelperSupplier> KEY =
-            new UnownedUserDataKey<>(StartupPaintPreviewHelperSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Return {@link StartupPaintPreviewHelper} supplier associated with the given {@link
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
index cf6e702e..ae98d09 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncErrorMessage.java
@@ -71,7 +71,7 @@
     private static @Nullable MessageDispatcher sMessageDispatcherForTesting;
 
     private static final UnownedUserDataKey<SyncErrorMessage> SYNC_ERROR_MESSAGE_KEY =
-            new UnownedUserDataKey<>(SyncErrorMessage.class);
+            new UnownedUserDataKey<>();
     private static final String PASSWORDS_SYNC_ERROR_MESSAGE_VERSION_PARAM_NAME = "version";
     private static final String TAG = "SyncErrorMessage";
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayController.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayController.java
index 25062e2..b1cc2d5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayController.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/MediaCaptureOverlayController.java
@@ -25,7 +25,7 @@
 @NullMarked
 public class MediaCaptureOverlayController {
     private static final UnownedUserDataKey<MediaCaptureOverlayController> KEY =
-            new UnownedUserDataKey<>(MediaCaptureOverlayController.class);
+            new UnownedUserDataKey<>();
 
     private final CaptureOverlayTabObserver mTabObserver = new CaptureOverlayTabObserver();
 
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTabProvider.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTabProvider.java
index c504717e..46af181 100644
--- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTabProvider.java
+++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTabProvider.java
@@ -12,8 +12,7 @@
 /** Provides the {@link NewDownloadTab} attached to a given {@link WindowAndroid}. */
 @NullMarked
 public class NewDownloadTabProvider {
-    private static final UnownedUserDataKey<NewDownloadTab> KEY =
-            new UnownedUserDataKey<>(NewDownloadTab.class);
+    private static final UnownedUserDataKey<NewDownloadTab> KEY = new UnownedUserDataKey<>();
 
     /**
      * @param windowAndroid The {@link WindowAndroid} the {@link NewDownloadTab} is attached to.
diff --git a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
index e3bd4b14..6e08ea3c 100644
--- a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
+++ b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
@@ -34,7 +34,7 @@
     // Share SoftwareDraw in order to share a single java Bitmap across all tabs in a window
     // as the tab size won't change inside one single window.
     private static final UnownedUserDataKey<NativePageBitmapCapturer> CAPTURER_KEY =
-            new UnownedUserDataKey<>(NativePageBitmapCapturer.class);
+            new UnownedUserDataKey<>();
     private static final float SCALE = 1;
 
     private static boolean sIgnoreCurrentUrlCheck;
diff --git a/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier.java b/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier.java
index b6ca9599..c24294b 100644
--- a/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier.java
+++ b/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentSupplier.java
@@ -19,7 +19,7 @@
 public class ManualFillingComponentSupplier
         extends UnownedUserDataSupplier<ManualFillingComponent> {
     private static final UnownedUserDataKey<ManualFillingComponentSupplier> KEY =
-            new UnownedUserDataKey<>(ManualFillingComponentSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Return {@link ManualFillingComponent} supplier associated with the given {@link
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
index 4ccbaf5..31318492 100644
--- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
+++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/permissions/NotificationPermissionController.java
@@ -113,7 +113,7 @@
     }
 
     private static final UnownedUserDataKey<NotificationPermissionController> KEY =
-            new UnownedUserDataKey<>(NotificationPermissionController.class);
+            new UnownedUserDataKey<>();
 
     private final AndroidPermissionDelegate mAndroidPermissionDelegate;
     private final Supplier<RationaleDelegate> mRationaleDelegateSupplier;
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/CctPasswordSavingMetricsRecorderBridge.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/CctPasswordSavingMetricsRecorderBridge.java
index 23cd4be..eae9468 100644
--- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/CctPasswordSavingMetricsRecorderBridge.java
+++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/CctPasswordSavingMetricsRecorderBridge.java
@@ -20,7 +20,7 @@
 @NullMarked
 public class CctPasswordSavingMetricsRecorderBridge implements WindowAndroid.ActivityStateObserver {
     public static final UnownedUserDataKey<CctPasswordSavingMetricsRecorderBridge> KEY =
-            new UnownedUserDataKey<>(CctPasswordSavingMetricsRecorderBridge.class);
+            new UnownedUserDataKey<>();
 
     static final String SUBMISSION_TO_REDIRECT_TIME_HISTOGRAM =
             "PasswordManager.CctFormSubmissionToRedirectTime";
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerSupplier.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerSupplier.java
index 5e7deef..08e85e8 100644
--- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerSupplier.java
+++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerSupplier.java
@@ -18,7 +18,7 @@
 @NullMarked
 public class ReadAloudControllerSupplier extends UnownedUserDataSupplier<ReadAloudController> {
     private static final UnownedUserDataKey<ReadAloudControllerSupplier> KEY =
-            new UnownedUserDataKey<>(ReadAloudControllerSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Return {@link ReadAloudController} supplier associated with the given {@link WindowAndroid}.
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegateSupplier.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegateSupplier.java
index 641410d..2e3008b 100644
--- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegateSupplier.java
+++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/ShareDelegateSupplier.java
@@ -18,8 +18,7 @@
  */
 @NullMarked
 public class ShareDelegateSupplier extends UnownedUserDataSupplier<ShareDelegate> {
-    private static final UnownedUserDataKey<ShareDelegateSupplier> KEY =
-            new UnownedUserDataKey<>(ShareDelegateSupplier.class);
+    private static final UnownedUserDataKey<ShareDelegateSupplier> KEY = new UnownedUserDataKey<>();
 
     private static @Nullable ShareDelegateSupplier sInstanceForTesting;
 
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObscuringHandlerSupplier.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObscuringHandlerSupplier.java
index c178283..41c3796 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObscuringHandlerSupplier.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObscuringHandlerSupplier.java
@@ -18,7 +18,7 @@
 @NullMarked
 public class TabObscuringHandlerSupplier extends UnownedUserDataSupplier<TabObscuringHandler> {
     private static final UnownedUserDataKey<TabObscuringHandlerSupplier> KEY =
-            new UnownedUserDataKey<>(TabObscuringHandlerSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Retrieves an {@link ObservableSupplier} from the given host. Real implementations should use
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
index 509c10a..c5ceea0b 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
@@ -32,8 +32,7 @@
      */
     public interface PublisherUrlVisibility {
         /** The key for accessing this object on an {@link UnownedUserDataHost}. */
-        UnownedUserDataKey<PublisherUrlVisibility> KEY =
-                new UnownedUserDataKey<>(PublisherUrlVisibility.class);
+        UnownedUserDataKey<PublisherUrlVisibility> KEY = new UnownedUserDataKey<>();
 
         /**
          * Get the Activity's {@link PublisherUrlVisibility} from the provided {@link
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier.java
index 751f462..f7e198bd 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorSupplier.java
@@ -21,7 +21,7 @@
 @NullMarked
 public class TabModelSelectorSupplier extends UnownedUserDataSupplier<TabModelSelector> {
     private static final UnownedUserDataKey<TabModelSelectorSupplier> KEY =
-            new UnownedUserDataKey<>(TabModelSelectorSupplier.class);
+            new UnownedUserDataKey<>();
     private static @Nullable ObservableSupplierImpl<TabModelSelector> sInstanceForTesting;
 
     /** Return {@link TabModelSelector} supplier associated with the given {@link WindowAndroid}. */
diff --git a/chrome/browser/ui/android/ephemeraltab/java/src/org/chromium/chrome/browser/ephemeraltab/EphemeralTabCoordinatorSupplier.java b/chrome/browser/ui/android/ephemeraltab/java/src/org/chromium/chrome/browser/ephemeraltab/EphemeralTabCoordinatorSupplier.java
index cfee459..9eac6e2f 100644
--- a/chrome/browser/ui/android/ephemeraltab/java/src/org/chromium/chrome/browser/ephemeraltab/EphemeralTabCoordinatorSupplier.java
+++ b/chrome/browser/ui/android/ephemeraltab/java/src/org/chromium/chrome/browser/ephemeraltab/EphemeralTabCoordinatorSupplier.java
@@ -21,7 +21,7 @@
 public class EphemeralTabCoordinatorSupplier
         extends UnownedUserDataSupplier<EphemeralTabCoordinator> {
     private static final UnownedUserDataKey<EphemeralTabCoordinatorSupplier> KEY =
-            new UnownedUserDataKey<>(EphemeralTabCoordinatorSupplier.class);
+            new UnownedUserDataKey<>();
     private static @Nullable ObservableSupplierImpl<EphemeralTabCoordinator> sInstanceForTesting;
 
     /**
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java
index 52b5b4e..3c42df4 100644
--- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java
+++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/LayoutManagerProvider.java
@@ -19,10 +19,11 @@
     interface Unowned extends LayoutManager {}
 
     /** The key used to bind the LayoutManager to the unowned data host. */
-    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>(Unowned.class);
+    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>();
 
     /**
      * Get the shared {@link LayoutManager} from the provided {@link WindowAndroid}.
+     *
      * @param windowAndroid The window to pull the LayoutManager from.
      * @return A shared instance of a {@link LayoutManager}.
      */
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider.java
index 0d1f31e..ae1e5dd 100644
--- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider.java
+++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarManagerProvider.java
@@ -16,8 +16,7 @@
 @NullMarked
 public class SnackbarManagerProvider {
     /** The key for accessing this object on an {@link org.chromium.base.UnownedUserDataHost}. */
-    private static final UnownedUserDataKey<SnackbarManager> KEY =
-            new UnownedUserDataKey<>(SnackbarManager.class);
+    private static final UnownedUserDataKey<SnackbarManager> KEY = new UnownedUserDataKey<>();
 
     /**
      * Get the activity's main {@link SnackbarManager} from the provided {@link WindowAndroid}.
diff --git a/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider.java b/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider.java
index 4c6bfdf..2498e1d 100644
--- a/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider.java
+++ b/components/browser_ui/bottomsheet/android/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetControllerProvider.java
@@ -21,7 +21,7 @@
     interface Unowned extends BottomSheetController {}
 
     /** The key used to bind the controller to the unowned data host. */
-    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>(Unowned.class);
+    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>();
 
     /**
      * Get the shared {@link BottomSheetController} from the provided {@link WindowAndroid}.
diff --git a/components/browser_ui/device_lock/android/java/src/org/chromium/components/browser_ui/device_lock/DeviceLockActivityLauncherSupplier.java b/components/browser_ui/device_lock/android/java/src/org/chromium/components/browser_ui/device_lock/DeviceLockActivityLauncherSupplier.java
index 95f68d83..1ac18ed0 100644
--- a/components/browser_ui/device_lock/android/java/src/org/chromium/components/browser_ui/device_lock/DeviceLockActivityLauncherSupplier.java
+++ b/components/browser_ui/device_lock/android/java/src/org/chromium/components/browser_ui/device_lock/DeviceLockActivityLauncherSupplier.java
@@ -19,7 +19,7 @@
 public class DeviceLockActivityLauncherSupplier
         extends UnownedUserDataSupplier<DeviceLockActivityLauncher> {
     private static final UnownedUserDataKey<DeviceLockActivityLauncherSupplier> KEY =
-            new UnownedUserDataKey<>(DeviceLockActivityLauncherSupplier.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Return {@link DeviceLockActivityLauncher} supplier associated with the given {@link
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
index fd61814..8209620 100644
--- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
+++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareHelper.java
@@ -164,8 +164,7 @@
     /** BroadcastReceiver to record the chosen component when sharing an Intent. */
     public static class TargetChosenReceiver extends BroadcastReceiver implements IntentCallback {
         private static final UnownedUserDataKey<TargetChosenReceiver> TARGET_CHOSEN_RECEIVER_KEY =
-                new UnownedUserDataKey<>(
-                        TargetChosenReceiver.class, TargetChosenReceiver::onDetachedFromHost);
+                new UnownedUserDataKey<>(TargetChosenReceiver::onDetachedFromHost);
         private @Nullable TargetChosenCallback mCallback;
         private WeakReference<Context> mAttachedContext;
         private WeakReference<WindowAndroid> mAttachedWindow;
diff --git a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
index fdd971d..961e895 100644
--- a/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
+++ b/components/messages/android/java/src/org/chromium/components/messages/MessageDispatcherProvider.java
@@ -19,7 +19,7 @@
     interface Unowned extends MessageDispatcher {}
 
     /** The key used to bind the MessageDispatcher to the unowned data host. */
-    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>(Unowned.class);
+    private static final UnownedUserDataKey<Unowned> KEY = new UnownedUserDataKey<>();
 
     /**
      * Retrieves the shared MessageDispatcher from the provided WindowAndroid. Returns null if
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetControllerProvider.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetControllerProvider.java
index 793184b..7b00f96 100644
--- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetControllerProvider.java
+++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetControllerProvider.java
@@ -25,7 +25,7 @@
 public class PwaBottomSheetControllerProvider {
     /** The key used to bind the controller to the unowned data host. */
     private static final UnownedUserDataKey<PwaBottomSheetController> KEY =
-            new UnownedUserDataKey<>(PwaBottomSheetController.class);
+            new UnownedUserDataKey<>();
 
     /**
      * Get the shared {@link PwaBottomSheetController} from the provided {@link WindowAndroid}.
diff --git a/content/public/android/java/src/org/chromium/content/browser/device_posture/WindowLayoutInfoListener.java b/content/public/android/java/src/org/chromium/content/browser/device_posture/WindowLayoutInfoListener.java
index 8d9fc7c..f112bf7 100644
--- a/content/public/android/java/src/org/chromium/content/browser/device_posture/WindowLayoutInfoListener.java
+++ b/content/public/android/java/src/org/chromium/content/browser/device_posture/WindowLayoutInfoListener.java
@@ -28,8 +28,7 @@
 @NullMarked
 public class WindowLayoutInfoListener {
     private static final UnownedUserDataKey<WindowLayoutInfoListener> KEY =
-            new UnownedUserDataKey<>(
-                    WindowLayoutInfoListener.class, WindowLayoutInfoListener::onDetachedFromHost);
+            new UnownedUserDataKey<>(WindowLayoutInfoListener::onDetachedFromHost);
     private final Consumer<WindowLayoutInfo> mWindowLayoutInfoChangedCallback;
     private @Nullable WindowAndroid mWindowAndroid;
     private final ObserverList<DevicePosturePlatformProviderAndroid> mObservers =
diff --git a/ui/edge_to_edge/android/java/src/org/chromium/ui/edge_to_edge/EdgeToEdgeStateProvider.java b/ui/edge_to_edge/android/java/src/org/chromium/ui/edge_to_edge/EdgeToEdgeStateProvider.java
index 66e068a..240c451 100644
--- a/ui/edge_to_edge/android/java/src/org/chromium/ui/edge_to_edge/EdgeToEdgeStateProvider.java
+++ b/ui/edge_to_edge/android/java/src/org/chromium/ui/edge_to_edge/EdgeToEdgeStateProvider.java
@@ -26,7 +26,7 @@
 @NullMarked
 public class EdgeToEdgeStateProvider extends ObservableSupplierImpl<Boolean> {
     private static final UnownedUserDataKey<EdgeToEdgeStateProvider> KEY =
-            new UnownedUserDataKey<>(EdgeToEdgeStateProvider.class);
+            new UnownedUserDataKey<>();
     private final TokenHolder mTokenHolder = new TokenHolder(this::onTokenUpdate);
     private final Window mWindow;